Hiện thị hình ảnh trên Userform VBA

Liên hệ QC

son0611excel

Thành viên mới
Tham gia
3/1/20
Bài viết
40
Được thích
5
Giới tính
Nam
Nghề nghiệp
Kỹ Thuật
Chào các anh chị ạ!

Hiện tại em đang có 1 file quản lý kho hàng, nhưng em muốn mình nhấp vào dòng nào bên tìm kiếm thì cột "Hình ảnh linh kiện" sẽ hiện hình của món đó ạ

VD: Khi em nhấp vào dòng SJSC10-020A thì nó sẽ hiện hình của món đó bên ô "Hình ảnh linh kiện" dưới bên trái.

1618561271078.png

File này là file mạng nên em muốn thêm 1 chút hình ảnh thôi ạ. Mong mấy anh giúp đỡ
 

File đính kèm

  • QUẢN LÝ KHO.xlsm
    2.3 MB · Đọc: 36
Lần chỉnh sửa cuối:
Code này nhé bạn. Bạn cần 1 thư mục lưu trữ hình ảnh, trong file của bạn phải có cột dữ liệu chứa linh cho từng ảnh, hoặc lấy ảnh theo tên vật tư
PHP:
Private Sub ListBox7_Click()
' Created by Ban_V003518

Dim PicPath As String
PicPath = "G:\01. GPE\Chu ky Nguyen Van Huynh.jpg"

If Len(Dir(PicPath)) = 0 Then
MsgBox PicPath & " does not exist."
Else
Me.Image2.Picture = LoadPicture(PicPath)
Me.Repaint
End If

End Sub
 
Upvote 0
Vấn đề là sửa ListBox6_Click thôi. Code ListBox6_Click không chuẩn. Viết kiểu đó (Then _) thì tất cả các dòng từ .TextBox3 = trở xuống sẽ luôn được thực hiện bất kể điều kiện IF có thỏa hay không. Sửa lại cho đúng và hiển thị ảnh
Mã:
Private Sub ListBox6_Click()
    With Me
        If .ListBox6.ListIndex >= 0 Then
            .TextBox2 = .ListBox6.List(.ListBox6.ListIndex, 0)
            .TextBox3 = .ListBox6.List(.ListBox6.ListIndex, 1)
            .TextBox4 = .ListBox6.List(.ListBox6.ListIndex, 2)
            .TextBox5 = .ListBox6.List(.ListBox6.ListIndex, 3)
            .TextBox6 = .ListBox6.List(.ListBox6.ListIndex, 4)
            .TextBox7 = .ListBox6.List(.ListBox6.ListIndex, 5)
            .Image2.Picture = ThisWorkbook.Path & "\Pictures\" & .ListBox6.List(.ListBox6.ListIndex, 5) & ".jpg"
        End If
    End With
End Sub
Do bạn không nói rõ, cột nào của ListBox chứa tên ảnh nên code ở trên cho là tên ảnh xuất phát từ cột H trong sheet "Data Processing 1".

Code trong module UserForm2 (tôi không xem các module khác) không chuẩn. Do không chuẩn nhiều chỗ (vd. như Then _ ở trên) nên tôi chỉ lưu ý 1 vấn đề. Cái gì chỉ cần làm 1 lần thì không ai lại đặt nó trong vòng lặp FOR để mà thực hiện nó hàng ngàn lần. Vd. không ai lại đặt ListBox6.Clear, TextBox2.Text = "", ..., TextBox7.Text = "", ListBox6.ColumnWidths = ... trong vòng lặp FOR của Sub TextBox1_Change. Thậm chí ListBox6.ColumnWidths = ... không ai đặt trong Sub TextBox1_Change để mà thực hiện nó mỗi khi TextBox1 có sự thay đổi. Nên đặt ListBox6.ColumnWidths = ... trong UserForm_Initialize.
 
Upvote 0
Code này nhé bạn. Bạn cần 1 thư mục lưu trữ hình ảnh, trong file của bạn phải có cột dữ liệu chứa linh cho từng ảnh, hoặc lấy ảnh theo tên vật tư
PHP:
Private Sub ListBox7_Click()
' Created by Ban_V003518

Dim PicPath As String
PicPath = "G:\01. GPE\Chu ky Nguyen Van Huynh.jpg"

If Len(Dir(PicPath)) = 0 Then
MsgBox PicPath & " does not exist."
Else
Me.Image2.Picture = LoadPicture(PicPath)
Me.Repaint
End If

End Sub
trong file của bạn phải có cột dữ liệu chứa linh cho từng ảnh, hoặc lấy ảnh theo tên vật tư
-> cái này là sao vậy ạ, tạo 1 cột chứa link từng ảnh thì em biết, nhưng để nó hiện hình ảnh vào trong cái ô hình ảnh linh kiện kia thì sao vậy ạ!
Bài đã được tự động gộp:

Vấn đề là sửa ListBox6_Click thôi. Code ListBox6_Click không chuẩn. Viết kiểu đó (Then _) thì tất cả các dòng từ .TextBox3 = trở xuống sẽ luôn được thực hiện bất kể điều kiện IF có thỏa hay không. Sửa lại cho đúng và hiển thị ảnh
Mã:
Private Sub ListBox6_Click()
    With Me
        If .ListBox6.ListIndex >= 0 Then
            .TextBox2 = .ListBox6.List(.ListBox6.ListIndex, 0)
            .TextBox3 = .ListBox6.List(.ListBox6.ListIndex, 1)
            .TextBox4 = .ListBox6.List(.ListBox6.ListIndex, 2)
            .TextBox5 = .ListBox6.List(.ListBox6.ListIndex, 3)
            .TextBox6 = .ListBox6.List(.ListBox6.ListIndex, 4)
            .TextBox7 = .ListBox6.List(.ListBox6.ListIndex, 5)
            .Image2.Picture = ThisWorkbook.Path & "\Pictures\" & .ListBox6.List(.ListBox6.ListIndex, 5) & ".jpg"
        End If
    End With
End Sub
Do bạn không nói rõ, cột nào của ListBox chứa tên ảnh nên code ở trên cho là tên ảnh xuất phát từ cột H trong sheet "Data Processing 1".

Code trong module UserForm2 (tôi không xem các module khác) không chuẩn. Do không chuẩn nhiều chỗ (vd. như Then _ ở trên) nên tôi chỉ lưu ý 1 vấn đề. Cái gì chỉ cần làm 1 lần thì không ai lại đặt nó trong vòng lặp FOR để mà thực hiện nó hàng ngàn lần. Vd. không ai lại đặt ListBox6.Clear, TextBox2.Text = "", ..., TextBox7.Text = "", ListBox6.ColumnWidths = ... trong vòng lặp FOR của Sub TextBox1_Change. Thậm chí ListBox6.ColumnWidths = ... không ai đặt trong Sub TextBox1_Change để mà thực hiện nó mỗi khi TextBox1 có sự thay đổi. Nên đặt ListBox6.ColumnWidths = ... trong UserForm_Initialize.

Dạ em cảm ơn ý kiến của anh ạ, tại em cũng đang tập tành không rành ạ. Anh cho em hỏi xíu là khi copy mã của anh vào thì hình nó lấy từ đâu để hiển thị ạ!

1618571474291.png
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ em cảm ơn ý kiến của anh ạ, tại em cũng đang tập tành không rành ạ. Anh cho em hỏi xíu là khi copy mã của anh vào thì hình nó lấy từ đâu để hiển thị ạ!
Như tôi đã viết: Do bạn không nói rõ, cột nào của ListBox chứa tên ảnh nên code ở trên cho là tên ảnh xuất phát từ cột H trong sheet "Data Processing 1". Vậy thì cụ thể tên các ảnh lấy từ đâu trong CSDL? Nó được ghi ở cột nào của sheet "Data Processing 1"? Code của tôi cho là các tên ảnh lấy từ cột H, và do vậy trong ListBox6 thì các tên ảnh nằm ở cột thứ 6 có chỉ số là 5 (do chỉ số dòng và cột trong ListBox luôn bắt đầu từ 0). Đó là tên ảnh. Còn ảnh thì do tôi nhìn trong code của bạn có "Pictures" nên tôi đoán là trên đĩa có thư mục Pictures, ở cùng chung thư mục với tập tin Excel chứa code. Tóm lại code lấy từ cột có chỉ số 5 của ListBox6 tên ảnh cần hiển thị, và do biết nó nằm trong thư mục Pictures trên đĩa thì load nó vào Image2 thôi.
-------
À thôi chết, gõ trong notepad không để ý nên gõ thiếu. Phải là
Mã:
.Image2.Picture = LoadPicture(ThisWorkbook.Path & "\Pictures\" & .ListBox6.List(.ListBox6.ListIndex, 5) & ".jpg")
 
Lần chỉnh sửa cuối:
Upvote 0
Như tôi đã viết: Do bạn không nói rõ, cột nào của ListBox chứa tên ảnh nên code ở trên cho là tên ảnh xuất phát từ cột H trong sheet "Data Processing 1". Vậy thì cụ thể tên các ảnh lấy từ đâu trong CSDL? Nó được ghi ở cột nào của sheet "Data Processing 1"? Code của tôi cho là các tên ảnh lấy từ cột H, và do vậy trong ListBox6 thì các tên ảnh nằm ở cột thứ 6 có chỉ số là 5 (do chỉ số dòng và cột trong ListBox luôn bắt đầu từ 0). Đó là tên ảnh. Còn ảnh thì do tôi nhìn trong code của bạn có "Pictures" nên tôi đoán là trên đĩa có thư mục Pictures, ở cùng chung thư mục với tập tin Excel chứa code. Tóm lại code lấy từ cột có chỉ số 5 của ListBox6 tên ảnh cần hiển thị, và do biết nó nằm trong thư mục Pictures trên đĩa thì load nó vào Image2 thôi.
-------
À thôi chết, gõ trong notepad không để ý nên gõ thiếu. Phải là
Mã:
.Image2.Picture = LoadPicture(ThisWorkbook.Path & "\Pictures\" & .ListBox6.List(.ListBox6.ListIndex, 5) & ".jpg")
Trước hết em xin lỗi anh vì em hơi dốt cái vba này!
- Listbox6, là nơi chứa tên ảnh, và tên ảnh sẽ là mã linh kiện trong cột hiển thị ở listbox6, khi em nhấp vào 1 dòng linh kiện đó thì nó sẽ hiện ảnh ở Image2.
- sheet "Data Processing 1"Data em cũng không biết dùng nó để làm gì ạ!
- Bên dưới là file của em tới thời điểm hiện tại, em vẫn chưa hiểu lắm về ý của anh, mong anh giúp đỡ xem qua ạ!
 

File đính kèm

  • 1618575021479.png
    1618575021479.png
    281.5 KB · Đọc: 19
  • File kho.rar
    798.6 KB · Đọc: 31
Upvote 0
Trước hết em xin lỗi anh vì em hơi dốt cái vba này!
Nhìn tên 2 ảnh trong tập tin đính kèm thì tên linh kiện cũng chính là tên ảnh. Tức tên ảnh lấy từ cột TÊN của ListBox6 (nó được nhập từ cột B của sheet "Data Processing 1"). Vậy thì sửa thành
Mã:
.Image2.Picture = LoadPicture(ThisWorkbook.Path & "\Pictures\" & .ListBox6.List(.ListBox6.ListIndex, 1) & ".jpg")

Cột TÊN là cột thứ 2 nhưng có chỉ số là 1 (do chỉ số dòng và cột trong ListBox tính từ 0), vì thế mà phải là 1 trong
.ListBox6.List(.ListBox6.ListIndex, 1)
 
Upvote 0
Nhìn tên 2 ảnh trong tập tin đính kèm thì tên linh kiện cũng chính là tên ảnh. Tức tên ảnh lấy từ cột TÊN của ListBox6 (nó được nhập từ cột B của sheet "Data Processing 1"). Vậy thì sửa thành
Mã:
.Image2.Picture = LoadPicture(ThisWorkbook.Path & "\Pictures\" & .ListBox6.List(.ListBox6.ListIndex, 1) & ".jpg")

Cột TÊN là cột thứ 2 nhưng có chỉ số là 1 (do chỉ số dòng và cột trong ListBox tính từ 0), vì thế mà phải là 1 trong
.ListBox6.List(.ListBox6.ListIndex, 1)
Khi em sửa mã rồi thì nó vẫn báo Bug ạ.
Em đang sai ở chỗ nào vậy ạ! Nhờ anh giúp đỡ.


1618621311948.png
 
Upvote 0
LoadPicture sẽ có lỗi nếu đường dẫn đầy đủ tới ảnh có chứa vd. ký tự Việt. Nhưng với thông báo lỗi như thế thì lý do là khác.

Hãy thử chuyển toàn bộ thư mục "File kho" sang chỗ khác, đĩa khác xem sao. Và đọc trên mạng về "Path/File access error". Tôi chạy trên máy tôi bình thường. Lỗi không phải do dòng code mà tôi thêm cho bạn.
 
Upvote 0
LoadPicture sẽ có lỗi nếu đường dẫn đầy đủ tới ảnh có chứa vd. ký tự Việt. Nhưng với thông báo lỗi như thế thì lý do là khác.

Hãy thử chuyển toàn bộ thư mục "File kho" sang chỗ khác, đĩa khác xem sao. Và đọc trên mạng về "Path/File access error". Tôi chạy trên máy tôi bình thường. Lỗi không phải do dòng code mà tôi thêm cho bạn.
Cảm ơn anh rất nhiều ạ, đúng là đường dẫn file có chứa tiếng việt

Cảm ơn anh nhiều luôn ạ, chúc anh nhiều sức khỏe để tiếp tục giúp đỡ những người như tụi em kkkk
 
Upvote 0
LoadPicture sẽ có lỗi nếu đường dẫn đầy đủ tới ảnh có chứa vd. ký tự Việt. Nhưng với thông báo lỗi như thế thì lý do là khác.

Hãy thử chuyển toàn bộ thư mục "File kho" sang chỗ khác, đĩa khác xem sao. Và đọc trên mạng về "Path/File access error". Tôi chạy trên máy tôi bình thường. Lỗi không phải do dòng code mà tôi thêm cho bạn.
Em cần anh giúp đỡ em 1 tí nữa ạ!
Hiện tại em nhấp vào những dòng có hình thì hiện hình lên rùi ạ, nhưng bấm vào những dòng không có hình thì nó báo bug
Giờ em muốn khi nhấp vào những dòng không có hình thì nó sẽ hiện ra một tấm hình tên là nopicture.pgn mà em đã đễ sẵn thì làm sao ạ
 
Upvote 0
Giờ em muốn khi nhấp vào những dòng không có hình thì nó sẽ hiện ra một tấm hình tên là nopicture.pgn mà em đã đễ sẵn thì làm sao ạ
Ta sửa code sao cho có thể dùng đường dẫn tiếng Việt và không tiếng Việt.

1. Chép code sau vào module nào đó
Mã:
Function GetShortPathName(ByVal fullfilename1 As String, Optional ByVal fullfilename2 As String = "") As String
'    Ham tra ve duong dan ngan cua duong dan dai.
'    Neu tap tin co ten la fullfilename1 ton tai thi ham tra ve duong dan ngan cua duong dan dai fullfilename1,
'    nguoc lai thi neu tap tin co ten la fullfilename2 ton tai thi ham tra ve duong dan ngan cua duong dan dai fullfilename2,
'    con neu khong (vi du khong cung cap fullfilename2) thi tra ve chuoi rong.
'    vd.goi: shortName = GetShortPathName("c:\hichic.txt"). Neu "c:\hichic.txt" khong ton tai thi shortName = "" do fullfilename2 = ""
Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    If fso.FileExists(fullfilename1) Then
        GetShortPathName = fso.GetFile(fullfilename1).ShortPath
    ElseIf fso.FileExists(fullfilename2) Then
        GetShortPathName = fso.GetFile(fullfilename2).ShortPath
    End If
    Set fso = Nothing
End Function

2. Để có thể dùng các đường dẫn có chứa ký tự tiếng Việt thì mỗi khi dùng LoadPicture thì không truyền vào nó đường dẫn đầy đủ mà truyền đường dẫn ngắn trả về bởi hàm GetShortPathName.
2a. Khi không cần dùng đường dẫn thay thế. Tức nếu "<đường dẫn đầy đủ>" không tồn tại thì chấp nhận shortName = ""
shortName = GetShortPathName("<đường dẫn đầy đủ>")

2b. Khi cần dùng đường dẫn thay thế. Tức nếu "<đường dẫn đầy đủ>" không tồn tại thì shortName = đường dẫn rút gọn của "đường dẫn thay thế". Nếu "đường dẫn thay thế" cũng không tồn tại thì shortName = ""
shortName = GetShortPathName("<đường dẫn đầy đủ>", "đường dẫn thay thế")

Trong trường hợp của bạn "đường dẫn thay thế" = đường dẫn tới tập tin "nopicture.jpg"
---------
Sửa Sub ListBox6_Click thành
Mã:
Private Sub ListBox6_Click()
Dim path As String, shortName As String
    With Me
        If .ListBox6.ListIndex >= 0 Then
            .TextBox2 = .ListBox6.List(.ListBox6.ListIndex, 0)
            .TextBox3 = .ListBox6.List(.ListBox6.ListIndex, 1)
            .TextBox4 = .ListBox6.List(.ListBox6.ListIndex, 2)
            .TextBox5 = .ListBox6.List(.ListBox6.ListIndex, 3)
            .TextBox6 = .ListBox6.List(.ListBox6.ListIndex, 4)
            .TextBox7 = .ListBox6.List(.ListBox6.ListIndex, 5)
            path = ThisWorkbook.path & "\Pictures\"
            shortName = GetShortPathName(path & .ListBox6.List(.ListBox6.ListIndex, 1) & ".jpg", path & "nopicture.jpg")
            .Image2.Picture = LoadPicture(shortName)
        End If
    End With
End Sub

Lưu ý: trong thư mục Pictures phải có tập tin "nopicture.jpg" chứ không phải là "nopicture.pgn"
 
Upvote 0
Ta sửa code sao cho có thể dùng đường dẫn tiếng Việt và không tiếng Việt.

1. Chép code sau vào module nào đó
Mã:
Function GetShortPathName(ByVal fullfilename1 As String, Optional ByVal fullfilename2 As String = "") As String
'    Ham tra ve duong dan ngan cua duong dan dai.
'    Neu tap tin co ten la fullfilename1 ton tai thi ham tra ve duong dan ngan cua duong dan dai fullfilename1,
'    nguoc lai thi neu tap tin co ten la fullfilename2 ton tai thi ham tra ve duong dan ngan cua duong dan dai fullfilename2,
'    con neu khong (vi du khong cung cap fullfilename2) thi tra ve chuoi rong.
'    vd.goi: shortName = GetShortPathName("c:\hichic.txt"). Neu "c:\hichic.txt" khong ton tai thi shortName = "" do fullfilename2 = ""
Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    If fso.FileExists(fullfilename1) Then
        GetShortPathName = fso.GetFile(fullfilename1).ShortPath
    ElseIf fso.FileExists(fullfilename2) Then
        GetShortPathName = fso.GetFile(fullfilename2).ShortPath
    End If
    Set fso = Nothing
End Function

2. Để có thể dùng các đường dẫn có chứa ký tự tiếng Việt thì mỗi khi dùng LoadPicture thì không truyền vào nó đường dẫn đầy đủ mà truyền đường dẫn ngắn trả về bởi hàm GetShortPathName.
2a. Khi không cần dùng đường dẫn thay thế. Tức nếu "<đường dẫn đầy đủ>" không tồn tại thì chấp nhận shortName = ""
shortName = GetShortPathName("<đường dẫn đầy đủ>")

2b. Khi cần dùng đường dẫn thay thế. Tức nếu "<đường dẫn đầy đủ>" không tồn tại thì shortName = đường dẫn rút gọn của "đường dẫn thay thế". Nếu "đường dẫn thay thế" cũng không tồn tại thì shortName = ""
shortName = GetShortPathName("<đường dẫn đầy đủ>", "đường dẫn thay thế")

Trong trường hợp của bạn "đường dẫn thay thế" = đường dẫn tới tập tin "nopicture.jpg"
---------
Sửa Sub ListBox6_Click thành
Mã:
Private Sub ListBox6_Click()
Dim path As String, shortName As String
    With Me
        If .ListBox6.ListIndex >= 0 Then
            .TextBox2 = .ListBox6.List(.ListBox6.ListIndex, 0)
            .TextBox3 = .ListBox6.List(.ListBox6.ListIndex, 1)
            .TextBox4 = .ListBox6.List(.ListBox6.ListIndex, 2)
            .TextBox5 = .ListBox6.List(.ListBox6.ListIndex, 3)
            .TextBox6 = .ListBox6.List(.ListBox6.ListIndex, 4)
            .TextBox7 = .ListBox6.List(.ListBox6.ListIndex, 5)
            path = ThisWorkbook.path & "\Pictures\"
            shortName = GetShortPathName(path & .ListBox6.List(.ListBox6.ListIndex, 1) & ".jpg", path & "nopicture.jpg")
            .Image2.Picture = LoadPicture(shortName)
        End If
    End With
End Sub

Lưu ý: trong thư mục Pictures phải có tập tin "nopicture.jpg" chứ không phải là "nopicture.pgn"
Em cảm ơn anh rất nhiêu ạ, em đã làm được rồi, chúc anh nhiều sức khỏe ạ
 
Upvote 0
cho mình xin sourse code File bạn vừa làm OK dk không.Mình cũng đang có dự án liên quan.Thanks you!!!
 
Upvote 0
Web KT
Back
Top Bottom