【问题标题】:Why am I getting (run-time error '13': ) type mismatch when looping across a (sometimes-empty) variant?为什么在循环(有时为空)变体时出现(运行时错误'13':)类型不匹配?
【发布时间】:2020-10-02 21:29:50
【问题描述】:

我正在使用Private Sub Worksheet_Change(ByVal Target As Excel.Range) 事件(第一次)在单个工作表中构建动态验证列表。单元格 A2 和 B2 包含验证下拉列表;单元格 B2 取决于单元格 A2;并且单元格 A2 取决于 A 列中超出 A5 的其余值

[在此列表中,B2 中的最终选择将产生与其相关的其他值:DB-like ]

这就是工作表更改后子例程的工作方式:

变量声明* variant, range, string

设置三个范围对象 A、B 和 C,其中 B 和 C 使用 A(范围中最后使用的单元格)

检查目标的位置

  1. 如果目标位于第一列(A 列),

1a) 查看目标是否在第二行 (A2)...如果是,则清除 B 范围内的内容,调用 function1,返回过滤值及其过滤值的 array活动工作表上的单元格位置 >> 将返回的数组分配给在后续调用中使用的变量 variable1

  • 调用函数1
  • 变量1 = 函数1
  • 调用函数2(Target,变量1)
  1. 如果目标在第二列 (B),

2a) 查看目标是否在第二行(B2)...如果是,则清除C范围内的内容,调用函数根据B2中的内容填充C范围内的单元格;如果目标不在 B2 中,则不应该发生其他任何事情

  1. 如果目标在其他任何地方

...什么都没发生


问题发生在调用函数2;当我观察变量/在值更改时添加中断时,function1 和 variable1 似乎可以正确接收值,但是当调用 function2 时,它会抛出运行时错误并告诉我 variable1 为空...

我不知道在初始执行期间对范围所做的更改是否算作对工作表的后续更改,或者它们是否都算作相同的更改

我已经成功让 A2 和 B2 中的下拉列表工作,但 B2 中的更改并没有促进最终更改,因此重新配置了代码...重新配置的代码产生了一个奇怪的错误追逐

我确实尝试过停用/激活 enableEvents,(对我来说也是新的)但它没有改变结果...下面是来自 function2 (arg1, arg2) 的代码...如果一切正常,我不会不知道为什么会返回错误

Call StateFinder                                           'calls the function that builds address 
SearchAll50 = StateFinder                                  'sets the new searchable array to it's value
Call ListBuilder(Target, SearchAll50)                      'builds a list of values in the target cell
                                
                                
'a variable set that stores the Target's address
'-----------------------------------------------
StateGPS = GetPlaceGPS(Target.Value, SearchAll50)           'the Target address will be set to variable

GetPlaceGPS 抛出错误

Function GetPlaceGPS(ByVal SelectedPlace As String, ByVal MadeList As Variant) As String
'the returned address will then be used to set the range used to search cities

    Dim i As Long     
    For i = LBound(MadeList) To UBound(MadeList)
    
        If MadeList(i)(0) = SelectedPlace Then
            'compares the first value of the ith row to the selected state
            'once the state is found GetStateGPS is set to the sheet address
                
             GetPlaceGPS = MadeList(i)(1)
            
            'exit the function once the value is properly set
             Exit For
        End If        
    Next i
    
End Function

【问题讨论】:

  • 函数中的哪一行抛出错误?你想要 ByRef MadeList() As String
  • 嗨@QHarr,我注意到 SOMETIMES 函数难以将值分配给 SearchAll50 变体,这意味着它传递的是空的/未分配的GetPlaceGPS() 函数的变体 当 For 循环在 GetPlaceGPS() 内部开始时,启动循环的行是错误突出显示的行。充其量,我可以推断出该函数正试图通过数组的 LBound (....这是 0)循环到错误清空数组的 Ubound (...也假定为 0)代码在这里中断并且之前分配的值都没有得到值。

标签: arrays excel vba worksheet-function


【解决方案1】:

必须使用字符类型参数并且必须声明为变量。

Dim myString As String
myString = target.Value
StateGPS = GetPlaceGPS(myString, SearchAll50) '<~~ Character type arguments must be used and must be declared as variables.

【讨论】:

  • 感谢@Dy.Lee,但恐怕我可能需要澄清您的建议:在代码的前面,StateGPS 被声明为字符串变量,但未设置为初始值,直到它的值被设置为等于函数Q-01:的结果之前,它也不会出现。你所说的“字符类型参数”是什么意思?我搜索了 MSDN,但没有找到我正在寻找的答案......这里的链接会很好 Q-02: 在你的回答中,我注意到你取了 Target 的值并设置了它等于一个内部变量 >> 使用 Target.value 做这个 VS 有什么区别?
  • @ArthurL.,在您的用户定义函数中,您已经指定了参数的格式。如果另一个可执行代码没有将参数声明为相同类型的变量,则将其识别为不同的类型并返回错误。
  • 一个新的字符串变量等于目标值(根据建议)......当将新的字符串变量设置为目标值时,代码会抛出它的第一个错误这是所有的实时错误行之前的代码:` Dim TargetValue As String Dim TargetPlace As Range Dim SearchAll50 As Variant Dim CitySearch As Variant Dim LastR2Cell As Range Dim StatChange As Range Dim CityChange As Range Dim StateGPS As String Dim CityGPS As String TargetValue = Target.Value 'sets目标值的内部变量`仍然运行时错误'13':类型不匹配
  • 这里奇怪的是,代码在运行时错误开始之前就可以工作,中断序列...我看不出在哪里引入了类型不匹配代码变得无响应(意思是停止响应在工作表上所做的任何更改)。重新启动 Excel 并重新打开工作簿后,它再次响应,但运行时错误仍然存​​在
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
相关资源
最近更新 更多