返回列表 上一主題 發帖

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

本帖最後由 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
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 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
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 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
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 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
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 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
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 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
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 16# jeffrey628litw

查看這程序上的程式碼有無缺失掉
  1. Private Sub 照片Export(P As Object, xName As String)
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 18# jeffrey628litw
  [14] 大谷翔平 Shohei Ohtani球棒卡球棒頂端   F15  沒有圖片
所以修改 15#的程式碼,會更為貼切
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 20# jeffrey628litw

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

修改後是將三個有圖片連續放在Image1, Image2,Image3 ,Image4 是沒有圖片的
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 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
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

        靜思自在 : 能幹不幹,不如苦幹實幹。
返回列表 上一主題