Công ty mình có trên 7000 bản vẽ kĩ thuật, việc tra cứu và triển khai cho NV làm thực sự tốn quá nhiều thời gian .Mỗi bản vẽ được đặt tên mã.
Bản vẽ sẽ được chứa trong 1 folder ( Ví dụ ổ D )
Mình mong muốn là tạo ra 1 file excel khi gõ tên mã sẽ hiện ra bản vẽ đó . Khi cần sẽ gõ tên mã khác và tương ứng bản vẽ thay đổi theo.
Mình có đính kèm theo file . Mong được các cao thủ giúp đỡ.
- sub InsertPicture trong Module1 có thể dùng trong những tập tin khác nhau khi cần nhập ảnh vào sheet. Đọc hướng dẫn của InsertPicture để biết cách dùng.
- trong module của Sheet1 có code
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell_ As Range, rng As Range
If Target.Row = 1 And Target.Count = 1 Then
InsertPicture ThisWorkbook.Path & "\" & Target.Value & ".jpg", Target.Offset(1).MergeArea, False, True, True
End If
End Sub
Tức mỗi khi có sự thay đổi của 1 ô trong dòng 1 thì InsertPicture được gọi để nhập ảnh vào ô ở dòng bên dưới được merge - tức thay đổi ở Target thì ảnh được nhập vào Target.Offset(1).MergeArea
- ảnh hiện thời được nhập center trong ô.
- hiện thời các ảnh trên đĩa và tập tin Excel ở cùng thư mục. Nếu trong cùng thư mục với tập tin Excel có thư mục con là Anh và trong thư mục ảnh mới có các ảnh thì sửa "\" thành "\Anh\"
Xin cám ơn bác đã giúp đỡ.
Tuy nhiên, khi triển khai thực tế mình gặp 1 số vấn đề: trong file excel sheet "Nhập data" mình muốn triển khai theo định dạng dọc để in và nhập mã số vào cột mã hàng thì hình không hiện ra được dù cố gắng để hiểu được các dòng lệnh của bác
Vì vậy, mong bác chỉnh sửa lại giùm mình, để khi nhập vào cột Mã Hàng thì hình sẽ hiện ra ở cột Hình.
Tuy nhiên, khi triển khai thực tế mình gặp 1 số vấn đề: trong file excel sheet "Nhập data" mình muốn triển khai theo định dạng dọc để in và nhập mã số vào cột mã hàng thì hình không hiện ra được dù cố gắng để hiểu được các dòng lệnh của bác
Vì vậy, mong bác chỉnh sửa lại giùm mình, để khi nhập vào cột Mã Hàng thì hình sẽ hiện ra ở cột Hình.
Bạn đọc hướng dẫn trong sub InsertPicture mà vẫn không biết dùng?
Cách gọi InsertPicture và các tham số
InsertPicture<đường dẫn tới ảnh trên đĩa>, <ô hiển thị ảnh>, <hiển thị với kích thước thực?>, <hiển thị center hay vừa khít ô?>, <chỉ link hay nhập ảnh vĩnh viễn vào ô?>
Tôi cho ví dụ về nhập center (với ảnh và khung của bạn mà nhập vừa khít ô thì ảnh sẽ bị thu nhỏ theo chiều cao nhiều hơn so với theo chiều rộng và ảnh sẽ bị méo), nhập vĩnh viễn (để có thể xóa trên đĩa)
Trong Module của sheet "Nhập data" dán code sau
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count = 1 And Target.Row > 1 And Target.Column = 3 Then
InsertPicture ThisWorkbook.Path & "\" & Target.Value & ".jpg", Target.Offset(0, 3).MergeArea, False, True, False
End If
End Sub
Tại sao điều kiện (đk) để nhập ảnh là
Mã:
Target.Count = 1 And Target.Row > 1 And Target.Column = 3
- Code chỉ "phản ứng" khi thay đổi từng ô một (nếu có nhu cầu dán hàng loạt Mã thì code sẽ khác). Vì thế ta có đk Target.Count = 1.
- Code chỉ "phản ứng" khi sự thay đổi trên sheet sảy ra ở những dòng > 1 vì không lý gì lại phản ứng khi sự thay đổi sảy ra ở dòng tiêu đề - dòng 1. Biết đâu người ta chỉnh sửa hoặc thêm tiêu đề. Vì thế ta lấy đk Target.Row > 1
- Code chỉ "phản ứng" khi sự thay đổi trên sheet sảy ra ở cột C (Mã hàng) vì thế có đk Target.Column = 3
Target trong Sub Worksheet_Change chính là vùng mà ở đó đã có sự thay đổi sảy ra. Khi 3 đk trên thỏa mãn thì Target chính là một ô ở cột C, và không nằm ở dòng 1.
Để ý ta thấy nếu ta dịch ô Mã (ở cột C) sang phải 3 cột thì sẽ có ô Hình (ở cột F). Ô Mã là Target thì ô hình là Target.Offset(0, 3). Nhưng do bạn gộp ô nên để ảnh nhập vào cả 3 ô gộp thì phải là Target.Offset(0, 3).MergeArea.
Ở trên là code cho trường hợp tập tin Excel và các ảnh nằm cùng thư mục. Nếu tập tin Excel và thư mục Anh nằm cùng thư mục và các ảnh nằm trong thư mục Anh thì thay "\" bằng "\Anh\"
------------- InsertPicture có thể nhập ảnh vào nhiều ô mà không cần gộp ô. Bạn có thể bỏ hết các ô gộp (Merge). Lúc này trong code ở trên thay
Mã:
Target.Offset(0, 3).MergeArea
bằng
Mã:
Target.Offset(0, 3).Resize(1, 3)
Tức ô nhập ảnh có được bằng cách dịch ô Mã Target sang phải 3 cột - Target.Offset(0, 3), tiếp theo mở rộng thành vùng vẫn có 1 dòng nhưng 3 cột (F, G, H) - Target.Offset(0, 3).Resize(1, 3)