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