返回列表 上一主題 發帖

[發問] 依條件刪除圖片

[發問] 依條件刪除圖片

在 excel 檔案中 有些 item 的 weekly 會沒有值
希望能把沒有值的 item 所對應的圖片給刪除
不曉得該怎麼寫?

請幫忙看一下! 謝謝~

PS. 檔案太大,所以只放幾張圖代表。

Picture.zip (975.7 KB)

回復 1# Genie
試試看
  1. Sub DelPic()
  2.     Dim R As Range, x As Picture, D As Object
  3.     Set D = CreateObject("scripting.dictionary") '字典物件
  4.     With ActiveSheet
  5.         For Each R In .Range("b3:b" & .[b3].End(xlDown).Row)
  6.             D(R.Value) = R.Offset(, 1).Value     '字典物件:key 的item
  7.         Next
  8.         For Each x In .Pictures
  9.             If D(x.TopLeftCell.Offset(-1).Text) = "" Then x.Delete
  10.         Next
  11.     End With
  12. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 2# GBKEE


不好意思 有幾個問題

1. 有一句看不太懂 "If D(x.TopLeftCell.Offset(-1).Text) = "" Then x.Delete"
     這是指圖上方的 item 對應到表格的 weekly 為空格的意思嗎?

2.  我若將 weekly 改到 D 欄 item 仍在 B 欄
      因此將程式碼改為 For Each R In .Range("D3:D" & .[D3].End(xlDown).Row)
                         D(R.Value) = R.Offset(, 2).Value
      其餘不變
      但執行出來卻將所有的圖片刪除?

請幫忙看一下 謝謝!

TOP

回復 3# Genie
TopLeftCell: 圖貼上最頂端及最左端的Cell (储存格)->上一列:Offset(-1).Text,是這圖的item字串
1. 有一句看不太懂 "If D(x.TopLeftCell.Offset(-1).Text) = "" Then x.Delete"
    這是指圖上方的 item 對應到表格的 weekly 為空格的意思嗎? 對的

2.我若將 weekly 改到 D 欄 item 仍在 B 欄   
   程式碼改為 For Each R In .Range("B3:B" & .[B3].End(xlDown).Row)
                         D(R.Value) = R.Offset(, 2).Value
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 Genie 於 2013-3-19 16:03 編輯

回復 2# GBKEE


不好意思 第二點打錯了

2.  我若將最上方的總表 weekly 改到 D 欄 item 仍在 B 欄
      因此將程式碼改為 For Each R In .Range("B3:B" & .[B3].End(xlDown).Row)
                         D(R.Value) = R.Offset(, 2).Value
      其餘不變
   執行出來會將所有的圖片刪除?
============================================
改完才看到回覆……

不過執行出來會將所有的圖片都刪除耶

TOP

回復 4# GBKEE


我試出來的結果是只改上方總表的 weekly 欄位 所有的圖都會被刪除
但若是連圖下方表格的 weekly 一起變更的話 執行就正常

請問有沒有辦法不動圖下方的表格 只改總表的 weekly 欄位呢?

謝謝!

TOP

回復 6# Genie
請再附上檔案看看
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 7# GBKEE


不好意思 我試成功了

不過有個問題想問
為什麼 "For Each R In .Range("b3:b" & .[b3].End(xlDown).Row)" 要 B3:B 呢?
這一段不是在定義字典的內容嗎?
假如我的範圍只有 B3:B7 只輸入 B3:B7 且將 weekly 的欄位移至 D 欄 為什麼會執行錯誤?
但若輸入 B3:B 就沒有問題呢?

Picture.zip (975.68 KB)

TOP

本帖最後由 GBKEE 於 2013-3-19 17:57 編輯

回復 8# Genie
請查看VBA說明 End 屬性   傳回 Range物件,該物件代表包含來源範圍之區域結尾處的儲存格。等於按 END+向上鍵、END+向下鍵、END+向左鍵或 END+向右鍵。唯讀 Range 物件。


為什麼 "For Each R In .Range("b3:b" & .[b3].End(xlDown).Row)" 要 B3:B 呢?
.[b3].End(xlDown).Row :傳回由 [b3]往下到最後一個資料的列號  ->你的檔案傳回 7
Range("這是字串")-> "b3:b" & 7-> "b3:b7"

你改為.Range("b3:b7" & .[b3].End(xlDown).Row) ->"b3:b7" & 7-> "b3:b77" : 擴大了範圍
B欄中B12="A-1",B33="B-1",B53="B-2" 的D欄都是空白
**D(R.Value) = R.Offset(, 2).Value 使得D(KEY)=空白
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 9# GBKEE


懂其意思了! 非常感謝~

TOP

        靜思自在 : 我們最大的敵人不是別人.可能是自己。
返回列表 上一主題