Board logo

標題: 請問我這VBA哪裡有問題?為什麼會無法出現 424 無法找到物件呢? [打印本頁]

作者: jeffrey628litw    時間: 2018-6-12 19:36     標題: 請問我這VBA哪裡有問題?為什麼會無法出現 424 無法找到物件呢?

請問各位前輩先進

如何讓這檔案      [attach]28825[/attach]         可以像右邊這檔案開啟圖檔呢?   [attach]28824[/attach]


     右邊的檔案 圖片如下:

[attach]28826[/attach]

請問我這VBA哪裡有問題?為什麼會無法出現 424 無法找到物件呢?

Private Sub ComboBox1_Change()
Dim a As Range
Application.ScreenUpdating = False
With Database
  Set a = .Columns("E").Find(ComboBox1, lookat:=xlWhole)
  Label1.Caption = a.Offset(, 1)
  a.Offset(, 1).CopyPicture '複製成圖片   a.Offset(, 1).  1為傳回上1行程式 a = .Columns("E").後1格儲存格的圖片
  With .ChartObjects.Add(1, 1, a.Offset(, 2).Width, a.Offset(, 2).Height) '新增圖表
    .Chart.Paste '貼上圖片
    .Chart.Export "D:\temp.jpg" '匯出圖表,暫存圖片
    .Delete '刪除圖表
  End With
  Image1.Picture = LoadPicture("D:\temp.jpg") '表單顯示圖片
  Kill "D:\temp.jpg" '刪除暫存圖片
End With
Application.ScreenUpdating = True
End Sub



Private Sub UserForm_Initialize()
Dim a As Range
Set d = CreateObject("Scripting.Dictionary")
With Database
   For Each a In .Range(.[E2], .[E2].End(xlDown))
      d(a.Value) = ""
   Next
End With
ComboBox1.List = d.keys
End Sub


-------------------------------------------------------------------
謝謝各位
作者: GBKEE    時間: 2018-6-13 08:26

本帖最後由 GBKEE 於 2018-6-13 08:27 編輯

回復 1# jeffrey628litw

試試看
  1. Option Explicit                  '強制 模組的變數必須要 Dim的宣告,會使程式易於偵錯
  2. Dim D As Object, Sh As Worksheet '模組頂端上 Dim的變數 可在UserForm1的全部程式中使用
  3. Private Sub UserForm_Initialize()
  4.     Dim A As Range, S As String
  5.     Set D = CreateObject("Scripting.Dictionary")
  6.     Set Sh = Sheets("Database") '工作表如有變動時在此修改即可
  7.     'With Sheets("Database") ' 或是 With Sheet1
  8.     With Sh
  9.         For Each A In .Range(.[E2], .[E2].End(xlDown))
  10.             '**************************
  11.             'F10 ,F11 有換行字元 需修改
  12.             '大 谷翔平
  13.             'Shohei Ohtan
  14.             '***************************
  15.             S = Replace(Trim(A), vbLf, Space(1))  '換行字元 改成 Space(1)
  16.             Set D(S) = Range(A.Offset(, 1).Address)
  17.             'Debug.Print S, D(S).Address  '指令:檢視->及時視窗可看看
  18.         Next
  19.     End With
  20.     ComboBox1.List = D.keys
  21.     Label1.WordWrap = False   '內容在行末是否自動換行
  22.     With Image1               '設定圖片的顯示設模式
  23.         .PictureAlignment = fmPictureAlignmentCenter '2
  24.         .PictureSizeMode = fmPictureSizeModeClip     '0
  25.     End With
  26. End Sub
  27. Private Sub ComboBox1_Change()
  28.     Dim A As Range
  29.     Label1.Caption = "沒有此圖片"
  30.     Image1.Picture = LoadPicture("") '不顯示圖片
  31.     'Image1.Visible = False      '或是隱藏
  32.     If ComboBox1.ListIndex = -1 Then Exit Sub
  33.     If 圖片檢查(D(ComboBox1.Value).Address) = False Then Exit Sub
  34.     'Image1.Visible = True      '顯示
  35. End Sub
  36. Private Function 圖片檢查(xPicture As String) As Boolean
  37.     Dim S As Shape, P As Object, xTop As Double
  38.     For Each S In Sh.Shapes
  39.         '*************************************************
  40.         'Shape物件是照片且位置是D(ComboBox1.Value).Address)
  41.         If S.Type = msoPicture And S.TopLeftCell.Address = xPicture Then
  42.             圖片檢查 = True
  43.             S.Copy  '圖片複製
  44.             Set P = S
  45.             Exit For
  46.         End If
  47.         '***************************************************
  48.     Next
  49.     If 圖片檢查 = True Then
  50.         With Sh
  51.             Label1.Caption = ComboBox1
  52.             With .ChartObjects.Add(1, 1, P.Width, P.Height) '新增圖表
  53.                 .Chart.Paste '貼上圖片
  54.                 .Chart.Export "D:\temp.jpg" '匯出圖表,暫存圖片
  55.                 .Delete '刪除圖表
  56.             End With
  57.             Image1.Picture = LoadPicture("D:\temp.jpg") '表單顯示圖片
  58.             Kill "D:\temp.jpg" '刪除暫存圖片
  59.         End With
  60.     End If
複製代碼

作者: jeffrey628litw    時間: 2018-6-13 14:11

回復 2# GBKEE


    謝謝 G 超級版主的回覆,目前發現最後要加 End Function 就可以Run了,其他還在研究中,超級感謝您的幫忙。
作者: jeffrey628litw    時間: 2018-6-13 22:26

回復  jeffrey628litw

試試看
GBKEE 發表於 2018-6-13 08:26



    請問我想要按Display Photo按鈕後,
    下拉選單 Player Name
     選Mchael  Jordan 後可以出現
      Image1:為F2圖案
       Image2為F3圖案

       類似EBAY 篩選完有陣列圖表,類似下圖

[attach]28832[/attach]

檔案在雲端  http://webhd.xuite.net/_oops/jeffrey628litw/c6x
作者: GBKEE    時間: 2018-6-15 09:31

回復 4# jeffrey628litw
試試看
  1. Option Explicit                  '強制 模組的變數必須要 Dim的宣告,會使程式易於偵錯
  2. Dim D As Object, Sh(1 To 2) As Worksheet '模組頂端上 Dim的變數 可在UserForm1的全部程式中使用
  3. Dim xTempPicture As String
  4. Private Sub UserForm_Initialize()
  5.     Dim A As Range, S As String
  6.     Set D = CreateObject("Scripting.Dictionary")
  7.     Set Sh(1) = ThisWorkbook.Sheets("Database") '工作表如有變動時在此修改即可
  8.     Set Sh(2) = ThisWorkbook.Sheets.Add
  9.     xTempPicture = "D:\IE.jpg"
  10.     匯入圖片   '載入表單畫面圖片
  11.     With Sh(1)
  12.         For Each A In .Range(.[E2], .[E2].End(xlDown))
  13.             '**************************
  14.             'F10 ,F11 有換行字元 需修改
  15.             '大 谷翔平
  16.             'Shohei Ohtan
  17.             '***************************
  18.             S = Replace(Trim(A), vbLf, Space(1)) '換行字元 改成 Space(1)
  19.             Set D(S) = Range(A.Offset(, 1).Address)
  20.             'Debug.Print S, D(S).Address  '指令:檢視->及時視窗可看看
  21.         Next
  22.     End With
  23.     ComboBox1.List = D.KEYS
  24.     Label1.WordWrap = False   '內容在行末是否自動換行
  25.     With Image1               '設定圖片的顯示設模式
  26.         .Picture = LoadPicture(xTempPicture)
  27.         .PictureAlignment = fmPictureAlignmentCenter '2
  28.         .PictureSizeMode = fmPictureSizeModeClip     '0
  29.     End With
  30.     With Image2               '設定圖片的顯示設模式
  31.         .Picture = LoadPicture(xTempPicture)
  32.         .PictureAlignment = fmPictureAlignmentCenter '2
  33.         .PictureSizeMode = fmPictureSizeModeClip     '0
  34.     End With
  35. End Sub
  36. Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  37.     Application.DisplayAlerts = False
  38.     Sh(2).Delete
  39.     Kill xTempPicture
  40.     Application.DisplayAlerts = True
  41. End Sub
  42. Private Sub ComboBox1_Change()
  43.     Dim A As Range
  44.     Label1.Caption = "沒有此圖片"
  45.     Image1.Picture = LoadPicture(xTempPicture) '表單預設的圖片
  46.     Image2.Picture = LoadPicture(xTempPicture) '表單預設的圖片
  47.     'Image1.Visible = False      '或是隱藏
  48.     With ComboBox1
  49.         If .ListIndex = -1 Then Exit Sub
  50.         圖片檢查 D(.List(.ListIndex)).Address, Image1
  51.         If 圖片檢查(D(.Value).Address, Image1) Then Label1.Caption = ComboBox1
  52.         If .ListIndex < .ListCount - 1 Then 圖片檢查 D(.List(.ListIndex + 1)).Address, Image2
  53.     End With
  54. End Sub
  55. Private Function 圖片檢查(xPicture As String, xImage As Image) As Boolean
  56.     Dim S As Shape, P As Object, xName As String
  57.     For Each S In Sh(1).Shapes
  58.         '*************************************************
  59.         'Shape物件是照片且位置是D(ComboBox1.Value).Address)
  60.         If S.Type = msoPicture And S.TopLeftCell.Address = xPicture Then
  61.             圖片檢查 = True
  62.             Set P = S '.Copy '圖片複製
  63.             Exit For
  64.         End If
  65.         '***************************************************
  66.     Next
  67.     If 圖片檢查 = True Then
  68.         xName = "D:\temp.jpg"
  69.         照片Export P, xName
  70.         xImage.Picture = LoadPicture(xName) '表單顯示圖片
  71.         Kill xName ' "D:\temp.jpg" '刪除暫存圖片
  72.     End If
  73.     End Function
  74. Private Sub 照片Export(P As Object, xName As String)
  75.     P.Copy
  76.     With Sh(2).ChartObjects.Add(1, 1, P.Width, P.Height) '新增圖表
  77.         .Chart.Paste '貼上圖片
  78.         .Chart.Export xName '匯出圖表,暫存圖片
  79.         .Delete '刪除圖表
  80.      End With
  81. End Sub
  82. Sub 匯入圖片()
  83.     Dim P As Picture
  84.     With Sh(2)
  85.         Set P = .Pictures.Insert("http://forum.twbts.com/templates/discuz6/images/logotop.png") '(工作表上插入照片)
  86.         With [a1]                           '指定的儲存格
  87.             P.Top = .Top                    '照片的右方在工作表上的位置
  88.             P.Left = .Left                  '照片的右方在工作表上的位置
  89.             .RowHeight = IIf(P.Height >= 409, 409, P.Height)        '調整儲存格高度=>照片的高度
  90.             P.Height = IIf(P.Height >= 409, 409, P.Height)          '調整儲存格高度=>照片的高度
  91.             If .Width < P.Width * (.ColumnWidth / .Width) Then   '下載照片的最大寬度
  92.              .Width = P.Width * (.ColumnWidth / .Width)
  93.             .ColumnWidth = P.Width * (.ColumnWidth / .Width)    '調整儲存格欄寬=>照片的寬度
  94.             End If
  95.        End With
  96.      End With
  97.     照片Export P, xTempPicture
  98. End Sub
複製代碼

作者: jeffrey628litw    時間: 2018-6-15 13:32

本帖最後由 jeffrey628litw 於 2018-6-15 13:45 編輯

回復 5# GBKEE


    超級版主您好:
我發現有3個問題,要麻煩您,問題如下:
1.    問題1.
預設圖案撈 F1儲存格圖案 (或者您這裡可以寫成預設圖片是Null)
[attach]28839[/attach]

2.    問題2.
撈的名字正確的圖案會出來,但會多撈下1欄圖片,沒有資料的應該撈的圖是F1儲存格的沒有圖片 (如果問題1您寫成預設圖片是Null那就不用撈F1儲存格)
[attach]28840[/attach]

3.    問題3.
撈同名字時例如大谷翔平,撈不出同樣名字但不同圖片

現狀:
[attach]28841[/attach]
希望改善成Combobox1 (即下拉 Players Name)撈同名字時能撈出不同圖,如下圖:
[attach]28842[/attach]


補充圖片給您放入F1儲存格或者寫程式路徑抓圖用:[attach]28843[/attach]

檔案在雲端:http://webhd.xuite.net/_oops/jeffrey628litw/l0e
作者: GBKEE    時間: 2018-6-15 16:39

回復 6# jeffrey628litw
再試試
  1. Option Explicit                  '強制 模組的變數必須要 Dim的宣告,會使程式易於偵錯
  2. Dim Sh(1 To 2) As Worksheet, xTempPicture As String '模組頂端上 Dim的變數 可在UserForm1的全部程式中使用
  3. Private Sub UserForm_Initialize()
  4.     Dim A As Range, i As Integer
  5.     Set Sh(1) = ThisWorkbook.Sheets("Database") '工作表如有變動時在此修改即可
  6.     Set Sh(2) = ThisWorkbook.Sheets.Add
  7.     匯入圖片   '置入"沒有圖片"檔
  8.      '不要用字典物件    Set D = CreateObject("Scripting.Dictionary")
  9.     With ComboBox1
  10.         For Each A In Sh(1).Range(Sh(1).[E3], Sh(1).[E3].End(xlDown))
  11.            'ColumnCount 屬性 若將 ColumnCount 設成 0,顯示的行數便是 0;若設成 -1,便顯示所有的資料行。對一個非資料連結的資料來源而言,最多只能有 10 行 (0 到 9)。
  12.             .ColumnCount = 2  '了解後,可不用此行程式碼?
  13.             .AddItem
  14.             .List(.ListCount - 1, 0) = A
  15.             .List(.ListCount - 1, 1) = A.Offset(, 1).Address
  16.         Next
  17.     End With
  18.     Label1.WordWrap = False   '內容在行末是否自動換行
  19.     Label4.WordWrap = False   '*******新增Label控制項
  20.    
  21.     With Image1               '設定圖片的顯示設模式
  22.         .Picture = LoadPicture(xTempPicture)
  23.         .PictureAlignment = fmPictureAlignmentCenter '2
  24.         .PictureSizeMode = fmPictureSizeModeClip     '0
  25.     End With
  26.     With Image2               '設定圖片的顯示設模式
  27.         .Picture = LoadPicture(xTempPicture)
  28.         .PictureAlignment = fmPictureAlignmentCenter '2
  29.         .PictureSizeMode = fmPictureSizeModeClip     '0
  30.     End With
  31. End Sub
  32. Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  33.     Application.DisplayAlerts = False
  34.     Sh(2).Delete
  35.     Kill xTempPicture
  36.     Application.DisplayAlerts = True
  37. End Sub
  38. Private Sub ComboBox1_Change()
  39.     Dim A As Range
  40.     Label1.Caption = "沒有此圖片"
  41.     Label4.Caption = "沒有此圖片"  '*******新增Label控制項
  42.     Image1.Picture = LoadPicture(xTempPicture) '表單預設的圖片
  43.     Image2.Picture = LoadPicture(xTempPicture) '表單預設的圖片
  44.     With ComboBox1
  45.         If .ListIndex = -1 Then Exit Sub
  46.         If 圖片檢查(.List(.ListIndex, 1), Image1) = True Then Label1.Caption = .Value
  47.         If .ListIndex < .ListCount - 1 Then
  48.             If 圖片檢查(.List(.ListIndex + 1, 1), Image2) Then Label4.Caption = .List(.ListIndex + 1, 0)
  49.                                                                '*******新增Label控制項
  50.         End If
  51.     End With
  52. End Sub
  53. Private Function 圖片檢查(xPicture As String, xImage As Image) As Boolean
  54.     Dim S As Shape, P As Object, xName As String
  55.     For Each S In Sh(1).Shapes
  56.         '*************************************************
  57.         'Shape物件是照片且位置是D(ComboBox1.Value).Address)
  58.         If S.Type = msoPicture And S.TopLeftCell.Address = xPicture Then
  59.             圖片檢查 = True
  60.             Set P = S '.Copy '圖片複製
  61.             Exit For
  62.         End If
  63.         '***************************************************
  64.     Next
  65.     If 圖片檢查 = True Then
  66.         xName = "D:\temp.jpg"
  67.         照片Export P, xName
  68.         xImage.Picture = LoadPicture(xName) '表單顯示圖片
  69.         Kill xName ' "D:\temp.jpg" '刪除暫存圖片
  70.     End If
  71.     End Function
  72. Private Sub 照片Export(P As Object, xName As String)
  73.     P.Copy
  74.     With Sh(2).ChartObjects.Add(1, 1, P.Width, P.Height) '新增圖表
  75.         .Chart.Paste '貼上圖片
  76.         .Chart.Export xName '匯出圖表,暫存圖片
  77.         .Delete '刪除圖表
  78.      End With
  79. End Sub
  80. Sub 匯入圖片()
  81.     Dim P As Range
  82.     xTempPicture = "D:\NoPicture.jpg"
  83.     Set P = Sh(1).[f2]
  84.     P.CopyPicture
  85.     With Sh(2).ChartObjects.Add(1, 1, P.Width, P.Height) '新增圖表
  86.         .Chart.Paste '貼上圖片
  87.         .Chart.Export xTempPicture '匯出圖表,暫存圖片
  88.         .Delete '刪除圖表
  89.      End With
  90. End Sub
複製代碼

作者: jeffrey628litw    時間: 2018-6-15 18:31

回復 7# GBKEE


    G大 超級版主您好,我看您已經有將我問題1解決了,另外要程式中說明要新增 Lable4 我也新增了,

    問題2和3還沒解決,

   接下來,
程式的邏輯是要依據撈出的Lable4 如果結果同Lable1的字串,則撈出圖片,否則撈出Null的圖片嗎?

   是這樣的話請問要如何寫呢? 因為我對於VBA實在幾乎完全不了解,能否請您幫忙一點一點解給我看,我慢慢學呢?
謝謝您。

檔案在雲端:http://webhd.xuite.net/_oops/jeffrey628litw/wyh
作者: GBKEE    時間: 2018-6-16 06:22

本帖最後由 GBKEE 於 2018-6-16 06:26 編輯

回復 8# jeffrey628litw
對於VBA不了解,可多看看論壇的主題及VBA上說明,並多練習,會進步的
不懂可提問.內容讓人看懂就會得到回覆(義務性)

如有不符,請再詳加說明
  1. Option Explicit                  '強制 模組的變數必須要 Dim的宣告,會使程式易於偵錯
  2. Dim Sh(1 To 2) As Worksheet, D As Object, xTempPicture As String  '模組頂端上 Dim的變數 可在UserForm1的全部程式中使用
  3. Private Sub UserForm_Initialize()
  4.     Dim A As Range, S As String
  5.     Set Sh(1) = ThisWorkbook.Sheets("Database") '工作表如有變動時在此修改即可
  6.     Set Sh(2) = ThisWorkbook.Sheets.Add
  7.      xTempPicture = "D:\NoPicture.jpg"
  8.     照片Export Sh(1).Range("F2"), xTempPicture '置入"沒有圖片"檔
  9.     Set D = CreateObject("Scripting.Dictionary")
  10.     For Each A In Sh(1).Range(Sh(1).[E3], Sh(1).[E3].End(xlDown))
  11.          S = Replace(Trim(A), vbLf, Space(1)) '換行字元 改成 Space(1)
  12.             If D.EXISTS(S) Then
  13.                 D(S) = D(S) & "," & A.Offset(, 1).Address
  14.             Else
  15.                 D(S) = A.Offset(, 1).Address
  16.             End If
  17.     Next
  18.     ComboBox1.List = D.KEYS
  19.     Label1.WordWrap = False   '內容在行末是否自動換行
  20.     Label4.WordWrap = False   '*******新增Label控制項
  21.     With Image1               '設定圖片的顯示設模式
  22.         .Picture = LoadPicture(xTempPicture)
  23.         .PictureAlignment = fmPictureAlignmentCenter '2
  24.         .PictureSizeMode = fmPictureSizeModeClip     '0
  25.     End With
  26.     With Image2               '設定圖片的顯示設模式
  27.         .Picture = LoadPicture(xTempPicture)
  28.         .PictureAlignment = fmPictureAlignmentCenter '2
  29.         .PictureSizeMode = fmPictureSizeModeClip     '0
  30.     End With
  31. End Sub
  32. Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  33.     Application.DisplayAlerts = False
  34.     Sh(2).Delete
  35.     Kill xTempPicture
  36.     Application.DisplayAlerts = True
  37. End Sub
  38. Private Sub ComboBox1_Change()
  39.     Dim A As Variant, i As Integer, S As String
  40.     Label1.Caption = "沒有此圖片"
  41.     Label4.Caption = "沒有此圖片"  '*******新增Label控制項
  42.     Image1.Picture = LoadPicture(xTempPicture) '表單預設的圖片
  43.     Image2.Picture = LoadPicture(xTempPicture) '表單預設的圖片
  44.     With ComboBox1
  45.         If .ListIndex = -1 Then Exit Sub
  46.         A = Split(D(.Value), ",")
  47.         For i = 0 To 1
  48.             If i <= UBound(A) Then
  49.                 S = A(i)
  50.                 If 圖片檢查(S, IIf(i = 0, Image1, Image2)) Then Label1.Caption = .Value
  51.             End If
  52.         Next
  53.         Label4.Visible = UBound(A) = 0   '有相同的 Player Name 則不顯示
  54.         If UBound(A) = 0 And .ListIndex < .ListCount - 1 Then
  55.             A = Split(D(.List(.ListIndex + 1)), ",")
  56.             S = A(0)
  57.             If 圖片檢查(S, Image2) Then Label4.Caption = .List(.ListIndex + 1, 0)
  58.                                                                '*******新增Label控制項
  59.         End If
  60.     End With
  61. End Sub
  62. Private Function 圖片檢查(xPicture As String, xImage As Image) As Boolean
  63.     Dim S As Shape, xName As String
  64.     For Each S In Sh(1).Shapes
  65.         '*************************************************
  66.         'Shape物件是照片且位置是D(ComboBox1.Value).Address)
  67.         If S.Type = msoPicture And S.TopLeftCell.Address = xPicture Then
  68.             圖片檢查 = True
  69.             Exit For
  70.         End If
  71.         '***************************************************
  72.     Next
  73.     If 圖片檢查 = True Then
  74.         xName = "D:\temp.jpg"
  75.         照片Export S, xName
  76.         xImage.Picture = LoadPicture(xName) '表單顯示圖片
  77.         Kill xName ' "D:\temp.jpg" '刪除暫存圖片
  78.     End If
  79.     End Function
  80. Private Sub 照片Export(P As Object, xName As String)
  81.     If xName <> "D:\temp.jpg" Then
  82.         P.CopyPicture
  83.     Else
  84.         P.Copy
  85.     End If
  86.     With Sh(2).ChartObjects.Add(1, 1, P.Width, P.Height) '新增圖表
  87.         .Chart.Paste '貼上圖片
  88.         .Chart.Export xName '匯出圖表,暫存圖片
  89.         .Delete '刪除圖表
  90.      End With
  91. End Sub
複製代碼

作者: jeffrey628litw    時間: 2018-6-16 11:22

回復 9# GBKEE


    G大 版主您好:我看了問題3也解決了,剩下問題2,這邏輯是要寫

當Lable1 And Lable4 不為空時且不相同,則顯示2張圖片到Image1 和Image4,
否則 當Lable1不等於 Label4,則顯示Image1 且 Image4為空
否則 當Label1等於空,Lable4不等於空,則顯示Image1為空 且顯示 Image4的圖片

是這樣子嗎? 是的話程式要怎麼寫呢?再請您賜教,謝謝。

雲端檔案:http://webhd.xuite.net/_oops/jeffrey628litw/gdn
作者: GBKEE    時間: 2018-6-17 10:50

本帖最後由 GBKEE 於 2018-6-17 11:04 編輯

回復 10# jeffrey628litw

2.    問題2.
撈的名字正確的圖案會出來,但會多撈下1欄圖片,沒有資料的應該撈的圖是F1儲存格的沒有圖片 (如果問題1您寫成預設圖片是Null那就不用撈F1儲存格)
這是 6#中的提問
我理解是ComboBox1所選的名字有圖案時 顯視在Image1,沒有圖案時Image1成預設圖片(給的程式是這樣寫沒錯)

關於Image2 這程式碼條件成立時才處理(這是我多做的處理嗎?)
  1. If UBound(A) = 0 And .ListIndex < .ListCount - 1 Then
複製代碼
UBound(A) = 0   **ComboBox1所選的名字在Database中是一的名字**
.ListIndex < .ListCount - 1   **所選的名字在ComboBox1的list中不是最後一個value(值)名字
下個名字的圖片顯視在Image2

如不處理則開頭就處理了
  1. Private Sub ComboBox1_Change()
  2.     Dim A As Variant, i As Integer, S As String
  3.     Label1.Caption = "沒有此圖片"
  4.     Label4.Caption = "沒有此圖片"  '*******新增Label控制項
  5.     Image1.Picture = LoadPicture(xTempPicture) '表單預設的圖片
  6.     Image2.Picture = LoadPicture(xTempPicture) '表單預設的圖片
複製代碼
*****************************
3.    問題3.
撈同名字時例如大谷翔平,撈不出同樣名字但不同圖片,希望改善成Combobox1 (即下拉 Players Name)撈同名字時能撈出不同圖
UBound(A) > 0時-> **ComboBox1所選的名字在Database不是一的名字**
  1. A = Split(D(.Value), ",")
  2.         For i = 0 To 1
  3.             If i <= UBound(A) Then
  4.                 S = A(i)
  5.                 If 圖片檢查(S, IIf(i = 0, Image1, Image2)) Then Label1.Caption = .Value
  6.             End If
  7.         Next
複製代碼

作者: jeffrey628litw    時間: 2018-6-17 11:36

回復 11# GBKEE


    G大 版主您好:對於問題2 我有照您說的將哪一段程式隱藏就不會將沒有的資料對應的圖片,撈出下一張圖片了。
是我之前沒有跟您說清楚。

   這樣就全部解決了我的問題了,很感謝您這麼有耐心地回覆我的問題,再次感謝您。
作者: jeffrey628litw    時間: 2018-6-18 09:43

本帖最後由 jeffrey628litw 於 2018-6-18 09:46 編輯

回復 11# GBKEE


    G大 版大您好:我有自己改成可以撈4個圖片的檔案,如今有新的問題:
1.顯示圖片可以自動調整圖片大小在框框內:將Display Each Player Photo 這按鈕顯示的白色框框內圖片可以
自動顯示和 After Sieve Display Photo 白色框框內圖片自動調整大小及位置

[attach]28862[/attach]    改成-->[attach]28861[/attach]  同大小及位置

2.想要顯示圖片資料,以便超連結到Database 工作表,(不知是否用Textbox,是的話要如何寫VBA呢?)
1.希望將工作表Database 裡面將E欄對應B欄的資料撈出來,
到Textbox,
例如E3撈出B3到Textbox1
2.然後讓Database的文字超連結到工作表 Database


檔案雲端連結:http://webhd.xuite.net/_oops/jeffrey628litw/u05

謝謝版大的幫忙。
作者: jeffrey628litw    時間: 2018-6-18 10:04

回復 13# jeffrey628litw


    這個問題下面寫錯,應該是
2.想要顯示圖片資料,以便超連結到Database 工作表,(不知是否用Textbox,是的話要如何寫VBA呢?)
1.希望將工作表Database 裡面將E欄對應B欄的資料撈出來,
到Textbox,
例如E3撈出B3到Textbox1
2.然後讓Textbox的文字超連結到工作表 Database

[attach]28863[/attach]
作者: GBKEE    時間: 2018-6-18 12:15

本帖最後由 GBKEE 於 2018-6-20 09:01 編輯

回復 14# jeffrey628litw
試試看
  1. Option Explicit                  '強制 模組的變數必須要 Dim的宣告,會使程式易於偵錯
  2. Dim Sh(1 To 2) As Worksheet, D As Object, xTempPicture As String  '模組頂端上 Dim的變數 可在UserForm1的全部程式中使用
  3. Dim AR_Image(), AR_TexTbox(), AR_Label(), xName As String
  4. Private Sub UserForm_Initialize()
  5.     Dim A As Range, S As String, E As Variant
  6.     Set Sh(1) = ThisWorkbook.Sheets("Database") '工作表如有變動時在此修改即可
  7.     Set Sh(2) = ThisWorkbook.Sheets.Add
  8.     AR_Image = Array(Image1, Image2, Image3, Image4)
  9.     AR_TexTbox = Array(TextBox1, TextBox2, TextBox3, TextBox4)
  10.     AR_Label = Array(Label1, Label4, Label6, Label8)
  11.     xTempPicture = "D:\NoPicture.jpg"
  12.     xName = "D:\temp.jpg"
  13.     照片Export Sh(1).Range("F2"), xTempPicture '置入"沒有圖片"檔 當作預設圖片及沒有圖片
  14.     Set D = CreateObject("Scripting.Dictionary")
  15.     For Each A In Sh(1).Range(Sh(1).[E3], Sh(1).[E3].End(xlDown))
  16.          S = Replace(Trim(A), vbLf, Space(1)) '換行字元 改成 Space(1)
  17.             If D.EXISTS(S) Then
  18.                 D(S) = D(S) & "," & A.Offset(, 1).Address
  19.             Else
  20.                 D(S) = A.Offset(, 1).Address
  21.             End If
  22.     Next
  23.     ComboBox1.List = D.KEYS
  24.     For E = 0 To UBound(AR_Image)
  25.         With AR_Image(E)            '設定圖片的顯示設模式
  26.             .Picture = LoadPicture(xTempPicture)
  27.             .PictureAlignment = fmPictureAlignmentCenter ' ***  0,1,2,3,4
  28.             .PictureSizeMode = 3 'fmPictureSizeModeClip  ' ***  0,1,3
  29.             '***** 請自行調整******
  30.             '**1.顯示圖片可以自動調整圖片大小在框框內:將Display Each Player Photo 這按鈕顯示的白色框框內圖片可以
  31.             '***自動顯示和 After Sieve Display Photo 白色框框內圖片自動調整大小及位置
  32.         End With
  33.         AR_TexTbox(E).MultiLine = True   '指定控制項是否接受並顯示多行文字。
  34.         AR_Label(E).WordWrap = False   '內容在行末是否自動換行
  35.     Next
  36. End Sub
  37. '***********************************************************************************
  38. '以下為開啟UserForm1時會自動開啟1工作表,有以下程式在關閉UserForm1時會自動關閉工作表
  39. Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  40.     Application.DisplayAlerts = False
  41.     Sh(2).Delete
  42.     Kill xTempPicture
  43.     Kill xName ' "D:\temp.jpg" '刪除暫存圖片
  44.     Application.DisplayAlerts = True
  45. End Sub
  46. '***********************************************************************************
  47. Private Sub ComboBox1_Change()
  48.     Dim A As Variant, i As Integer, S As String, ii As Integer
  49.     For i = 0 To UBound(AR_Label)
  50.         AR_Label(i).Caption = "沒有此圖片"
  51.         AR_TexTbox(i).Text = ""
  52.         AR_Image(i).Picture = LoadPicture(xTempPicture) '表單預設的圖片 為 Databasse 工作表中的 F3 儲存格圖片
  53.     Next
  54.     With ComboBox1
  55.         If .ListIndex = -1 Then Exit Sub
  56.         A = Split(D(.Value), ",")
  57.         For i = 0 To 3                    '如要增加或減少圖片則 修改 i = 0 To 3 後面的3的數量
  58.             If i <= UBound(A) Then
  59.                 S = A(i)
  60.                 If 圖片檢查(S) Then '
  61.                     AR_Image(ii).Picture = LoadPicture(xName)
  62.                     AR_Label(ii).Caption = Sh(1).Range(S).Offset(, -1).Text
  63.                     AR_TexTbox(ii).Text = Sh(1).Range(S).Offset(, -4).Text
  64.                     ii = ii + 1
  65.                 End If
  66.             End If
  67.         Next
  68.     End With
  69. End Sub
  70. Private Function 圖片檢查(xPicture As String) As Boolean
  71.     Dim S As Shape
  72.     For Each S In Sh(1).Shapes
  73.         '*************************************************
  74.         'Shape物件是照片且位置是D(ComboBox1.Value).Address)
  75.         If S.Type = msoPicture And S.TopLeftCell.Address = xPicture Then
  76.             圖片檢查 = True
  77.             Exit For
  78.         End If
  79.         '***************************************************
  80.     Next
  81.     If 圖片檢查 = True Then 照片Export S, xName
  82.    
  83. End Function

  84. Private Sub 照片Export(P As Object, xName As String)
  85.     If xName <> "D:\temp.jpg" Then
  86.         P.CopyPicture
  87.     Else
  88.         P.Copy
  89.     End If
  90.     With Sh(2).ChartObjects.Add(1, 1, P.Width, P.Height) '新增圖表
  91.         .Chart.Paste '貼上圖片
  92.         .Chart.Export xName '匯出圖表,暫存圖片
  93.         .Delete '刪除圖表
  94.      End With
  95. End Sub
複製代碼

作者: jeffrey628litw    時間: 2018-6-18 14:25

回復 15# GBKEE


    G大 版主您好:出現下面的情況,我查不到如何解?

[attach]28864[/attach]
作者: GBKEE    時間: 2018-6-18 15:16

回復 16# jeffrey628litw

查看這程序上的程式碼有無缺失掉
  1. Private Sub 照片Export(P As Object, xName As String)
複製代碼

作者: jeffrey628litw    時間: 2018-6-19 15:25

回復 17# GBKEE


    G大 版主您好  :我整理好檔案了,已經符合我的想法了,非常感謝您的大力幫忙,我也將檔案放在這裡分享,再次感謝。

   雲端檔案分享:http://webhd.xuite.net/_oops/jeffrey628litw/uxz
作者: GBKEE    時間: 2018-6-20 09:06

回復 18# jeffrey628litw
  [14] 大谷翔平 Shohei Ohtani球棒卡球棒頂端   F15  沒有圖片
所以修改 15#的程式碼,會更為貼切
作者: jeffrey628litw    時間: 2018-6-20 16:26

回復 19# GBKEE


    G大 版主您好:我不懂您的意思,我F15儲存格是故意不放圖片要測試撈不撈的出預設的圖片(沒有圖片)
作者: GBKEE    時間: 2018-6-20 19:04

回復 20# jeffrey628litw

F15儲存格是故意不放圖片要測試撈不撈的出預設的圖片(沒有圖片)
那圖片就依續放在Image1, Image2,Image3,Image4 中 Image3 是沒有圖片的

修改後是將三個有圖片連續放在Image1, Image2,Image3 ,Image4 是沒有圖片的
作者: jeffrey628litw    時間: 2018-6-20 23:55

回復 21# GBKEE


    G大  版主您好:
    1.就依照您說的方式,可以幫我那樣改嗎?

     然後我又有2個問題需要您幫忙我:

    2.
       2-1.可以新增1個Combobox2 ,然後篩選工作表 Datababse   "J欄"不重複資料,例如 BGS、PSA、沒鑑定。
       2-2.然後這個Combobox2可以如果Combox1 篩選名字後,如Michael Jordan,然後再篩選Combobox2選BGS後出現圖片

    3.然後因為篩選後會超過4張Image,所以要製作分頁篩選,這可以用Combobox3製作嗎?如圖中右上方所示

[attach]28871[/attach]

雲端檔案:http://webhd.xuite.net/_oops/jeffrey628litw/k03

    感謝G大 版主。
作者: GBKEE    時間: 2018-6-23 15:23

回復 22# jeffrey628litw
3.然後因為篩選後會超過4張Image
ComboBox1 右邊新增一ComboBox3
ComboBox2 右邊新增一ComboBox4
  1. Option Explicit                  '強制 模組的變數必須要 Dim的宣告,會使程式易於偵錯
  2. '模組頂端上 Dim的變數 可在UserForm1的全部程式中使用
  3. Dim Sh(1 To 2) As Worksheet, D As Object, D1 As Object, xTempPicture As String
  4. Dim AR_Image(), AR_TexTbox(), AR_Label(), xName As String
  5. Private Sub UserForm_Initialize()
  6.     Dim A As Range, S As String, E As Variant
  7.     Set Sh(1) = ThisWorkbook.Sheets("Database") '工作表如有變動時在此修改即可
  8.     Set Sh(2) = ThisWorkbook.Sheets.Add
  9.     AR_Image = Array(Image1, Image2, Image3, Image4)
  10.     AR_TexTbox = Array(TextBox1, TextBox2, TextBox3, TextBox4)
  11.     AR_Label = Array(Label1, Label4, Label6, Label8)
  12.     xTempPicture = "D:\NoPicture.jpg"
  13.     xName = "D:\temp.jpg"
  14.     照片Export Sh(1).Range("F2"), xTempPicture '置入"沒有圖片"檔 當作預設圖片及沒有圖片
  15.     ComboBox設定 ComboBox1, D
  16.     For E = 0 To UBound(AR_Image)
  17.         With AR_Image(E)            '設定圖片的顯示設模式 '***** 請自行調整******
  18.             .Picture = LoadPicture(xTempPicture)
  19.             .PictureAlignment = fmPictureAlignmentCenter ' ***  0,1,2,3,4
  20.             .PictureSizeMode = 3 'fmPictureSizeModeClip  ' ***  0,1,3
  21.         End With
  22.         AR_TexTbox(E).MultiLine = True   '指定控制項是否接受並顯示多行文字。
  23.         AR_Label(E).WordWrap = False   '內容在行末是否自動換行
  24.     Next
  25. End Sub
  26. '***********************************************************************************
  27. '以下為開啟UserForm1時會自動開啟1工作表,以下程式在關閉UserForm1時會自動關閉工作表
  28. Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  29.     Application.DisplayAlerts = False
  30.     Sh(2).Delete
  31.     Kill xTempPicture
  32.     Kill xName ' "D:\temp.jpg"
  33.     Application.DisplayAlerts = True
  34. End Sub
  35. '***********************************************************************************
  36. Private Sub ComboBox1_Change()
  37.     Dim A As Variant, i As Integer, S As String, ii As Integer
  38.     清圖
  39.     With ComboBox1
  40.         If .ListIndex = -1 Then ComboBox2.Clear: ComboBox3.Clear: ComboBox4.Clear: Exit Sub
  41.         If IsArray(D(.Value)) Then A = D(.Value)(0) Else A = D(.Value)
  42.         ComboBox頁設定 ComboBox3, A
  43.         ComboBox設定 ComboBox2, D1
  44.         If ComboBox3.Enabled Then ComboBox3.ListIndex = 0
  45.     End With
  46. End Sub
  47. Private Sub ComboBox2_Change()
  48.     Dim A As Variant
  49.     With ComboBox2
  50.         清圖
  51.         If .ListIndex = -1 Then Exit Sub
  52.         A = D1(.Value)
  53.         If IsArray(D1(.Value)) Then A = D1(.Value)(0) Else A = D1(.Value)
  54.         ComboBox頁設定 ComboBox4, A
  55.         If ComboBox4.Enabled Then ComboBox4.ListIndex = 0
  56.     End With
  57. End Sub
  58. Private Sub ComboBox3_Change()
  59.     清圖
  60.     ComboBox4.Clear
  61.     If ComboBox3.ListIndex > -1 Then 設圖 ComboBox1, ComboBox3, D
  62. End Sub
  63. Private Sub ComboBox4_Change()
  64.     清圖
  65.     If ComboBox4.ListIndex > -1 Then 設圖 ComboBox2, ComboBox4, D1
  66.         
  67. End Sub
  68. Private Sub 清圖()
  69.     Dim i As Integer
  70.     For i = 0 To UBound(AR_Label)
  71.         AR_Label(i).Caption = "沒有此圖片"
  72.         AR_TexTbox(i).Text = ""
  73.         AR_Image(i).Picture = LoadPicture(xTempPicture) '表單預設的圖片 為 Databasse 工作表中的 F3 儲存格圖片
  74.     Next
  75. End Sub
  76. Private Sub 設圖(ComBo As MSForms.ComBobox, ComBobox As MSForms.ComBobox, D As Object)
  77.     Dim P As Object, i As Integer, ii As Integer
  78.     With ComBobox
  79.         For i = .ListIndex * 4 To (.ListIndex + 1) * 4 - 1
  80.             If i <= UBound(D(ComBo.Value)(0)) Then
  81.                 AR_Label(ii).Caption = D(ComBo.Value)(1)(i)
  82.                 AR_TexTbox(ii).Text = D(ComBo.Value)(2)(i)
  83.                 Set P = D(ComBo.Value)(0)(i)
  84.                 照片Export P, xName
  85.                 AR_Image(ii).Picture = LoadPicture(xName) '表單顯示圖片
  86.                 ii = ii + 1
  87.             End If
  88.         Next
  89.     End With
  90. End Sub
  91. Private Sub ComboBox頁設定(ComBo As MSForms.ComBobox, S As Variant)
  92.     Dim i As Integer
  93.     With ComBo
  94.         .Clear
  95.         Debug.Print .Name
  96.         ComBo.Enabled = IsArray(S)
  97.         If Not IsArray(S) Then Exit Sub
  98.         For i = 0 To UBound(S) Step 4
  99.             .AddItem Int((i + 1) / 4) + IIf(4 Mod (i + 1) >= 0, 1, 0)
  100.         Next
  101.     End With
  102. End Sub
  103. Private Sub ComboBox設定(ComBo As MSForms.ComBobox, D As Variant)
  104.     Dim A As Range, S As String, E As Variant, i As Integer, ii As Integer, iii As Integer, AR, AR1()
  105.     Dim xShape As Shape
  106.     Set D = CreateObject("Scripting.Dictionary")
  107.     For Each A In Sh(1).Range(Sh(1).Range("E3"), Sh(1).Range("E3").End(xlDown))
  108.         If ComBo.Name = "ComboBox1" Then
  109.             S = Replace(Trim(A), vbLf, Space(1))
  110.         Else
  111.             If ComboBox1 <> Replace(Trim(A), vbLf, Space(1)) Or Trim(A.Offset(, 5)) = "" Then GoTo Net
  112.             S = Replace(Trim(A.Offset(, 5)), vbLf, Space(1)) '換行字元 改成 Space(1)
  113.         End If
  114.         Set xShape = 圖片檢查(A.Offset(, 1).Address)
  115.         If Not xShape Is Nothing Then
  116.             If D.EXISTS(S) Then
  117.                 If IsArray(D(S)) Then
  118.                     AR = D(S)
  119.                     iii = UBound(AR(0)) + 1
  120.                     For ii = 0 To UBound(AR)
  121.                         ReDim AR1(0 To iii)
  122.                         For i = 0 To UBound(AR1)
  123.                             If ii = 0 Then If i < UBound(AR1) Then Set AR1(i) = AR(ii)(i) Else Set AR1(i) = xShape
  124.                             If ii = 1 Then If i < UBound(AR1) Then AR1(i) = AR(ii)(i) Else AR1(i) = A.Text
  125.                             If ii = 2 Then If i < UBound(AR1) Then AR1(i) = AR(ii)(i) Else AR1(i) = Sh(1).Cells(A.Row, "B").Text
  126.                         Next
  127.                         AR(ii) = AR1
  128.                     Next
  129.                     D(S) = AR
  130.                 Else
  131.                     D(S) = Array(Array(xShape), Array(A.Text), Array(Sh(1).Cells(A.Row, "B").Text))
  132.                 End If
  133.             Else
  134.                 D(S) = Array(Array(xShape), Array(A.Text), Array(Sh(1).Cells(A.Row, "B").Text))
  135.             End If
  136.         Else
  137.             If Not D.EXISTS(S) Then D(S) = False
  138.         End If
  139. Net:
  140.     Next
  141.     ComBo.Clear
  142.     If D.Count > 0 Then ComBo.List = D.KEYS
  143. End Sub
  144. Private Function 圖片檢查(xPicture As String) As Object
  145.     Dim S As Shape
  146.      Set 圖片檢查 = Nothing
  147.     For Each S In Sh(1).Shapes
  148.         '*************************************************
  149.         'Shape物件是照片且位置是D(ComboBox1.Value).Address)
  150.         If S.Type = msoPicture And S.TopLeftCell.Address = xPicture Then
  151.             Set 圖片檢查 = S
  152.             Exit For
  153.         End If
  154.         '***************************************************
  155.     Next
  156. End Function
  157. Private Sub 照片Export(P As Object, xName As String)
  158.     If xName <> "D:\temp.jpg" Then
  159.         P.CopyPicture
  160.     Else
  161.         P.Copy
  162.     End If
  163.     With Sh(2).ChartObjects.Add(1, 1, P.Width, P.Height) '新增圖表
  164.         .Chart.Paste '貼上圖片
  165.         .Chart.Export xName '匯出圖表,暫存圖片
  166.         .Delete '刪除圖表
  167.      End With
  168. End Sub
複製代碼

作者: jeffrey628litw    時間: 2018-6-23 15:50

回復 23# GBKEE


    G大 版大您好:我有試用過新功能了,都可以使用解決了我的問題,真的很感謝您的大力幫忙,我再研究您的程式,
不過如果有新的想法需求,可能還要麻煩您了,再次感謝,我趕快再來研究看看。.....^^......




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)