Re: [VBA ] Excel的range().select的问题

楼主: skyinthesea (我的钥匙奇遇记@@)   2019-06-27 16:41:44
※ 引述《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
虽然我没这样做过...

Links booklink

Contact Us: admin [ a t ] ucptt.com