作者skyinthesea (我的鑰匙奇遇記@@)
看板Visual_Basic
標題Re: [VBA ] Excel的range().select的問題
時間Thu Jun 27 16:41:44 2019
※ 引述《paul60209 (我是保羅小小)》之銘言:
: ※ 引述《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()前面都得加上"."
Range()前面應該不用加上"."
只要Cells()加上"."就行
也就是
Range(Activesheet.Cells(2, find_id),Activesheet.Cells(11, find_id)).Select
: 否則又會被Excel預判成Activesheet,然後就又會出錯
: (如果前面沒加上.Activate那行的話)
: 另外,可以不用先Select再Copy,可以直接
: .Range().Copy Destination:=Worksheets("Sheet2").Range("E5")
: 這樣就能一行把複製跟貼上都搞定了~
: 希望有幫助到你~~
: 以上。
上面代碼應該是最佳也最簡潔
如果你真的要用select 也可以考慮使用expression.Goto(Reference, Scroll)
Goto會自動幫你把該worksheet激活
可以省略掉whorksheets.activate
後面再接 Selection.Copy
雖然我沒這樣做過...
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.46.28.118 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Visual_Basic/M.1561624906.A.F2F.html