Vấn đề của em là khi có 1 cột mã hàng, thì excel sẽ tự chèn ảnh có sẵn (trong thư mục cố định, tên file là tên của mã hàng) vào cột bên cạnh.
Trước đó em có xài cách của 1 bác khác là viết 1 hàm riêng cho file excel đó, hàm compic(đường dẫn hình). Là dạng chèn hình vào comment. Nhưng do lúc chạy rất hay bị văng ra nên không được tiện lắm.
Hôm qua em mò trên mạng được code VBA của 1 bác về chèn hình vào excel sau khi ta gõ mã của hình đó.
Thấy code của bác này chạy rất nhẹ nhàng và chèn trực tiếp (chứ không phải comment), nên em rất thích.
Nhưng chưa đủ áp dụng vào công việc của em, nhờ các bác cao thủ giúp em với ạ:
- File đính kèm đã có code chạy cho cột mã 1
- Nếu em có thêm cột mã 2 thì code sẽ viết như thế nào? (Nếu dạng hàm thì quá dễ, hàm ở đâu hình sẽ hiện ở đó)
- Cột mã nếu là công thức hoặc khi copy dán thì code không chạy (cả ngàn mã không thể gõ tay rồi enter được) -> lỗi type miss match
- Nếu trong 10 mã mà có 5 mã bị sai, bỏ trống -> 5 mã còn lại vẫn hiện hình, 5 mã kia không hiện (đằng này báo lỗi và ko hiện tất)
Dung lượng đâu thành vấn đề vì ứng dụng chủ yếu gọi hình của những mặt hàng cần thiết thôi chứ không lưu hình 10.000 món hàng.
Code sẽ tự Replace những hình cũ để thay bằng hình mới khi mình gõ mã mới -> không làm phình to file excel
Nói chung mình thấy cách này quá tuyệt rồi. hihi
Nếu bạn không xóa ảnh trên đĩa và luôn gửi ảnh kèm tập tin cho đối tác thì nên chèn link thôi để tập tin nhẹ. Trong trường hợp này sửa thành
Có cách nào file hình thì vẫn ở thư mục, file excel thì không nhúng hình, khi cần hiển thị thì mới hiển thị từ file của hình, nhưng thế thì file không phải chứa hình? Bác nghĩ Excel cho phép vậy không?
Lưu ý chủ topic: file hình kiểu nhúng vào excel nên là hình nhỏ, dung lượng nhỏ thôi, còn nếu lớn mà nhiều thì file excel sẽ phình to
Dung lượng đâu thành vấn đề vì ứng dụng chủ yếu gọi hình của những mặt hàng cần thiết thôi chứ không lưu hình 10.000 món hàng.
Code sẽ tự Replace những hình cũ để thay bằng hình mới khi mình gõ mã mới -> không làm phình to file excel
Nói chung mình thấy cách này quá tuyệt rồi. hihi
Tiếc là người hỏi , đang muốn code gắn hình , và động hóa, không phải nhập
Còn list box của bác hiện nhiều thông tin quá dễ rối: bác cứ để ý các hộp thoại của các phần mềm chính quy đâu có sử dụng listbox quá nhiều cột- khi nhiều cột thì người ta phải dùng cách khác để thể hiện cùng listbox (thường list box hiện 4 5 cột là nhiều)
Tiếc là người hỏi , đang muốn code gắn hình , và động hóa, không phải nhập
Còn list box của bác hiện nhiều thông tin quá dễ rối: bác cứ để ý các hộp thoại của các phần mềm chính quy đâu có sử dụng listbox quá nhiều cột- khi nhiều cột thì người ta phải dùng cách khác để thể hiện cùng listbox (thường list box hiện 4 5 cột là nhiều)
Haha bác batman1 comt vui quá. Code của bác như thổi hồn vào file của em. Em đọc kĩ lắm em không hiểu sao bác hiểu đúng nhu cầu em mà cho thêm mấy chữ " , , , True " vào. Nói chung chạy ngay từ lần đầu gặp nhau không phải hỏi thêm. Chúc bác sức khỏe nhé để giúp đỡ các ae diễn đàn.
Tiếc là người hỏi , đang muốn code gắn hình , và động hóa, không phải nhập
Còn list box của bác hiện nhiều thông tin quá dễ rối: bác cứ để ý các hộp thoại của các phần mềm chính quy đâu có sử dụng listbox quá nhiều cột- khi nhiều cột thì người ta phải dùng cách khác để thể hiện cùng listbox (thường list box hiện 4 5 cột là nhiều)
Bạn đọc bài 1 người ta nêu vầy "cột mã hàng" thì phải hiểu là còn những thứ khác là tên hàng hóa, kích thước, chủng loại, đơn vị tính, đơn giá ........và còn một loạt những thứ khác nữa chứ không phải chỉ riêng việc gán hình, do người ta nghĩ chưa đến nơi, đến chốn.
Đương nhiên tôi đọc và hiểu nên đưa lên một số kết quả để chủ Topic hình dung được còn những vấn đề khác liên quan chứ không đơn giản là chỉ lấy hình.
Bạn đọc bài 1 người ta nêu vầy "cột mã hàng" thì phải hiểu là còn những thứ khác là tên hàng hóa, kích thước, chủng loại, đơn vị tính, đơn giá ........và còn một loạt những thứ khác nữa chứ không phải chỉ riêng việc gán hình, do người ta nghĩ chưa đến nơi, đến chốn.
Đương nhiên tôi đọc và hiểu nên đưa lên một số kết quả để chủ Topic hình dung được còn những vấn đề khác liên quan chứ không đơn giản là chỉ lấy hình.
Tôi thì nghĩ công việc của người ta thì người ta phải biết người ta cần những thông tin gì, cần những cột nào. Chả cần ai phải gợi ý hình dung gì cả.
Nếu người ta không biết thì chắc chắn người ta sẽ hỏi. Còn nếu không hỏi thì không nên cho là người ta không biết gì.
Cái người ta hỏi thì chắc chắn người ta không biết. Nhưng cái người ta không hỏi thì không loại trừ khả năng là người ta còn giỏi hơn mình. Đừng vì người ta hỏi một vấn đề mà mặc định là người ta chả biết gì.
Kính gửi Giải Pháp Excel
Tôi học trên YouTube và làm file Excel với đoạn Code theo hướng dẫn.
Mục đích là khi thay đổi chọn Số CMND tại sheet Form sẽ hiện hình người tương ứng
Tôi không biết VBA chỉ làm theo hướng dẫn nhưng không được, nhờ các anh em giúp với
Xin chân thành cảm ơn
Xin gửi kèm file
Kính gửi Giải Pháp Excel
Tôi học trên YouTube và làm file Excel với đoạn Code theo hướng dẫn.
Mục đích là khi thay đổi chọn Số CMND tại sheet Form sẽ hiện hình người tương ứng
Tôi không biết VBA chỉ làm theo hướng dẫn nhưng không được, nhờ các anh em giúp với
Xin chân thành cảm ơn
Xin gửi kèm file
Bạn nên đưa cái mẫu đầy đủ lên và cũng nên nêu rõ gán hình chỗ nào để các thành viên hiểu mới giúp được, chứ nữa vời như bạn thì người giúp rất nại sửa code khi bạn thay đổi ý.
Nếu nói về code của bạn thì có vài cái sai cơ bản
1. Không phải
Mã:
Set Rng = Sheets(1).Range(Sheets(1).[B5], Sheets(1).[B11].End(xlUp))
mà ít ra phải là
Mã:
Set Rng = Sheets(1).Range(Sheets(1).[B5], Sheets(1).[B65535].End(xlUp))
hoặc viết gọn
With Me.Parent.Worksheets("List")
Set Rng = .Range(.[B5], .[B65535].End(xlUp))
End With
Nếu nói về code của bạn thì có vài cái sai cơ bản
1. Không phải
Mã:
Set Rng = Sheets(1).Range(Sheets(1).[B5], Sheets(1).[B11].End(xlUp))
mà ít ra phải là
Mã:
Set Rng = Sheets(1).Range(Sheets(1).[B5], Sheets(1).[B65535].End(xlUp))
hoặc viết gọn
With Me.Parent.Worksheets("List")
Set Rng = .Range(.[B5], .[B65535].End(xlUp))
End With
Nếu muốn chèn ảnh từ 1 ô tính trong file excel khác thì làm thế nào các bác(thay việc lấy ảnh từ file ảnh trong foder mà lấy từ 1 file excel khác ấy ah)
Nếu cột Mã dùng công thức thì khi công thức phải tính lại do tham chiếu thay đổi thì sự kiện Change không sảy ra nên code sẽ không được thực hiện. Và kết quả là ảnh không được đổi.
Code dưới đây cho phép dán hàng loạt Mã.
-------------
Trước hết về sub tổng quát InsertPicture. Bạn có thể lưu Module cùng với InsertPicture vào "thư viện" - một thư mực nào đó, để khi cần thì chỉ (trong VBE): File -> Import File -> duyệt tới tập tin BAS đã lưu -> chọn tập tin BAS để thêm vào tập tin Excel hiện hành -> dùng Sub InsertPicture trong tập tin hiện hành.
Bạn không nên dùng Pictures vì đôi khi gặp những lỗi khó hiểu.
InsertPicture có nhiều tùy chọn: có thể nhập ảnh vào 1 ô hoặc vùng nhiều ô mà không cần merge cells, nhập ảnh với kích thước thực, nhập ảnh center trong ô/vùng hoặc vừa khít, nhập ảnh nhưng khi mang sang máy khác thì phải mang ảnh theo hoặc nhập ảnh vĩnh viễn vào sheet để khi mang sang máy khác thì không phải mang ảnh đi theo.
Private Sub Worksheet_Change(ByVal Target As range)
Dim rng As range
If Intersect(Target, Union([A2:A10000], [D2:D10000])) Is Nothing Then Exit Sub
For Each rng In Target
InsertPicture ThisWorkbook.path & "\" & rng.Value & ".jpg", rng.Offset(0, 1)
Next rng
End Sub
Code trên cho phép bạn dán tên ảnh (copy từ đâu đó) hàng loạt vào cột A hoặc D kể từ dòng 2 trở đi.
Với code trên thì sau khi chèn ảnh có thể xóa ảnh trên đĩa và khi gửi cho đối tác không phải gửi ảnh theo. Nếu bạn không xóa ảnh trên đĩa và luôn gửi ảnh kèm tập tin cho đối tác thì nên chèn link thôi để tập tin nhẹ. Trong trường hợp này sửa thành
Nếu ảnh không là JPG thì sửa ".jpg" thích hợp.
Nếu ảnh ở thư mục con vd. Anh thì sửa ThisWorkbook.path & "\" thành ThisWorkbook.path & "\Anh\"
Code phục vụ 2 cột là A và D. Nếu có thêm cột thì thêm vào trong ngoặc của Union([A2:A10000], [D210000])
Cuối cùng là sub tổng quát InsertPicture: Mở tập tin -> Alt + F11 -> menu Insert -> Module -> dán code dưới vào Module vừa thêm.
Để có thể dùng sub tổng quát InsertPicture trong những tập tin tương lai thì: chọn Module (click tên Module) -> menu File -> Export File -> duyệt tới thư mục cần lưu -> lưu lại với tên nào đó.BAS
Code cho Module vừa thêm
Mã:
Sub InsertPicture(ByVal PicFilename As String, Optional Target As range = Nothing, _
Optional original As Boolean = False, Optional center As Boolean = False, _
Optional LinkToFile As Boolean = False)
' Target: vung nhap anh. Co the la nhieu cell
' Neu Target = Nothing thi Target = ActiveCell
' Neu original = True thi nhap anh kich thuoc thuc.
' Neu original = FALSE thi neu center = True thi anh se center trong vung Target,
' nguoc lai thi se vua khit vung Target
' LinkToFile = False thi khong can giu anh tren dia, nguoc lai bat buoc phai giu anh de moi lan mo thi co
Dim w As Double, h As Double, shp As Shape, fso As Object
If Target Is Nothing Then Set Target = ActiveCell
On Error Resume Next
Target.Parent.Shapes(Target.Address).Delete
On Error GoTo 0
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists(PicFilename) Then
If LinkToFile Then
Set shp = Target.Parent.Shapes.AddPicture(PicFilename, msoTrue, msoFalse, Target.left, Target.top, 0, 0)
Else
Set shp = Target.Parent.Shapes.AddPicture(PicFilename, msoFalse, msoTrue, Target.left, Target.top, 0, 0)
End If
If Not shp Is Nothing Then
With shp
If original Then
.ScaleWidth 1, msoTrue
.ScaleHeight 1, msoTrue
ElseIf center Then
.ScaleWidth 1, msoTrue
.ScaleHeight 1, msoTrue
w = Target.Width
h = w * .Height / .Width
If h > Target.Height Then
h = Target.Height
w = h * .Width / .Height
End If
.left = Target.left + (Target.Width - w) / 2
.top = Target.top + (Target.Height - h) / 2
.Width = w
.Height = h
Else
.Width = Target.Width
.Height = Target.Height
End If
shp.Name = Target.Address
shp.Placement = xlMoveAndSize
End With
End If
End If
Set fso = Nothing
End Sub
[/
[/QUOTE]
Nếu cột Mã dùng công thức thì khi công thức phải tính lại do tham chiếu thay đổi thì sự kiện Change không sảy ra nên code sẽ không được thực hiện. Và kết quả là ảnh không được đổi.
Code dưới đây cho phép dán hàng loạt Mã.
-------------
Trước hết về sub tổng quát InsertPicture. Bạn có thể lưu Module cùng với InsertPicture vào "thư viện" - một thư mực nào đó, để khi cần thì chỉ (trong VBE): File -> Import File -> duyệt tới tập tin BAS đã lưu -> chọn tập tin BAS để thêm vào tập tin Excel hiện hành -> dùng Sub InsertPicture trong tập tin hiện hành.
Bạn không nên dùng Pictures vì đôi khi gặp những lỗi khó hiểu.
InsertPicture có nhiều tùy chọn: có thể nhập ảnh vào 1 ô hoặc vùng nhiều ô mà không cần merge cells, nhập ảnh với kích thước thực, nhập ảnh center trong ô/vùng hoặc vừa khít, nhập ảnh nhưng khi mang sang máy khác thì phải mang ảnh theo hoặc nhập ảnh vĩnh viễn vào sheet để khi mang sang máy khác thì không phải mang ảnh đi theo.
Private Sub Worksheet_Change(ByVal Target As range)
Dim rng As range
If Intersect(Target, Union([A2:A10000], [D2:D10000])) Is Nothing Then Exit Sub
For Each rng In Target
InsertPicture ThisWorkbook.path & "\" & rng.Value & ".jpg", rng.Offset(0, 1)
Next rng
End Sub
Code trên cho phép bạn dán tên ảnh (copy từ đâu đó) hàng loạt vào cột A hoặc D kể từ dòng 2 trở đi.
Với code trên thì sau khi chèn ảnh có thể xóa ảnh trên đĩa và khi gửi cho đối tác không phải gửi ảnh theo. Nếu bạn không xóa ảnh trên đĩa và luôn gửi ảnh kèm tập tin cho đối tác thì nên chèn link thôi để tập tin nhẹ. Trong trường hợp này sửa thành
Nếu ảnh không là JPG thì sửa ".jpg" thích hợp.
Nếu ảnh ở thư mục con vd. Anh thì sửa ThisWorkbook.path & "\" thành ThisWorkbook.path & "\Anh\"
Code phục vụ 2 cột là A và D. Nếu có thêm cột thì thêm vào trong ngoặc của Union([A2:A10000], [D210000])
Cuối cùng là sub tổng quát InsertPicture: Mở tập tin -> Alt + F11 -> menu Insert -> Module -> dán code dưới vào Module vừa thêm.
Để có thể dùng sub tổng quát InsertPicture trong những tập tin tương lai thì: chọn Module (click tên Module) -> menu File -> Export File -> duyệt tới thư mục cần lưu -> lưu lại với tên nào đó.BAS
Code cho Module vừa thêm
Mã:
Sub InsertPicture(ByVal PicFilename As String, Optional Target As range = Nothing, _
Optional original As Boolean = False, Optional center As Boolean = False, _
Optional LinkToFile As Boolean = False)
' Target: vung nhap anh. Co the la nhieu cell
' Neu Target = Nothing thi Target = ActiveCell
' Neu original = True thi nhap anh kich thuoc thuc.
' Neu original = FALSE thi neu center = True thi anh se center trong vung Target,
' nguoc lai thi se vua khit vung Target
' LinkToFile = False thi khong can giu anh tren dia, nguoc lai bat buoc phai giu anh de moi lan mo thi co
Dim w As Double, h As Double, shp As Shape, fso As Object
If Target Is Nothing Then Set Target = ActiveCell
On Error Resume Next
Target.Parent.Shapes(Target.Address).Delete
On Error GoTo 0
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists(PicFilename) Then
If LinkToFile Then
Set shp = Target.Parent.Shapes.AddPicture(PicFilename, msoTrue, msoFalse, Target.left, Target.top, 0, 0)
Else
Set shp = Target.Parent.Shapes.AddPicture(PicFilename, msoFalse, msoTrue, Target.left, Target.top, 0, 0)
End If
If Not shp Is Nothing Then
With shp
If original Then
.ScaleWidth 1, msoTrue
.ScaleHeight 1, msoTrue
ElseIf center Then
.ScaleWidth 1, msoTrue
.ScaleHeight 1, msoTrue
w = Target.Width
h = w * .Height / .Width
If h > Target.Height Then
h = Target.Height
w = h * .Width / .Height
End If
.left = Target.left + (Target.Width - w) / 2
.top = Target.top + (Target.Height - h) / 2
.Width = w
.Height = h
Else
.Width = Target.Width
.Height = Target.Height
End If
shp.Name = Target.Address
shp.Placement = xlMoveAndSize
End With
End If
End If
Set fso = Nothing
End Sub
Em chào các bác, các bác cho em hỏi nếu muốn vùng chọn hiện ảnh là nhiều cell thì mã code viết như nào ạ. Ví dụ em muốn gộp ô nhập mã là từ N17:N25 và ô chèn ảnh là O17:O25, tương tự gộp như vậy cho các cell dưới cột N và chèn ảnh cột O. Em chưa thạo mong các bác giúp đỡ ạ!!!