Re: [VBA ] Excel的range().select的問題

看板Visual_Basic作者 (我是保羅小小)時間5年前 (2019/06/16 22:12), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/3 (看更多)
※ 引述《HIRUMA (超電子頭脳!!)》之銘言: : 想請問為什麼下列程式碼只有最後一個 Range("D2:D11").Select 才不會出錯。 : (Error 1004) : 為什麼Range(Cells(2, 4),Cells(11, 4)).Select 也會出錯? : 應該怎麼在Select指定 range裡加變數? : If Sheets("Sheet1").Cells(1, find_id) = Item_name1 Then : Sheets("Sheet1").Select : 'Sheets("Sheet1").Range(Cells(2, find_id), Cells(11, find_id)).Select : 'Sheets("Sheet1").Range(Cells(2, 4), Cells(11, 4)).Select : Sheets("Sheet1").Range("D2:D11").Select : Selection.Copy : End If 閒來沒事,來回一下這種疑難雜症, 原本文章中C大的回覆觀念是正確的,Cell()後面如果是空白, 預設是value屬性沒錯,但其實Range()跟Cell()後面直接Select是可以的, 不才猜測會導致原PO的程式碼出錯的原因是...Activesheet這東西, 假如Activesheet=Sheet("Sheet2")的情況下... Sheets("Sheet1").Range(Cells(2, 4),Cells(11, 4)).Select 其實Excel在跑的會是 Sheets("Sheet1").Range(Activesheet.Cells(2, 4),Activesheet.Cells(11, 4)).Select 也就是你希望在Sheet1選取一個範圍,卻包含著Sheet2的儲存格, 這對Excel來說是矛盾的,因此出現了錯誤... 建議使用With跟End With的寫法比較能系統性避免此種錯誤,也比較簡潔。 因此,整段程式碼的改寫如下... With Sheet("Sheet1") .Activate If .Cells(1, find_id) = Item_name1 Then .Select '.Range(.Cells(2, find_id),.Cells(11, find_id)).Select '.Range(.Cells(2, 4),.Cells(11, 4)).Select .Range("D2:D11").Select .Copy End If End With *特別要注意的是註解掉的那兩行,不管在Range()或是Cell()前面都得加上"." 否則又會被Excel預判成Activesheet,然後就又會出錯 (如果前面沒加上.Activate那行的話) 另外,可以不用先Select再Copy,可以直接 .Range().Copy Destination:=Worksheets("Sheet2").Range("E5") 這樣就能一行把複製跟貼上都搞定了~ 希望有幫助到你~~ 以上。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.137.44.155 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Visual_Basic/M.1560694359.A.60A.html
文章代碼(AID): #1T1avNOA (Visual_Basic)
文章代碼(AID): #1T1avNOA (Visual_Basic)