Lỗi khi load ảnh trong userform VBA

Liên hệ QC

hoangpheo290193

Thành viên mới
Tham gia
20/11/19
Bài viết
31
Được thích
1
Chào các anh/ chị trong diễn đàn ạ. Em mới tập làm VBA, đang tập làm VBA
Em có viết đoạn code này, khi chạy userform nó cứ bảo lỗi "Run time error 53' File not found

Đoạn code của em đây ạ:

Private Sub UserForm_Initialize()
Application.ScreenUpdating = False
Dim a As Object
For Each a In Sheet1.Range("f2:f10")
cbSale.AddItem a
Next
Dim fA()
Dim i, n As Integer
Dim dName As Variant
ChDir "D:\CONG VIEC\Duong 129\KCS NEN DUONG MAU\KCS K95\ANH"
dName = Dir("Mai.jpg")
dName = Dir("Quynh.jpg")
dName = Dir("Dung.jpg")
Do While dName <> ""
n = n + 1
ReDim Preserve fA(1 To n)
fA(n) = dName
dName = Dir()
Loop

For i = 1 To n
cbSale.AddItem fA(i)
Next
Application.ScreenUpdating = True
End Sub

Sub cbSale_Change()
Image1.Picture = LoadPicture(cbSale.Value)
End Sub
Khi em kiểm tra thì nó bảo sai đoạn này ạ : Image1.Picture = LoadPicture(cbSale.Value)
Các cao nhân chỉ giúp em với ạ. Em nghịch cả ngày rồi vẫn không ra. Em cảm ơn ạ!
 

File đính kèm

  • Userform1.xlsm
    68.6 KB · Đọc: 4
Nguyên nhân:
1. Giả sử bạn chọn "Dung" (được nhập từ cột F trên sheet) trong combobox. Tuy trong thư mục ANH bạn có ảnh vd. "Dung.jpg" nhưng code nhập ảnh là
Mã:
Image1.Picture = LoadPicture(cbSale.Value)
Do trong combobox chỉ có "Dung" chứ không phải là "Dung.jpg" nên code trên thành
Mã:
Image1.Picture = LoadPicture(Dung)
Rõ ràng ảnh không được tìm thấy vì Dung không phải là tên ảnh. Tên ảnh là Dung.jpg. Không có định dạng ".jpg" thì "ai" biết nó là cái gì.

2. Thậm chí nếu code nhập vào combobox "Dung.jpg", "Mai.jpg" và "Quỳnh.jpg" thay cho "Dung", "Mai" và "Quỳnh" thì khi chọn "Quỳnh.jpg" cũng sẽ có lỗi 'Run time error 53' File not found. Nguyên nhân là vì LoadPicture không làm việc với các tên có ký tự unicode.

Ngoài lề:
1. Nếu trong thư mục ANH có tập tin vd. Cường.jpg thì khi mở combobox sẽ không thấy Cường.jpg mà chỉ có Cuo`ng.jpg. Nguyên nhân do hàm Dir không phục vụ unicode nên nó làm biến dạng Cường.jpg thành Cuo`ng.jpg.

2. Đoạn code
Mã:
dName = Dir("Mai.jpg")
dName = Dir("Quynh.jpg")
dName = Dir("Dung.jpg")
Do While dName <> ""
n = n + 1
ReDim Preserve fA(1 To n)
fA(n) = dName
dName = Dir()
Loop
chắc chắn không làm đúng ý người viết code. Chỉ có "Dung.jpg" được thêm vào mảng fA. Nguyên nhân là do tìm chính xác - Dir("Dung.jpg"). Trong thư mục ANH có thể có hàng nghìn ảnh nhưng chúng có tên <> "Dung.jpg" nên không được tìm thấy để thêm vào mảng fA.

Tức ở dòng Do While dName <> "" thì do dName = "Dung.jpg" nên điều kiện thỏa và vòng lặp được thực hiện, kết quả là "Dung.jpg" được thêm vào mảng fA. Khi thực hiện tới dòng dName = Dir() thì có dName = "" vì ở trên xuất phát là tìm chính xác "Dung.jpg" mà "Dung.jpg" vừa tìm thấy xong (ở trên dòng Do While ...) nên không còn nữa. Kết quả là ra khỏi vòng lặp.
 
Lần chỉnh sửa cuối:
Upvote 0
Nguyên nhân:
1. Giả sử bạn chọn "Dung" (được nhập từ cột F trên sheet) trong combobox. Tuy trong thư mục ANH bạn có ảnh vd. "Dung.jpg" nhưng code nhập ảnh là
Mã:
Image1.Picture = LoadPicture(cbSale.Value)
Do trong combobox chỉ có "Dung" chứ không phải là "Dung.jpg" nên code trên thành
Mã:
Image1.Picture = LoadPicture(Dung)
Rõ ràng ảnh không được tìm thấy vì Dung không phải là tên ảnh. Tên ảnh là Dung.jpg. Không có định dạng ".jpg" thì "ai" biết nó là cái gì.

2. Thậm chí nếu code nhập vào combobox "Dung.jpg", "Mai.jpg" và "Quỳnh.jpg" thay cho "Dung", "Mai" và "Quỳnh" thì khi chọn "Quỳnh.jpg" cũng sẽ có lỗi 'Run time error 53' File not found. Nguyên nhân là vì LoadPicture không làm việc với các tên có ký tự unicode.

Ngoài lề:
1. Nếu trong thư mục ANH có tập tin vd. Cường.jpg thì khi mở combobox sẽ không thấy Cường.jpg mà chỉ có Cuo`ng.jpg. Nguyên nhân do hàm Dir không phục vụ unicode nên nó làm biến dạng Cường.jpg thành Cuo`ng.jpg.

2. Đoạn code
Mã:
dName = Dir("Mai.jpg")
dName = Dir("Quynh.jpg")
dName = Dir("Dung.jpg")
Do While dName <> ""
n = n + 1
ReDim Preserve fA(1 To n)
fA(n) = dName
dName = Dir()
Loop
chắc chắn không làm đúng ý người viết code. Chỉ có "Dung.jpg" được thêm vào mảng fA. Nguyên nhân là do tìm chính xác - Dir("Dung.jpg"). Trong thư mục ANH có thể có hàng nghìn ảnh nhưng chúng có tên <> "Dung.jpg" nên không được tìm thấy để thêm vào mảng fA.

Tức ở dòng Do While dName <> "" thì do dName = "Dung.jpg" nên điều kiện thỏa và vòng lặp được thực hiện, kết quả là "Dung.jpg" được thêm vào mảng fA. Khi thực hiện tới dòng dName = Dir() thì có dName = "" vì ở trên xuất phát là tìm chính xác "Dung.jpg" mà "Dung.jpg" vừa tìm thấy xong (ở trên dòng Do While ...) nên không còn nữa. Kết quả là ra khỏi vòng lặp.
Em hiểu rồi ạ. Cảm ơn bác nhé! May có bác chỉ dẫn chứ em không hiểu bản chất nên không biết sai chỗ nào. Rất cảm ơn ạ!
 
Upvote 0
Web KT
Back
Top Bottom