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

作者: paul60209 (我是保羅小小)   2019-06-16 22:12:37
※ 引述《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")
這樣就能一行把複製跟貼上都搞定了~
希望有幫助到你~~
以上。

Links booklink

Contact Us: admin [ a t ] ucptt.com