您可以将丰富数据类型的值赋给 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 个布尔值:

  1. 第一次布尔检查IsError(ActiveSheet.Range("B2"))
  2. 第二个布尔函数作为定时器

当这些布尔值中的任何一个变为 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 退出(没有自动收报机:我们超时)。