看板 Visual_Basic 關於我們 聯絡資訊
※ 引述《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://www.ptt.cc/bbs/Visual_Basic/M.1561624906.A.F2F.html