各种错误,取决于格式 - 运行时"438","91","13"



我正在尝试根据第三列中的值将多列从一workbook复制到另一列。我为此尝试了多种格式,将对象声明为rangevariant,将所选范围设置为.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 的RangeVariant

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 PremiumsCurrent PremiumsRetroactive 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(即使它是,您也需要使用Setkeyord如上所述( - 而是一个字符串,数字/等。

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声明为变体,您的最终配方就可以了。

最新更新