Làm sao để chèn ảnh vào sheet?

Liên hệ QC

ladykiller81

Thành viên chính thức
Tham gia
13/7/08
Bài viết
69
Được thích
3
Mình có 1 file báo cáo gồm nhiều sheet và có 1 vị trí muốn chèn hình ảnh 1 cách tự động và format kich thước của ảnh nằm trong ô đó (nếu đc thì nhỏ hơn kích thước của ô 1 chút) , tên của từng ảnh mình đã sắp xếp trùng với tên của từng sheet trong file đc để trong 1 thư mục. Nhờ các bạn chỉ giúp xin cảm ơn!
 
Mình có 1 file báo cáo gồm nhiều sheet và có 1 vị trí muốn chèn hình ảnh 1 cách tự động và format kich thước của ảnh nằm trong ô đó (nếu đc thì nhỏ hơn kích thước của ô 1 chút) , tên của từng ảnh mình đã sắp xếp trùng với tên của từng sheet trong file đc để trong 1 thư mục. Nhờ các bạn chỉ giúp xin cảm ơn!
Xem thử bài này:
http://www.giaiphapexcel.com/forum/showthread.php?t=3721
 
Các bài viết trong bài này không giống như yêu cầu trong báo cáo của em. Để em gửi file lên để các anh chị giúp đỡ. Trong file có 3 sheet tên 273, 274, 275 (số lượng sheet không giới hạn tùy theo ngày ít hay nhiều) và em cũng đã có các file hình ảnh với các tên như thế, khi nhấn 1 nút nào đó thì hình ảnh sẽ tự dộng chèn vào vị trí em mong muốn giống như trong file. Xin cảm ơn!
(Sorry mọi người e quên attach file!)
 

File đính kèm

  • insert anh.xls
    72 KB · Đọc: 125
Lần chỉnh sửa cuối:
Các bài viết trong bài này không giống như yêu cầu trong báo cáo của em. Để em gửi file lên để các anh chị giúp đỡ. Trong file có 3 sheet tên 273, 274, 275 (số lượng sheet không giới hạn tùy theo ngày ít hay nhiều) và em cũng đã có các file hình ảnh với các tên như thế, khi nhấn 1 nút nào đó thì hình ảnh sẽ tự dộng chèn vào vị trí em mong muốn giống như trong file. Xin cảm ơn!
(Sorry mọi người e quên attach file!)
Yêu cầu này càng dể!
Tôi làm cho bạn đây! Xem file đính kèm
Trong file này bạn không cần làm gì cả, chỉ cần chọn vào bất kỳ sheet nào thì lập tức có 1 hình tương ứng với tên sheet sẽ được chèn với đúng vị trí
PHP:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
  Application.ScreenUpdating = False
  On Error Resume Next
  With ActiveSheet
    If .Name <> "report" Then
      .Shapes(.Name).Delete
      With .Pictures.Insert(ThisWorkbook.Path & "\" & .Name & ".jpg")
        .Name = ActiveSheet.Name
        .Left = Range("C12:O32").Left: .Top = Range("C12:O32").Top
        .Width = Range("C12:O32").Width: .Height = Range("C12:O32").Height
      End With
    End If
  End With
  Application.ScreenUpdating = True
End Sub

Yêu cầu:

1> Bạn phải đặt tên hình phải trùng với tên sheet
2> File hình và file Excel phải nằm cùng 1 thư mục
Lưu ý:
Với số lượng sheet lớn thì file Excel sẽ khá nặng (vì chứa nhiều hình)
 

File đính kèm

  • InsetPic.rar
    353.8 KB · Đọc: 334
Em cảm ơn bác ndu96081631 nhiều, bác đúng là siêu thật. File bác làm cho e thì ok rồi nhưng em cần thêm chút yêu cầu nhỏ trong file đó, e muốn hình tự điều chỉnh kích thước nằm vừa trong vị trí cần chèn có thể nhỏ hơn 1 chút. Vì công việc hàng ngày nhiều lắm e không có thời gian điều chỉnh. Bác ndu96081631 giúp e nhe. Thanks!
 
Em cảm ơn bác ndu96081631 nhiều, bác đúng là siêu thật. File bác làm cho e thì ok rồi nhưng em cần thêm chút yêu cầu nhỏ trong file đó, e muốn hình tự điều chỉnh kích thước nằm vừa trong vị trí cần chèn có thể nhỏ hơn 1 chút. Vì công việc hàng ngày nhiều lắm e không có thời gian điều chỉnh. Bác ndu96081631 giúp e nhe. Thanks!
Chỉnh vị trị hình là code này:
PHP:
.Left = Range("C12:O32").Left: .Top = Range("C12:O32").Top
Ở đây đang chỉnh:
- Cạnh trái của hình = cạnh trái của vùng C12:O32
- Cạnh trên của hình = cạnh trên của vùng C12:O32
Còn chỉnh kích thước hình là code này:
PHP:
.Width = Range("C12:O32").Width: .Height = Range("C12:O32").Height
Ở đây đang chỉnh:
- Chiều rộng hình = chiều rộng vùng C12:O32
- Chiều cao hình = chiều cao vùng C12:O32
---------------
Vậy bạn muốn chỉnh thế nào thì có thể tự chỉnh lại theo ý!
Nhưng tôi nghĩ cách dể nhất là bạn định sẳn luôn vùng chứa hình, ví dụ có thể thay C12:O32 thành D13:N31 ---> Như vậy hình sẽ nằm chính xác trong vùng D13:N31, tức nhỏ hơn vùng C12:O32 1 tí
Bạn mở file lên, bấm Alt + F11, thay code củ thành code mới này xem:
PHP:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
  Application.ScreenUpdating = False
  On Error Resume Next
  If Sh.Name <> "report" Then
    Sh.Shapes(Sh.Name).Delete
    With Sh.Pictures.Insert(ThisWorkbook.Path & "\" & Sh.Name & ".jpg")
      .Name = Sh.Name
      .Left = Range("D13:N31").Left: .Top = Range("D13:N31").Top
      .Width = Range("D13:N31").Width: .Height = Range("D13:N31").Height
    End With
  End If
  Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Thanks bác ndu96081631 nhiều nhiều nhe. Để e thử xem sao? chúc các bác sức khỏe nhe.
Chào bạn!
Sau khi xem kỹ lại file của bạn, tôi cảm thấy hầu như tất cả các sheet đều có cấu trúc giống nhau (ngoại trừ sheet report) ---> Vậy ta cần gì tạo ra nhiều sheet thế kia? Tôi nghĩ chỉ cần thêm 1 sheet nữa là đủ ---> Cần thông tin nào, ta hãy chọn nó bằng Validation thì nó sẽ trích ra tất cả
Bạn xem file đính kèm này nhé!
Nếu làm như tôi nói bạn sẽ có cái lợi:
- Cần thông tin nào, lấy ra thông tin nấy mà chẳng cần nhiều sheet
- Dung lượng file sẽ nhỏ đi rất nhiều vì tại 1 thời điểm, ta chỉ có duy nhất 1 tấm hình được chèn vào (điều này dể nhận ra khi bạn so sánh với file có từ 10 sheet trở lên)
Code như sau:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address = "$N$4" Then
    Application.ScreenUpdating = False
    On Error Resume Next
    Me.Shapes("Pic").Delete
    With Me.Pictures.Insert(ThisWorkbook.Path & "\" & Target & ".jpg")
      .Name = "Pic"
      .Left = [D13:N31].Left: .Top = [D13:N31].Top
      .Width = [D13:N31].Width: .Height = [D13:N31].Height
    End With
    Application.ScreenUpdating = True
  End If
End Sub
--------------
Trong file tôi dùng hàm VLOOKUP để lấy thông tin (mục đích cho bạn tiện theo dỏi) ---> Nếu cần thiết ta có thể tự động hóa hoàn toàn bằng VBA... nghĩa là lấy thông tin bằng code VBA mà không cần dùng đến bất cứ công thức nào
Hãy xem file, nếu đồng ý ta cải tiến tiếp
 

File đính kèm

  • InsetPic.rar
    336.6 KB · Đọc: 196
Lần chỉnh sửa cuối:
Chào bạn!
Sau khi xem kỹ lại file của bạn, tôi cảm thấy hầu như tất cả các sheet đều có cấu trúc giống nhau (ngoại trừ sheet report) ---> Vậy ta cần gì tạo ra nhiều sheet thế kia? Tôi nghĩ chỉ cần thêm 1 sheet nữa là đủ ---> Cần thông tin nào, ta hãy chọn nó bằng Validation thì nó sẽ trích ra tất cả
Bạn xem file đính kèm này nhé!
Nếu làm như tôi nói bạn sẽ có cái lợi:
- Cần thông tin nào, lấy ra thông tin nấy mà chẳng cần nhiều sheet
- Dung lượng file sẽ nhỏ đi rất nhiều vì tại 1 thời điểm, ta chỉ có duy nhất 1 tấm hình được chèn vào (điều này dể nhận ra khi bạn so sánh với file có từ 10 sheet trở lên)
Code như sau:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Address = "$N$4" Then
    Application.ScreenUpdating = False
    On Error Resume Next
    Me.Shapes("Pic").Delete
    With Me.Pictures.Insert(ThisWorkbook.Path & "\" & Target & ".jpg")
      .Name = "Pic"
      .Left = [D13:N31].Left: .Top = [D13:N31].Top
      .Width = [D13:N31].Width: .Height = [D13:N31].Height
    End With
    Application.ScreenUpdating = True
  End If
End Sub
--------------
Trong file tôi dùng hàm VLOOKUP để lấy thông tin (mục đích cho bạn tiện theo dỏi) ---> Nếu cần thiết ta có thể tự động hóa hoàn toàn bằng VBA... nghĩa là lấy thông tin bằng code VBA mà không cần dùng đến bất cứ công thức nào
Hãy xem file, nếu đồng ý ta cải tiến tiếp
Em đã hiểu ý của bác rồi, nhưng vấn đề của e ở đây là cái kich thước của hình nó k cùng tỉ lệ với vị trí mong muốn ( vì cái file hình đc xuất ra từ chương trinh khác không điều chỉnh đc kích thước) e nghỉ như thế này không biết bác có giúp e đc k?! e muốn chiều rộng của hình bằng 1.2 lần chiều cao sau khi chèn vào, hoặc có cáh nào cắt bớt hình cho nhỏ lại và dùng border cho picture một cách tự động k? (E có để 2 hình 273.jpg và 274.jpg để tiện so sánh)
 

File đính kèm

  • InsetPic.rar
    611.2 KB · Đọc: 94
Em đã hiểu ý của bác rồi, nhưng vấn đề của e ở đây là cái kich thước của hình nó k cùng tỉ lệ với vị trí mong muốn ( vì cái file hình đc xuất ra từ chương trinh khác không điều chỉnh đc kích thước) e nghỉ như thế này không biết bác có giúp e đc k?! e muốn chiều rộng của hình bằng 1.2 lần chiều cao sau khi chèn vào, hoặc có cáh nào cắt bớt hình cho nhỏ lại và dùng border cho picture một cách tự động k? (E có để 2 hình 273.jpg và 274.jpg để tiện so sánh)
Việc cắt xén hình không phải là làm không được (đối với VBA)... nhưng tại sao bạn không tự edit hình trước rồi hẳn đưa vào Excel? Edit Picture trong Excel có phải là việc làm tốn kém không cần thiết không?
Nếu là tôi thì:
- Sau khi thu thập hình ảnh các nơi, tôi dùng các chương trình xử lý ảnh chỉnh sửa hình cho ưng ý trước, sau đó sẽ lưu lại
- Excel chỉ làm nhiệm vụ Show hình (không chỉnh sửa gì cả)
Bạn thấy sao?
 
Việc cắt xén hình không phải là làm không được (đối với VBA)... nhưng tại sao bạn không tự edit hình trước rồi hẳn đưa vào Excel? Edit Picture trong Excel có phải là việc làm tốn kém không cần thiết không?
Nếu là tôi thì:
- Sau khi thu thập hình ảnh các nơi, tôi dùng các chương trình xử lý ảnh chỉnh sửa hình cho ưng ý trước, sau đó sẽ lưu lại
- Excel chỉ làm nhiệm vụ Show hình (không chỉnh sửa gì cả)
Bạn thấy sao?
Em cũng đã từng nghĩ như bác trước đây, nếu mỗi ngày chỉnh sửa khoảng 10 pic thì ok nhưng đằng này hàng ngày có gần 100 pic thì làm sao chỉnh đc, bác có cách nào giúp e k?
 
Em cũng đã từng nghĩ như bác trước đây, nếu mỗi ngày chỉnh sửa khoảng 10 pic thì ok nhưng đằng này hàng ngày có gần 100 pic thì làm sao chỉnh đc, bác có cách nào giúp e k?
Ôi...
Thế bạn không biết tìm trên google để tải các phần mềm chỉnh sửa anh hàng loạt sao?
100 hình ăn nhằm gì ---> vài chục ngàn hình người ta còn chỉnh được nữa là
 
các bạn cho mình hỏi thêm , làm sao mà xác định được trong sheet có bao nhiêu picture , mục đích của mình là xóa tất cả các picture trong sheet , ngoại trừ hình nền , hoặc kể cả hình nền , rồi sẽ insert sau , mình đã ghi lại macro nhưng có vẻ rất khó làm , vì mỗi picture nó lại có tên ,

mình định làm theo kiểu đánh nhầm hơn bỏ xót :
on error resume next
for n = 1 to 500
ActiveSheet.Shapes("Picture " & n).Select
Selection.Delete

next n

kiểu này thì quá thủ công nhưng mà chắc là sẽ cho kết quả , bạn nào có code khác có thể cho mình xin , cảm ơn !
 
các bạn cho mình hỏi thêm , làm sao mà xác định được trong sheet có bao nhiêu picture , mục đích của mình là xóa tất cả các picture trong sheet , ngoại trừ hình nền , hoặc kể cả hình nền , rồi sẽ insert sau , mình đã ghi lại macro nhưng có vẻ rất khó làm , vì mỗi picture nó lại có tên ,

mình định làm theo kiểu đánh nhầm hơn bỏ xót :
on error resume next
for n = 1 to 500
ActiveSheet.Shapes("Picture " & n).Select
Selection.Delete

next n

kiểu này thì quá thủ công nhưng mà chắc là sẽ cho kết quả , bạn nào có code khác có thể cho mình xin , cảm ơn !
Bạn làm vầy nè:
- Bấm Ctrl + G (hoặc vào menu Edit, chọn Go To...)
- Trong hộp Go To, bấm nút Special...
- Check vào mục Objects rồi OK
- Cuối cùng là bấm nút Delete trên bàn phím
Một nhát xong tất tần tận các Object hiện có trong sheet
 
Web KT
Back
Top Bottom