您可以将丰富数据类型的值赋给 Excel VBA 中的变量吗?
Can you assign a the value of a rich data type into a variable in Excel VBA?
我正在尝试将我使用 Rich 数据类型派生的股票代码(我不确定我说的是否正确)从 B2 保存到一个变量。
我使用了这个代码
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Ticker As String
If Target.Address = "$A" Then
Ticker = Activesheet.Range("B2").Value
MsgBox Ticker
End If
End Sub
当我对 A2 进行更改时会发生这种情况。
我尝试将其转换为文本或字符串,但没有成功。我将变量分配为 Variant 和 String,但它仍然不起作用。错误是说“运行 time error'13' 类型不匹配。但我不知道我哪里做错了。
当我调试它时,Ticker = ""
我四处搜索,但找不到答案。有可能吗?
问题: 当您更改 A2
中的丰富数据类型时,Excel 开始通过 [= 检索 B2
中的股票代码13=]。获取此类数据可能需要一段时间,并且在请求挂起时,B2
将显示为 #FIELD!
。在此状态下,B2.Value
将被读取为错误,因此您的代码将在 Ticker = ActiveSheet.Range("B2").Value
上反弹,因为变量变暗为 String
。这就是您收到“类型不匹配”错误的原因。
解决方案:在您的代码中建立一个轻微的延迟,这将使 Excel 有足够的时间来检索请求的数据。我们可以为此使用 Do While Loop
。定义 2 个布尔值:
- 第一次布尔检查
IsError(ActiveSheet.Range("B2"))
- 第二个布尔函数作为定时器
当这些布尔值中的任何一个变为 False
时退出循环。您希望包含第二个布尔值以确保您不会陷入无限循环。如果 B2
中的值始终保持 #FIELD
,则可能会发生这种情况,因为您没有在 A2
.
中提供有效条目
像下面这样的东西应该可以工作:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Ticker As String
Dim fieldError As Boolean, onTime As Boolean
Dim endTime As Date
'using Target.Text <> "" rather than Target.Value <> "", since the latter will throw an error
'if the range contains a 'rich data type'
If Not Intersect(Target, ActiveSheet.Range("A2")) Is Nothing And Target.Text <> "" Then
'set timeframe to wait for response, set to 1 second here
'we want to check: if "#FIELD!" hasn't changed into a proper value after 1 second
'then data in A2 is probably nonsense: exit loop
endTime = Now + TimeValue("00:00:01")
'set Booleans
onTime = True
fieldError = True
'enter Do While Loop
Do While fieldError And onTime 'continue until
If IsError(ActiveSheet.Range("B2")) Then
Else
'B2 (no longer) an error, switch bool to False to exit loop
fieldError = False
End If
'bool to False after time out to exit loop
onTime = Now < endTime
Loop
'In case of Error, probably incorrect input in A2
On Error GoTo ErrorHandling
Ticker = ActiveSheet.Range("B2").Value
ErrorHandling:
Debug.Print "A2.Text = " & ActiveSheet.Range("A2").Text & "), " & _
"ticker = " & Ticker & ", fieldError = " & fieldError & ", onTime = " & onTime
If Err.Number <> 0 Then
'do stuff (you probably got a correct response, but it's still an error
Debug.Print "Entered ErrorHandling"
Err.Number = 0
End If
Debug.Print "------"
Else
End If
End Sub
举例来说,下面您会看到一个正在运行的循环,该循环使用对 LIST
范围内的项目的引用连续填充 A2
并尝试检索代码。请注意立即 window 中的输出:对于“AA”、“AAPL”和“AMZN”,我们将在 fieldError = False
退出循环(找到代码)。对于“废话”,我们将在 onTime = False
退出(没有自动收报机:我们超时)。
我正在尝试将我使用 Rich 数据类型派生的股票代码(我不确定我说的是否正确)从 B2 保存到一个变量。
我使用了这个代码
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Ticker As String
If Target.Address = "$A" Then
Ticker = Activesheet.Range("B2").Value
MsgBox Ticker
End If
End Sub
当我对 A2 进行更改时会发生这种情况。
我尝试将其转换为文本或字符串,但没有成功。我将变量分配为 Variant 和 String,但它仍然不起作用。错误是说“运行 time error'13' 类型不匹配。但我不知道我哪里做错了。
当我调试它时,Ticker = ""
我四处搜索,但找不到答案。有可能吗?
问题: 当您更改 A2
中的丰富数据类型时,Excel 开始通过 [= 检索 B2
中的股票代码13=]。获取此类数据可能需要一段时间,并且在请求挂起时,B2
将显示为 #FIELD!
。在此状态下,B2.Value
将被读取为错误,因此您的代码将在 Ticker = ActiveSheet.Range("B2").Value
上反弹,因为变量变暗为 String
。这就是您收到“类型不匹配”错误的原因。
解决方案:在您的代码中建立一个轻微的延迟,这将使 Excel 有足够的时间来检索请求的数据。我们可以为此使用 Do While Loop
。定义 2 个布尔值:
- 第一次布尔检查
IsError(ActiveSheet.Range("B2"))
- 第二个布尔函数作为定时器
当这些布尔值中的任何一个变为 False
时退出循环。您希望包含第二个布尔值以确保您不会陷入无限循环。如果 B2
中的值始终保持 #FIELD
,则可能会发生这种情况,因为您没有在 A2
.
像下面这样的东西应该可以工作:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Ticker As String
Dim fieldError As Boolean, onTime As Boolean
Dim endTime As Date
'using Target.Text <> "" rather than Target.Value <> "", since the latter will throw an error
'if the range contains a 'rich data type'
If Not Intersect(Target, ActiveSheet.Range("A2")) Is Nothing And Target.Text <> "" Then
'set timeframe to wait for response, set to 1 second here
'we want to check: if "#FIELD!" hasn't changed into a proper value after 1 second
'then data in A2 is probably nonsense: exit loop
endTime = Now + TimeValue("00:00:01")
'set Booleans
onTime = True
fieldError = True
'enter Do While Loop
Do While fieldError And onTime 'continue until
If IsError(ActiveSheet.Range("B2")) Then
Else
'B2 (no longer) an error, switch bool to False to exit loop
fieldError = False
End If
'bool to False after time out to exit loop
onTime = Now < endTime
Loop
'In case of Error, probably incorrect input in A2
On Error GoTo ErrorHandling
Ticker = ActiveSheet.Range("B2").Value
ErrorHandling:
Debug.Print "A2.Text = " & ActiveSheet.Range("A2").Text & "), " & _
"ticker = " & Ticker & ", fieldError = " & fieldError & ", onTime = " & onTime
If Err.Number <> 0 Then
'do stuff (you probably got a correct response, but it's still an error
Debug.Print "Entered ErrorHandling"
Err.Number = 0
End If
Debug.Print "------"
Else
End If
End Sub
举例来说,下面您会看到一个正在运行的循环,该循环使用对 LIST
范围内的项目的引用连续填充 A2
并尝试检索代码。请注意立即 window 中的输出:对于“AA”、“AAPL”和“AMZN”,我们将在 fieldError = False
退出循环(找到代码)。对于“废话”,我们将在 onTime = False
退出(没有自动收报机:我们超时)。