Em chào các bác, hiện em có mò mầm làm cái hàm dò tìm ảnh trong excel để dễ in ấn, nhưng có điều là khi dò ra được thì ảnh ko fit được khung in và nếu em kéo ảnh ra thì nó rất mờ ko rõ nét như ảnh ở sheet DATA (file đính kèm). Các bác cao thủ trong đây cho em xin giải pháp xử lý, nếu xử lý được bằng VBA thì càng tốt ạ.
Em chào các bác, hiện em có mò mầm làm cái hàm dò tìm ảnh trong excel để dễ in ấn, nhưng có điều là khi dò ra được thì ảnh ko fit được khung in và nếu em kéo ảnh ra thì nó rất mờ ko rõ nét như ảnh ở sheet DATA (file đính kèm). Các bác cao thủ trong đây cho em xin giải pháp xử lý, nếu xử lý được bằng VBA thì càng tốt ạ.
Ai mà biết được có mờ hay không, và làm sao biết được ảnh ở sheet Data có nét hay không, khi mà trong tập tin bạn chưa chèn bất cứ ảnh nào trong sheet DATA.
Trong Sub Worksheet_Change của sheet DATA có code để chèn ảnh vào sheet DATA khi nhập MÃ HA vào cột B. Nếu bạn đồng ý thì tôi sẽ thay toàn bộ code chèn ảnh cũ bằng code mới. Và trên cơ sở đó tôi thêm code copy ảnh từ DATA sang FORM mỗi khi bạn nhấn SpinButton1 trên FORM.
Ai mà biết được có mờ hay không, và làm sao biết được ảnh ở sheet Data có nét hay không, khi mà trong tập tin bạn chưa chèn bất cứ ảnh nào trong sheet DATA.
Trong Sub Worksheet_Change của sheet DATA có code để chèn ảnh vào sheet DATA khi nhập MÃ HA vào cột B. Nếu bạn đồng ý thì tôi sẽ thay toàn bộ code chèn ảnh cũ bằng code mới. Và trên cơ sở đó tôi thêm code copy ảnh từ DATA sang FORM mỗi khi bạn nhấn SpinButton1 trên FORM.
Bạn đính kèm ảnh như thế cũng bằng không. Code chèn ảnh của bạn chọn cách link image nên mang tập tin đi đâu cũng phải gửi ảnh đi kèm vì ảnh không được chèn vào tập tin vĩnh viễn. Bạn có thể làm như sau để mục sở thị và ghi nhớ muôn đời. Bạn hãy xóa hết ảnh hoặc đổi tên thư mục ảnh sau đó mở tập tin Excel thì sẽ bị bất ngờ.
Tôi chèn ảnh cho bạn kiểu vĩnh viễn. Tập tin sẽ nặng hơn nhưng mang đi chỗ khác thì không phải mang ảnh đi kèm.
Tôi thay toàn bộ code trong Private Sub Worksheet_Change để chèn ảnh
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Or Target.Row = 1 Or Target.Column <> 2 Then Exit Sub
InsertPicture ThisWorkbook.path & "\" & Target.Value & ".jpg", Target.Offset(, 1), , True
' InsertPicture ThisWorkbook.path & "\" & Target.Value & ".jpg", Target.Offset(, 1), , True, True
End Sub
Nhìn ở trên bạn thấy 2 dòng InsertPicture mà trong đó dòng thứ 2 đang bị là chú thích. Dòng 1 là chèn ảnh vĩnh viễn còn dòng 2 là chèn link mà thôi. Lựa chọn dòng 1 hay 2 thuộc về bạn.
Trong sheet FORM tôi thêm code
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$I$15" Then showPicture "Data", "FORM", "A1", "A", Target.Value, "C" ' goi showPicture de copy anh tu DATA sang FORM
End Sub
Mục đích để mỗi khi có sự thay đổi ở I15 thì code sẽ gọi sub showPicture để: hủy ảnh cũ trong khung A1:G27 -> sao chép ảnh mới tương ứng sang sheet FORM -> phóng to / thu nhỏ ảnh để center ảnh trong khung. Center để ảnh vừa khít khung đồng thời zoom 2 chiều như nhau thì ảnh mới không bị biến dạng. Nếu làm vừa khít khung thì nhiều khi một chiều sẽ bị zoom khác chiều kia và ảnh bị méo.
Code tổng quát để chèn ảnh là InsertPicture. Trong tương lai trong bất cứ tập tin nào cần chèn ảnh thì thêm code của InsertPicture vào rồi chèn ảnh như trong code Worksheet_Change ở trên. Cả InsertPicture và showPicture nằm ở Module1. Hãy đọc chú thích mà tôi viết rất cặn kẽ để biết cách dùng 2 sub.
Bạn đính kèm ảnh như thế cũng bằng không. Code chèn ảnh của bạn chọn cách link image nên mang tập tin đi đâu cũng phải gửi ảnh đi kèm vì ảnh không được chèn vào tập tin vĩnh viễn. Bạn có thể làm như sau để mục sở thị và ghi nhớ muôn đời. Bạn hãy xóa hết ảnh hoặc đổi tên thư mục ảnh sau đó mở tập tin Excel thì sẽ bị bất ngờ.
Tôi chèn ảnh cho bạn kiểu vĩnh viễn. Tập tin sẽ nặng hơn nhưng mang đi chỗ khác thì không phải mang ảnh đi kèm.
Tôi thay toàn bộ code trong Private Sub Worksheet_Change để chèn ảnh
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Or Target.Row = 1 Or Target.Column <> 2 Then Exit Sub
InsertPicture ThisWorkbook.path & "\" & Target.Value & ".jpg", Target.Offset(, 1), , True
' InsertPicture ThisWorkbook.path & "\" & Target.Value & ".jpg", Target.Offset(, 1), , True, True
End Sub
Nhìn ở trên bạn thấy 2 dòng InsertPicture mà trong đó dòng thứ 2 đang bị là chú thích. Dòng 1 là chèn ảnh vĩnh viễn còn dòng 2 là chèn link mà thôi. Lựa chọn dòng 1 hay 2 thuộc về bạn.
Trong sheet FORM tôi thêm code
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$I$15" Then showPicture "Data", "FORM", "A1", "A", Target.Value, "C" ' goi showPicture de copy anh tu DATA sang FORM
End Sub
Mục đích để mỗi khi có sự thay đổi ở I15 thì code sẽ gọi sub showPicture để: hủy ảnh cũ trong khung A1:G27 -> sao chép ảnh mới tương ứng sang sheet FORM -> phóng to / thu nhỏ ảnh để center ảnh trong khung. Center để ảnh vừa khít khung đồng thời zoom 2 chiều như nhau thì ảnh mới không bị biến dạng. Nếu làm vừa khít khung thì nhiều khi một chiều sẽ bị zoom khác chiều kia và ảnh bị méo.
Code tổng quát để chèn ảnh là InsertPicture. Trong tương lai trong bất cứ tập tin nào cần chèn ảnh thì thêm code của InsertPicture vào rồi chèn ảnh như trong code Worksheet_Change ở trên. Cả InsertPicture và showPicture nằm ở Module1. Hãy đọc chú thích mà tôi viết rất cặn kẽ để biết cách dùng 2 sub.
Bạn đính kèm ảnh như thế cũng bằng không. Code chèn ảnh của bạn chọn cách link image nên mang tập tin đi đâu cũng phải gửi ảnh đi kèm vì ảnh không được chèn vào tập tin vĩnh viễn. Bạn có thể làm như sau để mục sở thị và ghi nhớ muôn đời. Bạn hãy xóa hết ảnh hoặc đổi tên thư mục ảnh sau đó mở tập tin Excel thì sẽ bị bất ngờ.
Tôi chèn ảnh cho bạn kiểu vĩnh viễn. Tập tin sẽ nặng hơn nhưng mang đi chỗ khác thì không phải mang ảnh đi kèm.
Tôi thay toàn bộ code trong Private Sub Worksheet_Change để chèn ảnh
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Or Target.Row = 1 Or Target.Column <> 2 Then Exit Sub
InsertPicture ThisWorkbook.path & "\" & Target.Value & ".jpg", Target.Offset(, 1), , True
' InsertPicture ThisWorkbook.path & "\" & Target.Value & ".jpg", Target.Offset(, 1), , True, True
End Sub
Nhìn ở trên bạn thấy 2 dòng InsertPicture mà trong đó dòng thứ 2 đang bị là chú thích. Dòng 1 là chèn ảnh vĩnh viễn còn dòng 2 là chèn link mà thôi. Lựa chọn dòng 1 hay 2 thuộc về bạn.
Trong sheet FORM tôi thêm code
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$I$15" Then showPicture "Data", "FORM", "A1", "A", Target.Value, "C" ' goi showPicture de copy anh tu DATA sang FORM
End Sub
Mục đích để mỗi khi có sự thay đổi ở I15 thì code sẽ gọi sub showPicture để: hủy ảnh cũ trong khung A1:G27 -> sao chép ảnh mới tương ứng sang sheet FORM -> phóng to / thu nhỏ ảnh để center ảnh trong khung. Center để ảnh vừa khít khung đồng thời zoom 2 chiều như nhau thì ảnh mới không bị biến dạng. Nếu làm vừa khít khung thì nhiều khi một chiều sẽ bị zoom khác chiều kia và ảnh bị méo.
Code tổng quát để chèn ảnh là InsertPicture. Trong tương lai trong bất cứ tập tin nào cần chèn ảnh thì thêm code của InsertPicture vào rồi chèn ảnh như trong code Worksheet_Change ở trên. Cả InsertPicture và showPicture nằm ở Module1. Hãy đọc chú thích mà tôi viết rất cặn kẽ để biết cách dùng 2 sub.
Em phát hiện ra 1 lỗi là khi số ảnh bên sheet DATA quá nhiều tầm khoảng 20-30 ảnh thì khi sử dụng ở nút lên xuống bên sheet FORM lâu lâu sẽ có vài trang bị mất ảnh. Em đã thử kéo nhỏ ô chứa ảnh ở mục data và form nhưng ko giải quyết được lỗi này.
Em phát hiện ra 1 lỗi là khi số ảnh bên sheet DATA quá nhiều tầm khoảng 20-30 ảnh thì khi sử dụng ở nút lên xuống bên sheet FORM lâu lâu sẽ có vài trang bị mất ảnh. Em đã thử kéo nhỏ ô chứa ảnh ở mục data và form nhưng ko giải quyết được lỗi này.
Mấy ngày nay bận quá nên không có thời gian lên diễn đàn để rep tin nhắn anh.
Cái này e tìm ra nguyên nhân và đã khắc phục được rồi a, nếu in độc lập ở 1 sheet FORM thì ko vấn đề gì. Nguyên nhân ở cái nút Spinbutton, em thường in gọp chung nhiều sheet lại, và hay link các sheet về 1 sheet gốc bằng công thức của excel thôi, nhưng lệnh công thức excel khi chạy sẽ chậm hơn 1 nhịp của lệnh VBA nên khi in ra lệnh thì ảnh của trang sau thì lại thành của trang trước. Em khắc phục bằng cách viết link ô thay đổi trang lên VBA trực tiếp luôn.