Board logo

標題: [發問] 如何篩選圖片,並插入指定的欄位 [打印本頁]

作者: jackyliu    時間: 2011-2-15 01:13     標題: 如何篩選圖片,並插入指定的欄位

本帖最後由 jackyliu 於 2011-2-15 01:40 編輯

請教 高手們:
要如何將C:\TEST\地下的圖片 經過篩選 插入所定義的欄位內,
可否幫忙一下,因權限關係,可否貼程式碼.... 如附件 ! 萬分感激 !

已知條件
1. 圖片插入範圍H、I、J、K、L、M
2. 圖片儲存位置於C:\TEST\*.JPG(副檔名)
3. 圖片命名規則1-T、1-T-O
4. 圖片插入規則1為插入第一列、T為插入第一列的(T)第三碼為0、1、2、3, 若有第三碼則依序插入至K、L、M 欄位
5. 圖片大小 高度2.7cm、寬度3.6cm
6. 資料比數不設限10筆,所以 匯差入的圖片可能會到達第200列的某欄位
作者: Hsieh    時間: 2011-2-15 09:31

回復 1# jackyliu

圖片命名規則不是很懂,先試試這樣看怎樣不同
  1. Sub Ex()
  2. Dim A As Range, C As Range
  3. ar = Array("C", "F", "T")
  4. ay = Array(8, 9, 10)
  5. ak = Array("", 0, 1, 2, 3)
  6. fd = "C:\TEST\" '圖片目錄
  7. With Sheet1
  8. .Pictures.Delete
  9. For Each C In .Range(.[C3], .[C65536].End(xlUp))
  10. r = C.Row
  11.     For i = 0 To 2
  12.        For j = 0 To 3
  13.        mystr = IIf(ak(j) = "", "", "-" & ak(j))
  14.        fs = C & "-" & ar(i) & mystr & ".jpg"
  15.        If Dir(fd & fs) <> "" Then
  16.           Set A = .Cells(r, IIf(j = 0, ay(i), 10 + j))
  17.           With .Pictures.Insert(fd & fs)
  18.             .Top = A.Top: .Left = A.Left: .Height = A.Height: .Width = A.Width
  19.           End With
  20.        End If
  21.        Next
  22.     Next
  23. Next
  24. End With
  25. End Sub
複製代碼

作者: jackyliu    時間: 2011-2-15 21:14

1. 可以幫我解釋一下嗎? 不太了解耶
2. 可圖片有52-T-1.jpg 和53.jpg 都無法插入第52和53列裡耶
感恩 !
作者: Hsieh    時間: 2011-2-15 23:11

52-T-1要在編號52的哪一欄?
53.jpg 要在編號53的哪一欄?
作者: jackyliu    時間: 2011-2-15 23:29

本帖最後由 jackyliu 於 2011-2-15 23:42 編輯

因圖片資料一直往下延伸關係,會有很多的ID 敘述, 所以會有很多列
52-T-1要在編號52的哪一欄?---> 欄位名稱NO  的第52筆圖片也就是第52行列的L欄位
53.jpg 要在編號53的哪一欄?---> 欄位名稱NO  的第53筆圖片也就是第5行列的H欄位


插入圖片做說明
H欄插入的定義=圖片名稱為整數,列如;52, 53, 54
I欄插入的定義=圖片名稱為 *-C     ,列如;52-C , 53-C, 54-C
J欄插入的定義=圖片名稱為 *-T     ,列如;52-T , 53-T, 54-T
K欄插入的定義=圖片名稱為 *-*-1 ,列如;52-C-1 , 53-T-1, 54-T-1
L欄插入的定義=圖片名稱為 *-T     ,列如;52-C-2 , 53-T-2, 54-T-2
M欄插入的定義=圖片名稱為 *-T    ,列如;52-C-3 , 53-T-3, 54-T-3
作者: Hsieh    時間: 2011-2-15 23:44

回復 5# jackyliu


    H2、I2的C、F並沒有在圖片檔名的編號規則內嗎?
不然為何53.jpg  會在H欄位?
請在各儲存格位置填入圖片檔名,以釐清命名規則與表格位置的關係
作者: jackyliu    時間: 2011-2-16 00:15

回復 6# Hsieh


如附件說明!
感謝您
作者: Hsieh    時間: 2011-2-16 09:08

回復 7# jackyliu
  1. Sub Ex()
  2. Set d = CreateObject("Scripting.Dictionary")
  3. fd = ThisWorkbook.Path & "\" '圖檔目錄
  4. fs = Dir(fd & "*.jpg")
  5. Do Until fs = ""
  6. If InStr(fs, "-") = 0 Then '只有數值
  7.    d(fs) = "H" & Val(fs) + 2 '因為在第列所以加2
  8.    ElseIf Len(fs) - Len(Replace(fs, "-", "")) = 1 Then '只有1個分隔符號
  9.    '第2碼為C就是I欄,否則就在J欄
  10.      If Split(fs, "-")(1) = "C" Then d(fs) = "I" & Val(fs) + 2 Else d(fs) = "J" & Val(fs) + 2
  11.    Else
  12.    '第3碼是1就在K欄,2就在L欄,其餘在M欄
  13.    k = IIf(Split(fs, "-")(2) = 1, "K", IIf(Split(fs, "-")(2) = 2, "L", "M"))
  14.    d(fs) = k & Val(fs) + 2
  15. End If
  16. fs = Dir
  17. Loop
  18. With Sheet1
  19. .Pictures.Delete '清除所有圖片
  20. Application.ScreenUpdating = False
  21. For Each ky In d.keys
  22.    Set A = .Range(d(ky)) '圖片插入的位置
  23.       With .Pictures.Insert(fd & ky) '插入圖檔
  24.          .Top = A.Top
  25.          .Left = A.Left
  26.          .Height = A.Height
  27.          .Width = A.Width
  28.        End With
  29. Next
  30. End With
  31. Application.ScreenUpdating = True
  32. End Sub
複製代碼

作者: jackyliu    時間: 2011-2-16 17:16

板大  好強....
感謝您的幫忙

另外一問 圖片大小好像沒看到有設定,可圖片又可符合需求  圖片大小 高度2.7cm、寬度3.6cm
程式裡只有這樣寫 (  Height = A.Height), 什麼原因可以讓圖片 符合需求  圖片大小
作者: Hsieh    時間: 2011-2-16 17:23

回復 9# jackyliu
設定成儲存格大小
作者: jackyliu    時間: 2011-2-16 21:30

感謝您的 熱心協助, 感激 ~
作者: jackyliu    時間: 2011-2-18 22:26

1. 版大 可以幫我解釋這兩行嗎?
2. 另外 可以幫我加上排序插入K欄以後的欄位嗎? (ex : 1-C-0, 1-C-1, 1-T-1, 1-T-2)

If InStr(fs, "-") = 0 Then '只有數值
   d(fs) = "H" & Val(fs) + 2 '因為在第列所以加2
作者: Hsieh    時間: 2011-2-18 22:54

回復 12# jackyliu
If InStr(fs, "-") = 0 Then '只有數值
用INSTR函數測試看看圖片檔名是否有"-"號,因為只有數值時才沒有"-"號

d(fs) = "H" & Val(fs) + 2 '因為在第列所以加2
字典物件是用來儲存檔名對應的位址, Val(fs)會得到NO值,而NO的1是從第3列開始,所以列位要加2


至於你要增加欄位的問題,又回到之前的重點:檔名跟儲存欄位的對應規則
要自己清楚對應規則,然後在判斷式中一條件來寫入字典物件
作者: jackyliu    時間: 2011-2-19 03:17

本帖最後由 jackyliu 於 2011-2-19 06:37 編輯

[attach]4793[/attach]事由: 因檔檔名有 1-C-0, 1-C-1, 1-T-1 , 1-T-2 .....   ;需分別插入至K欄~R欄

我想說改成 第3碼編碼成0~7 ,分別插入至K欄~R欄, 所以往底下這一行動手,一直無法執行,不知道為什麼不行?
改法 -->IIf(Split(fs, "-")(8) = 0, "K",IIf(Split(fs, "-")(8) = 1, "L",IIf(Split(fs, "-")(8) = 2, "M",IIf(Split(fs, "-")(8) = 3, "N", "O"))
上面是哪出錯了,可否幫忙一下 ! 謝謝 !


原程式Code:
k = IIf(Split(fs, "-")(2) = 1, "K", IIf(Split(fs, "-")(2) = 2, "L", "M"))-->第3碼是1就在K欄,2就在L欄,其餘在M欄

圖片說明如附圖
作者: Hsieh    時間: 2011-2-19 11:28

本帖最後由 Hsieh 於 2011-2-19 11:33 編輯

回復 14# jackyliu
  1. Sub Ex()
  2. Set d = CreateObject("Scripting.Dictionary")
  3. fd = ThisWorkbook.Path & "\" '圖檔目錄
  4. fs = Dir(fd & "*.jpg")
  5. Do Until fs = ""
  6. If InStr(fs, "-") = 0 Then '只有數值
  7.    d(fs) = "H" & Val(fs) + 2 '因為在第列所以加2
  8.    ElseIf Len(fs) - Len(Replace(fs, "-", "")) = 1 Then '只有1個分隔符號
  9.    '第2碼為C就是I欄,否則就在J欄
  10.      If Split(fs, "-")(1) = "C" Then d(fs) = "I" & Val(fs) + 2 Else d(fs) = "J" & Val(fs) + 2
  11.    Else
  12.    '第3碼是1就在K欄,2就在L欄,其餘在M欄
  13.    ar = Split(fs, "-")
  14.    p = IIf(ar(1) = "C", Asc("K"), Asc("L")) '第2碼是C就傳回"K"的字元碼,第2碼是T就傳回"L"的字元碼給變數p
  15.    k = Chr(Val(ar(2)) + p) '字串變數k的值是第3碼+p對應到的字串(就是欄位)
  16.    d(fs) = k & Val(fs) + 2
  17. End If
  18. fs = Dir
  19. Loop
  20. With Sheets("Sheet1")
  21. .Pictures.Delete '清除所有圖片
  22. Application.ScreenUpdating = False
  23. For Each ky In d.keys
  24.    Set A = .Range(d(ky)) '圖片插入的位置
  25.       With .Pictures.Insert(fd & ky) '插入圖檔
  26.          .ShapeRange.LockAspectRatio = msoFalse '解除長寬比例
  27.          .Top = A.Top
  28.          .Left = A.Left
  29.          .Height = A.Height
  30.          .Width = A.Width
  31.        End With
  32. Next
  33. End With
  34. Application.ScreenUpdating = True
  35. End Sub
複製代碼

作者: jackyliu    時間: 2011-2-19 22:12

本帖最後由 jackyliu 於 2011-2-19 22:13 編輯

版大 目前測試 11張圖片 ,應該會分別差入 11個 儲存格 (H 欄~R欄)
結果 發現 有些圖片 重疊情行,不知哪裡出錯了?
請您 幫忙測試一下, 感謝~

如附件!
作者: Hsieh    時間: 2011-2-20 01:27

回復 16# jackyliu
  1. Sub Ex()
  2. Set d = CreateObject("Scripting.Dictionary")
  3. fd = ThisWorkbook.Path & "\" '圖檔目錄
  4. fs = Dir(fd & "*.jpg")
  5. Do Until fs = ""
  6. If InStr(fs, "-") = 0 Then '只有數值
  7.    d(fs) = "H" & Val(fs) + 2 '因為在第列所以加2
  8.    ElseIf Len(fs) - Len(Replace(fs, "-", "")) = 1 Then '只有1個分隔符號
  9.    '第2碼為C就是I欄,否則就在J欄
  10.    V = Split(fs, "-")(1)
  11.      If Split(fs, "-")(1) Like "C*" Then d(fs) = "I" & Val(fs) + 2 Else d(fs) = "J" & Val(fs) + 2
  12.    Else
  13.    '第3碼是1就在K欄,2就在L欄,其餘在M欄
  14.    ar = Split(fs, "-")
  15.    p = IIf(ar(1) = "C", Asc("K"), Asc("L")) '第2碼是C就傳回"K"的字元碼,第2碼是T就傳回"L"的字元碼給變數p
  16.    k = Chr(Val(ar(2)) * 2 + p) '字串變數k的值是第3碼+p對應到的字串(就是欄位)
  17.    d(fs) = k & Val(fs) + 2
  18. End If
  19. fs = Dir
  20. Loop
  21. With Sheets("Sheet1")
  22. .Pictures.Delete '清除所有圖片
  23. Application.ScreenUpdating = False
  24. For Each ky In d.keys
  25.    Set A = .Range(d(ky)) '圖片插入的位置
  26.       With .Pictures.Insert(fd & ky) '插入圖檔
  27.          .ShapeRange.LockAspectRatio = msoFalse '解除長寬比例
  28.          .Top = A.Top
  29.          .Left = A.Left
  30.          .Height = A.Height
  31.          .Width = A.Width
  32.        End With
  33. Next
  34. End With
  35. Application.ScreenUpdating = True
  36. End Sub
複製代碼

作者: jackyliu    時間: 2011-2-21 21:02

耶 ... 感覺對了耶~
板大  感恩

不知道 可插入到200.jpg 或是200-C-0.jpg 程式code 哪裡 可以看出來? 有限制嗎?
若是要開啟execl 就直接啟動巨集 (開啟execl 圖片就自動插入,要加什麼指令;還需要將程式放在模組裡嗎?)
作者: Hsieh    時間: 2011-2-21 22:14

本帖最後由 Hsieh 於 2011-2-21 22:26 編輯

用OPEN事件程序驅動即可開啟檔案就載入圖片
Sub Ex()
改成Sub auto_open()
把所有程式碼放在一般模組


檔案名稱只要是根據你的描述條件命名應該就沒錯
作者: jackyliu    時間: 2011-2-22 20:37

所以 程式可讀到圖片名稱200.jpg 或是200-C-0.jpg ,所以是沒有比數限制...

另外..圖片插入後,另存新檔時,新儲存的檔案,會聯帶VBA  程式Code 帶至 新檔案耶;
可否另存檔案時 ,不要也將VBA  程式Code 存到新檔案 ( 新檔案不要有 VBA  程式Code ) 要如作 ?

什麼方式都可以 ,麻煩 指教一下 !
作者: Hsieh    時間: 2011-2-22 20:46

本帖最後由 Hsieh 於 2011-2-23 08:23 編輯

回復 20# jackyliu

手動刪除程式碼另存新檔就好啦
要自動另存時刪除程式碼,可利用BEFORE_SAVE事件完成(如附件)
[attach]4838[/attach]
作者: jackyliu    時間: 2011-2-22 23:30

本帖最後由 jackyliu 於 2011-3-3 08:03 編輯

版大  我權限還太小, 所以您的rar 附件檔 , 無法下載....
可否明示~ ~
作者: Hsieh    時間: 2011-2-23 08:21

回復 22# jackyliu

thisworkbook模組
  1. Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  2. If SaveAsUI = True And Cancel = False Then
  3. Dim vbc As Object
  4. With ThisWorkbook.VBProject
  5. For Each vbc In .VBComponents
  6.   Select Case vbc.Type
  7.   Case vbext_rk_Project, vbext_wt_Browser, vbext_ct_MSForm '註
  8.     .VBComponents.Remove .Item(vbc.Name)

  9.   Case Else
  10.     .VBComponents(vbc.Name).CodeModule.DeleteLines 1, _
  11.     .VBComponents(vbc.Name).CodeModule.CountOfLines

  12.   End Select
  13. Next
  14. End With
  15. End If
  16. End Sub


  17. Private Sub Workbook_Open()
  18. Set d = CreateObject("Scripting.Dictionary")
  19. fd = ThisWorkbook.Path & "\" '圖檔目錄
  20. fs = Dir(fd & "*.jpg")
  21. Do Until fs = ""
  22. If InStr(fs, "-") = 0 Then '只有數值
  23.    d(fs) = "H" & Val(fs) + 2 '因為在第列所以加2
  24.    ElseIf Len(fs) - Len(Replace(fs, "-", "")) = 1 Then '只有1個分隔符號
  25.    '第2碼為C就是I欄,否則就在J欄
  26.    V = Split(fs, "-")(1)
  27.      If Split(fs, "-")(1) Like "C*" Then d(fs) = "I" & Val(fs) + 2 Else d(fs) = "J" & Val(fs) + 2
  28.    Else
  29.    '第3碼是1就在K欄,2就在L欄,其餘在M欄
  30.    ar = Split(fs, "-")
  31.    p = IIf(ar(1) = "C", Asc("K"), Asc("L")) '第2碼是C就傳回"K"的字元碼,第2碼是T就傳回"L"的字元碼給變數p
  32.    k = Chr(Val(ar(2)) * 2 + p) '字串變數k的值是第3碼+p對應到的字串(就是欄位)
  33.    d(fs) = k & Val(fs) + 2
  34. End If
  35. fs = Dir
  36. Loop
  37. With Sheets("Sheet1")
  38. .Pictures.Delete '清除所有圖片
  39. Application.ScreenUpdating = False
  40. For Each ky In d.keys
  41.    Set A = .Range(d(ky)) '圖片插入的位置
  42.       With .Pictures.Insert(fd & ky) '插入圖檔
  43.          .ShapeRange.LockAspectRatio = msoFalse '解除長寬比例
  44.          .Top = A.Top
  45.          .Left = A.Left
  46.          .Height = A.Height
  47.          .Width = A.Width
  48.        End With
  49. Next
  50. End With
  51. Application.ScreenUpdating = True
  52. End Sub
複製代碼

作者: jackyliu    時間: 2011-2-23 20:21

將上面 程式code 複製到 Modul1, 接著要去執行巨集...
去沒有 巨集名稱耶 ...  

正常之前 巨集名稱是 :Ex() , Sub auto_open()

現在變成 不會 Run 了耶....
作者: Hsieh    時間: 2011-2-23 20:34

回復 24# jackyliu

在ThisworkBook模組內,直接貼入程式碼
開啟檔案時就會自動載入圖片
另存新檔就會自動刪除程式碼另存
作者: jackyliu    時間: 2011-2-23 21:20

本帖最後由 jackyliu 於 2011-2-23 21:24 編輯

另存新檔  會有錯誤訊息耶 ....
而且  新建立的檔案內 ThisWorkbook 的程式code 並沒有清除,
應該 是說 " 程式code 和圖片 "  一起 另存新檔耶
作者: Hsieh    時間: 2011-2-23 22:14

回復 26# jackyliu


    工具/巨集/安全性
勾選信任存取Visual Basic專案
[attach]4840[/attach]
作者: jackyliu    時間: 2011-2-23 23:58

哇....  太勵害了
這陣子 辛苦您了 ~
作者: jackyliu    時間: 2011-3-3 08:02

板大   這幾天我另外做一個撈取資料庫資料 VBA ,資料撈取完,自動另存新檔 並且刪除程式碼;
直接 複製 板大上頭的 Code 做自動另存新檔 並且刪除程式碼,可是 產出的新檔裡都會程式Code.
可否指教一下,哪裡出問題了....

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If SaveAsUI = True And Cancel = False Then
Dim vbc As Object
With ThisWorkbook.VBProject
For Each vbc In .VBComponents
  Select Case vbc.Type
  Case vbext_rk_Project, vbext_wt_Browser, vbext_ct_MSForm '註
    .VBComponents.Remove .Item(vbc.Name)
  Case Else
    .VBComponents(vbc.Name).CodeModule.DeleteLines 1, _
    .VBComponents(vbc.Name).CodeModule.CountOfLines
  End Select
Next
End With
End If
End Sub
作者: Hsieh    時間: 2011-3-3 23:37

回復 29# jackyliu

試試看
  1. Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  2. If SaveAsUI = True And Cancel = False Then
  3. Dim vbc As Object
  4. With ThisWorkbook.VBProject
  5. For Each vbc In .VBComponents
  6.   If vbc.Type = 1 Then
  7.   .VBComponents.Remove .VBComponents(vbc.Name)
  8.   Else
  9.     .VBComponents(vbc.Name).CodeModule.DeleteLines 1, _
  10.     .VBComponents(vbc.Name).CodeModule.CountOfLines
  11.   End If
  12. Next
  13. End With
  14. End If
  15. End Sub
複製代碼

作者: jackyliu    時間: 2011-3-6 20:16

可以了 耶  , 感謝您的幫忙

作者: jackyliu    時間: 2011-6-27 06:37

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If SaveAsUI = True And Cancel = False Then
Dim vbc As Object
With ThisWorkbook.VBProject
For Each vbc In .VBComponents
  Select Case vbc.Type
  Case vbext_rk_Project, vbext_wt_Browser, vbext_ct_MSForm '註
    .VBComponents.Remove .Item(vbc.Name)

  Case Else
    .VBComponents(vbc.Name).CodeModule.DeleteLines 1, _
    .VBComponents(vbc.Name).CodeModule.CountOfLines

  End Select
Next
End With
End If
End Sub


Private Sub Workbook_Open()
Set d = CreateObject("Scripting.Dictionary")
fd = ThisWorkbook.Path & "\" '圖檔目錄
fs = Dir(fd & "*.jpg")
Do Until fs = ""
If InStr(fs, "-") = 0 Then '只有數值
   d(fs) = "H" & Val(fs) + 2 '因為在第列所以加2
   ElseIf Len(fs) - Len(Replace(fs, "-", "")) = 1 Then '只有1個分隔符號
   '第2碼為C就是I欄,否則就在J欄
   V = Split(fs, "-")(1)
     If Split(fs, "-")(1) Like "C*" Then d(fs) = "I" & Val(fs) + 2 Else d(fs) = "J" & Val(fs) + 2
   Else
   '第3碼是1就在K欄,2就在L欄,其餘在M欄
   ar = Split(fs, "-")
   p = IIf(ar(1) = "C", Asc("K"), Asc("L")) '第2碼是C就傳回"K"的字元碼,第2碼是T就傳回"L"的字元碼給變數p
   k = Chr(Val(ar(2)) * 2 + p) '字串變數k的值是第3碼+p對應到的字串(就是欄位)
   d(fs) = k & Val(fs) + 2
End If
fs = Dir
Loop
With Sheets("Sheet1")
.Pictures.Delete '清除所有圖片
Application.ScreenUpdating = False
For Each ky In d.keys
   Set A = .Range(d(ky)) '圖片插入的位置
      With .Pictures.Insert(fd & ky) '插入圖檔
         .ShapeRange.LockAspectRatio = msoFalse '解除長寬比例
         .Top = A.Top
         .Left = A.Left
         .Height = A.Height
         .Width = A.Width
       End With
Next
End With
Application.ScreenUpdating = True
End Sub

目前想改成從I 欄位開始插入圖片;圖片名稱有1,1-1,1-2 ~1-20 ,共21張圖,
測試了好久一直改不出來,幫忙指點好嗎?




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