作者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/cn.aspx?n=bbs/Visual_Basic/M.1561624906.A.F2F.html