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
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.
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 ạ!
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ị ạ!
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ị ạ!
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 ạ!
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 ạ
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
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"
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
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"