我正在尝试根据第三列中的值将多列从一workbook
复制到另一列。我为此尝试了多种格式,将对象声明为range
或variant
,将所选范围设置为.value
或.select
。 总而言之,这导致了运行时错误 438、424、91 和 13。
此最新迭代将生成"运行时错误 438:对象不支持此属性或方法"。
Sub Fetch()
Dim Group As String
Dim gPath As String
Dim BUname As String
Dim PMAname As String
Dim Backup As Workbook
Dim PMA As Workbook
Dim Fetch As Workbook, Home As Worksheet
Set Fetch = ThisWorkbook
Set Home = ThisWorkbook.Sheets("Home")
Group = Range("B2").Value
mola = Range("B1").Value
maybe = Format(mola, "mm")
real = Format(mola, "yy")
nope = Format(mola, "yyyy")
ShtNm = Format(mola, "mm.yy")
gPath = "U:BILLRECM & R EG BillingAnalystsMy Name" & Group & "M2MOriginal Backup" & "" & nope & ""
BUname = gPath & maybe & "." & real & " " & "Original Backup" & ".xlsx"
PMAname = gPath & maybe & "." & real & " " & "PMA" & ".xlsx"
'Opens Backup File and determines current premium
Set Backup = Workbooks.Open(BUname)
Backup.Sheets(ShtNm).Range(Range("E2"), Range("E2").End(xlDown)).Copy
Home.Range("D2").PasteSpecial xlPasteValues
Backup.Sheets(ShtNm).Range(Range("N2"), Range("N2").End(xlDown)).Copy
Home.Range("E2").PasteSpecial xlPasteValues
If Application.CountIf(Backup.Sheets(ShtNm).Range(Range("BW2"), Range("BW2").End(xlDown)).Values, "<>0") < 0 Then 'Runtime 438 occurs here.
Backup.Sheets(ShtNm).Range(Range("BX2"), Range("BX2").End(xlDown)).Copy
Home.Range("F2").PasteSpecial xlPasteValues
Backup.Sheets(ShtNm).Range(Range("BY2"), Range("BY2").End(xlDown)).Copy
Home.Range("G2").PasteSpecial xlPasteValues
Else
Backup.Sheets(ShtNm).Range(Range("CA2"), Range("CA2").End(xlDown)).Copy
Home.Range("F2").PasteSpecial xlPasteValues
Backup.Sheets(ShtNm).Range(Range("CB2"), Range("CB2").End(xlDown)).Copy
Home.Range("G2").PasteSpecial xlPasteValues
End If
Set PMA = Workbooks.Open(PMAname)
End Sub
我尝试的另一个变体是命名实际范围......同样,这会导致 438:
Backup.Sheets(ShtNm).Range(Range("N2"), Range("N2").End(xlDown)).Copy
Home.Range("E2").PasteSpecial xlPasteValues
TotPrm = Backup.Sheets(ShtNm).Range(Range("BW2"), Range("BW2").End(xlDown)).Values 'Error Occurs here now.
If Application.CountIf(TotPrm, "<>0") < 0 Then
Backup.Sheets(ShtNm).Range(Range("BX2"), Range("BX2").End(xlDown)).Copy
Home.Range("F2").PasteSpecial xlPasteValues
Backup.Sheets(ShtNm).Range(Range("BY2"), Range("BY2").End(xlDown)).Copy
Home.Range("G2").PasteSpecial xlPasteValues
Else
我试图将TotPrm
声明为具有相同 438 的Range
和Variant
:
Dim TotPrm As Range
和
Dim TotPrm As Variant
相同的 438 发生在同一点。
将.Values
更改为.Value
导致需要运行时 424 对象:
Set TotPrm = Backup.Sheets(ShtNm).Range(Range("BW2"), Range("BW2").End(xlDown)).Value 'This line is the bane of my existence
我正在针对的数据集是:
BW BX BY BZ CA CB
TotPrmA CurA RetroA TotPrmB CurB RetroB
$0.00 $0.00 $0.00 $42.55 $42.55 $0.00
$0.00 $0.00 $0.00 $39.72 $39.72 $0.00
$0.00 $0.00 $0.00 $39.72 $39.72 $0.00
$0.00 $0.00 $0.00 $41.14 $41.14 $0.00
$0.00 $0.00 $0.00 $41.14 $41.14 $0.00
$0.00 $0.00 $0.00 $41.14 $41.14 $0.00
$0.00 $0.00 $0.00 $82.28 $82.28 $0.00
$0.00 $0.00 $0.00 $39.72 $39.72 $0.00
这是一个重复的Total Premiums
、Current Premiums
Retroactive Adjustments
数组。 正如您从紧随我的麻烦魔鬼之后的If...Else
函数中看到的那样,它在第一列中查找除零以外的值Total Premiums
并根据结果确定要复制的列。将TotPrm
声明为Variant
并定义为Range.Value
,它会在同一行生成Runtime Error 13: Type Mismatch
。
最后但并非最不重要的一点是,运行时 91:
Dim TotPrm As Range
TotPrm = Backup.Sheets(ShtNm).Range(Range("BW2"), Range("BW2").End(xlDown)).Value
我已经到了我的智慧的尽头。 任何帮助将不胜感激!
Dim TotPrm As Range
在分配时需要一个Range
对象,并且由于它是一个对象,因此必须使用Set
关键字:
Set TotPrm = <expression that evaluates to an instance of a Range object>
因此,当您这样做时,您缺少初学者的Set
关键字,而且Select
方法实际上返回一个Boolean
(True/False(值,而不是范围本身。
TotPrm = Backup.Sheets(ShtNm).Range(Range("BW2"), Range("BW2").End(xlDown)).Select
同样,这失败了,因为您已将TotPrem
定义为对象(Range
(,但您正在尝试为其分配其他数据类型 -range.Value
不是Range
(即使它是,您也需要使用Set
keyord如上所述( - 而是一个字符串,数字/等。
TotPrm = Backup.Sheets(ShtNm).Range(Range("BW2"), Range("BW2").End(xlDown)).Value`
取下Select
(或.Value
等(并使用Set
:
Set TotPrm = Backup.Sheets(ShtNm).Range(Range("BW2"), Range("BW2").End(xlDown))
首先,您需要完全限定所有范围引用(请参阅下面的点(,否则它们可能会引用不同的工作表,从而导致错误。例如
With Backup.Sheets(ShtNm)
.Range(.Range("N2"), .Range("N2").End(xlDown)).Copy
End With
第二,什么是Values
属性?在我看来,只要您将TotPrm
声明为变体,您的最终配方就可以了。