Board logo

標題: [發問] 請問該如何變更工作表中的圖片索引值? [打印本頁]

作者: baconbacons    時間: 2014-11-19 20:03     標題: 請問該如何變更工作表中的圖片索引值?

程式碼中使用 .Shapes.AddPicture方法來「由上而下」新增圖片到工作表中(故原始的索引值是依序編排的)
但因工作需求不一定會新增在資料最底端  可能會從中插入現有的圖片之中(此插入的圖片索引值即為工作表中的總數)
因而在後續要指定特定圖片時 就會發生誤判圖片的情況
目前查到可以使用Shapes(index)來得知圖片索引值 但不知道該怎麼運用

是否應該將整個工作表的圖片都丟入陣列中(.Shapes.Range(Array(Picture _ ) ???),再依序「由上而下」重新給予新的索引值?
(只是要怎麼告訴電腦排在愈上面的圖片 索引值要愈小 是利用「列數」嗎?)
作者: luhpro    時間: 2014-11-20 04:25

程式碼中使用 .Shapes.AddPicture方法來「由上而下」新增圖片到工作表中(故原始的索引值是依序編排的)
但 ...
baconbacons 發表於 2014-11-19 20:03

我的觀點是 : 是的.

對於某個圖片你若沒有事先紀錄它是什麼內容,
使用時要怎麼來比對?
母片嗎?
那不又是一次讀入檔案的動作,
而且圖片內容是否一致要用甚麼軟體或函數來做比對呢? (要知道實務上顯示的圖片大小是可能與檔案不一樣的 - 可調)

最容易看到的例子是網頁上的驗證密碼圖示,
同個圖形它在網頁上顯示出來的大小是一致的,
但在Excel上要做比對還是不容易.
更遑論實務上使用的圖片內容並不一定是規律(可轉成文字)的,
顯示出來的大小又不一定是相同的.

在新增圖片時就記錄下來索引值,
會是比較快速且容易使用的方式.
作者: baconbacons    時間: 2014-11-20 18:49

回復 2# luhpro
luhpro 大:
插入的圖片並沒有要比對用途,只是現有插入的圖片,有時候會有調整先後順序的需求,所以就必須利用索引值來指定
但問題就在於經過插入之後的圖片 雖然肉眼看起來是排在第五張(舉例) 實際上索引值可能為7(因為是第7張插入的)
所以在使用者能夠看到的就只有工作表的圖片順序  而看不到實際的索引值
因此才會有想要利用由上而下重新給定索引值的想法  才會讓使用者指定的圖片即實際的圖片
可是因為找到解法的方向  但是不知道該怎麼修改程式碼 才會來家族討論
作者: stillfish00    時間: 2014-11-20 20:24

回復 3# baconbacons
1. 單一圖片是否有跨儲存格,單一儲存格是否含多張圖片
2. 若無,換個角度去考慮  '取得某儲存格內的圖片'  若有這樣的功能是不是就能達成各種你要的指定圖片和各種操作的需求?
作者: baconbacons    時間: 2014-11-25 19:55

回復 4# stillfish00
stillfish00:
圖片所在的儲存格是合併儲存格。
另外取得特定儲存格的圖片這想法似乎是可行的,只是能否分享進一步的作法
我可以指出特定儲存格,但怎麼操作該儲存格的圖片?
作者: stillfish00    時間: 2014-11-27 09:22

回復 5# baconbacons
若圖片在合併儲存格內
  1. Function GetCellPic(rng As Range) As Object
  2.   Dim x
  3.   
  4.   For Each x In ActiveSheet.Shapes
  5.     If Not Application.Intersect(x.TopLeftCell.MergeArea, rng) Is Nothing Then
  6.       Set GetCellPic = x
  7.     End If
  8.   Next
  9. End Function
複製代碼
測試:
  1. Sub Test()
  2.   Dim oPic As Object
  3.   Set oPic = GetCellPic(Range("F4"))
  4.   
  5.   If oPic Is Nothing Then
  6.     MsgBox "nothing in this cell."
  7.   Else
  8.     MsgBox oPic.name
  9.   End If
  10. End Sub
複製代碼

作者: GBKEE    時間: 2014-11-30 20:22

回復 1# baconbacons
試試看
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Sh As Worksheet, AR(), P(), i As Integer, X As Integer
  4.     Dim M As Single, M1 As Single, MyPicture As String
  5.     Set Sh = Sheet1
  6.     X = 1
  7.     For i = 1 To Sh.Shapes.Count
  8.         If Sh.Shapes(i).Type = msoPicture Then '表工作表上的圖案 是圖片
  9.             ReDim Preserve AR(1 To X)
  10.             ReDim Preserve P(1 To X)
  11.             AR(X) = Sh.Shapes(i).Top  '紀錄從圖案範圍中最頂端圖案的頂端到工作表頂端的距離
  12.             P(X) = i                  '紀錄表工作表上圖案的索引位置
  13.             X = X + 1
  14.         End If
  15.     Next
  16.     '******** 選取圖片 ********
  17.     With Application.FileDialog(msoFileDialogOpen)
  18.         .Filters.Add "Images", "*.gif; *.jpg; *.jpeg", 1
  19.         .FilterIndex = 1
  20.         If .Show = True Then
  21.             MyPicture = .SelectedItems(1)
  22.         Else
  23.             MsgBox "沒有選擇圖片!!!"
  24.             Exit Sub
  25.         End If
  26.     End With
  27.    
  28.     If X = 1 Then
  29.        If MsgBox("新增圖片 :" & MyPicture, vbYesNo, Sh.Name) = vbNo Then Exit Sub
  30.        i = 0
  31.     Else
  32.         On Error Resume Next
  33.         i = InputBox("新增圖片 :" & MyPicture & " 為第幾張圖片", Sh.Name & " 圖片共 " & X - 1 & " 張")
  34.         If Err <> 0 Then Exit Sub
  35.         If i = 0 Or i > X Then
  36.             MsgBox "第" & i & "張 不在範圍中"
  37.             Exit Sub
  38.         End If
  39.         '*******移動圖片位置
  40.         For X = UBound(AR) To i Step -1  '圖片檔由下往上下移位置
  41.             M = Application.Small(AR, X)
  42.             M = Application.Match(M, AR, 0)
  43.             With Sh.Shapes(P(M))
  44.                 If UBound(AR) = 1 And X = UBound(AR) Then
  45.                     M1 = .Height + [A1].Height
  46.                 ElseIf X > 1 Then
  47.                     M1 = Application.Small(AR, X - 1)
  48.                     M1 = .Top + (.Top - Application.Small(AR, X - 1))
  49.                 ElseIf X = i Then
  50.                     M1 = Application.Small(AR, X + 1)
  51.                 End If
  52.                 .Top = M1
  53.             End With
  54.         Next
  55.     End If
  56.     With Sh.Pictures.Insert(MyPicture)
  57.         If i = 0 Then
  58.             .Top = 0
  59.             .Left = 0
  60.         ElseIf i >= 1 And i <= UBound(AR) Then
  61.             .Top = Application.Small(AR, i)
  62.             .Left = Sh.Shapes(P(1)).Left
  63.         ElseIf i > UBound(AR) Then
  64.             M = Application.Small(AR, UBound(AR))
  65.             M = Application.Match(M, AR, 0)
  66.             .Top = Sh.Shapes(P(M)).Top + Sh.Shapes(P(M)).Height + [A1].Height
  67.             .Left = Sh.Shapes(P(M)).Left
  68.         End If
  69.         .Height = 200
  70.         .Width = 200
  71.     End With
  72. End Sub
複製代碼

作者: baconbacons    時間: 2014-12-8 17:26

回復 6# stillfish00
stillfish00大:修改了一下 有點小問題存在 再找時間試試這方法 感謝
作者: baconbacons    時間: 2014-12-8 17:28

回復 7# GBKEE
GBKEE大:藉由你提示的程式碼 經過幾天的修改 執行上沒有問題  感激
                    只是GBKEE大的程式 相當有深度 需要每行單步執行再找網路資源 並於程式碼後下註解才能看懂
                    總之 學到超多 thanks...




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