Excel VBA - 为什么我会收到运行时错误
Excel VBA - Why am I getting Runtime Error
各位,
有人可以帮我理解以下代码有什么问题吗?
Sub CombDelDuplShNamCellAdd()
Dim ProdVal As New Scripting.Dictionary
ProdVal.Add "ULP", 100000
ProdVal.Add "PULP", 200000
ProdVal.Add "SPULP", 300000
ProdVal.Add "XLSD", 400000
ProdVal.Add "ALPINE", 500000
ProdVal.Add "JET", 600000
ProdVal.Add "SLOPS", 700000
Dim AdmSh, CalSh As Worksheet, ProdLinLowRan, ProdLinUppRan As Range
Set CalSh = Sheets("Calendar")
Set AdmSh = Sheets("AdminSheet")
'''' Data Prep Table
ProdLinLowRan = Range(AdmSh.Range("B10")).Offset(1).Address
ProdLinUppRan = Range(AdmSh.Range("B10")).Offset(69).Address
MsgBox ProdLinLowRan
为什么会出现此错误?无法理解。顺便说一句,我是新手。
干杯。
你调错了。
Dim AdmSh As Worksheet
Dim CalSh As Worksheet
Dim ProdLinLowRan As Range
Dim ProdLinUppRan As Range
所有这些对象都需要 Set
。
ProdLinLowRan
没有失败的原因是,您将其调暗为 Variant,这是非常宽容的。
您的代码存在多个问题。
a) 你的变量声明有缺陷。您需要分别为每个变量指定变量类型。如果你写
Dim AdmSh, CalSh As Worksheet, ProdLinLowRan, ProdLinUppRan As Range
变量 AdmSh
和 ProdLinLowRan
将 而不是 属于 Worksheet
类型。 Range
,它们将是 Variant
类型。您需要使用(为了便于阅读而分成两行)
Dim AdmSh as Worksheet, CalSh As Worksheet
Dim ProdLinLowRan as Range, ProdLinUppRan As Range
b) AdmSh.Range("B10").Offset(69)
已经是一个范围。不需要在它周围写Range
。
c) 如果要给一个对象赋值(并且Range是一个对象),需要指定Set
.
Set ProdLinLowRan= AdmSh.Range("B10").Offset(1)
Set ProdLinUppRan = AdmSh.Range("B10").Offset(69)
您的代码中当前正在发生的事情:
ProdLinLowRan = Range(AdmSh.Range("B10")).Offset(1).Address
ProdLinUppRan = Range(AdmSh.Range("B10")).Offset(69).Address
右边的部分(Range(AdmSh.Range("B10")).Offset(1).Address
)将return一个范围的地址作为String($B
)。由于 ProdLinLowRan
被声明为 Variant,VBA 会将那个字符串写入 ProdLinLowRan
并假设您有一个 String 变量。不是你想要的,但可能。
然而,ProdLinUppRan
被声明为 Range
,但未分配(在 VBA 术语中,它是 Nothing
)。将某些内容写入范围就是将某些内容写入单元格,例如 ProdLinUppRan = 3
会将数字 3 写入该单元格,但前提是范围变量指向某个内容。由于情况并非如此,您将收到运行时错误。
各位,
有人可以帮我理解以下代码有什么问题吗?
Sub CombDelDuplShNamCellAdd()
Dim ProdVal As New Scripting.Dictionary
ProdVal.Add "ULP", 100000
ProdVal.Add "PULP", 200000
ProdVal.Add "SPULP", 300000
ProdVal.Add "XLSD", 400000
ProdVal.Add "ALPINE", 500000
ProdVal.Add "JET", 600000
ProdVal.Add "SLOPS", 700000
Dim AdmSh, CalSh As Worksheet, ProdLinLowRan, ProdLinUppRan As Range
Set CalSh = Sheets("Calendar")
Set AdmSh = Sheets("AdminSheet")
'''' Data Prep Table
ProdLinLowRan = Range(AdmSh.Range("B10")).Offset(1).Address
ProdLinUppRan = Range(AdmSh.Range("B10")).Offset(69).Address
MsgBox ProdLinLowRan
为什么会出现此错误?无法理解。顺便说一句,我是新手。
干杯。
你调错了。
Dim AdmSh As Worksheet
Dim CalSh As Worksheet
Dim ProdLinLowRan As Range
Dim ProdLinUppRan As Range
所有这些对象都需要 Set
。
ProdLinLowRan
没有失败的原因是,您将其调暗为 Variant,这是非常宽容的。
您的代码存在多个问题。
a) 你的变量声明有缺陷。您需要分别为每个变量指定变量类型。如果你写
Dim AdmSh, CalSh As Worksheet, ProdLinLowRan, ProdLinUppRan As Range
变量 AdmSh
和 ProdLinLowRan
将 而不是 属于 Worksheet
类型。 Range
,它们将是 Variant
类型。您需要使用(为了便于阅读而分成两行)
Dim AdmSh as Worksheet, CalSh As Worksheet
Dim ProdLinLowRan as Range, ProdLinUppRan As Range
b) AdmSh.Range("B10").Offset(69)
已经是一个范围。不需要在它周围写Range
。
c) 如果要给一个对象赋值(并且Range是一个对象),需要指定Set
.
Set ProdLinLowRan= AdmSh.Range("B10").Offset(1)
Set ProdLinUppRan = AdmSh.Range("B10").Offset(69)
您的代码中当前正在发生的事情:
ProdLinLowRan = Range(AdmSh.Range("B10")).Offset(1).Address
ProdLinUppRan = Range(AdmSh.Range("B10")).Offset(69).Address
右边的部分(Range(AdmSh.Range("B10")).Offset(1).Address
)将return一个范围的地址作为String($B
)。由于 ProdLinLowRan
被声明为 Variant,VBA 会将那个字符串写入 ProdLinLowRan
并假设您有一个 String 变量。不是你想要的,但可能。
然而,ProdLinUppRan
被声明为 Range
,但未分配(在 VBA 术语中,它是 Nothing
)。将某些内容写入范围就是将某些内容写入单元格,例如 ProdLinUppRan = 3
会将数字 3 写入该单元格,但前提是范围变量指向某个内容。由于情况并非如此,您将收到运行时错误。