作者paul60209 (我是保罗小小)
标题Re: [VBA ] Excel的range().select的问题
时间Sun Jun 16 22:12:37 2019
※ 引述《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")
这样就能一行把复制跟贴上都搞定了~
希望有帮助到你~~
以上。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.137.44.155 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Visual_Basic/M.1560694359.A.60A.html