Board logo

標題: [發問] 依條件刪除圖片 [打印本頁]

作者: Genie    時間: 2013-3-19 11:32     標題: 依條件刪除圖片

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

請幫忙看一下! 謝謝∼

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

[attach]14393[/attach]
作者: GBKEE    時間: 2013-3-19 12:46

回復 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
複製代碼

作者: Genie    時間: 2013-3-19 13:56

回復 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
      其餘不變
      但執行出來卻將所有的圖片刪除?

請幫忙看一下 謝謝!
作者: GBKEE    時間: 2013-3-19 15:56

回復 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
作者: Genie    時間: 2013-3-19 16:00

本帖最後由 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
      其餘不變
   執行出來會將所有的圖片刪除?
============================================
改完才看到回覆……

不過執行出來會將所有的圖片都刪除耶
作者: Genie    時間: 2013-3-19 16:14

回復 4# GBKEE


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

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

謝謝!
作者: GBKEE    時間: 2013-3-19 16:25

回復 6# Genie
請再附上檔案看看
作者: Genie    時間: 2013-3-19 17:04

回復 7# GBKEE


不好意思 我試成功了

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

[attach]14400[/attach]
作者: GBKEE    時間: 2013-3-19 17:53

本帖最後由 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)=空白
作者: Genie    時間: 2013-3-20 09:54

回復 9# GBKEE


懂其意思了! 非常感謝∼




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