更改传递给函数

时间:2018-01-19 10:05:25

标签: arrays excel-vba compiler-errors vba excel

情况:

我有一个函数RemoveEmptyArrRowCol,它接受​​两个参数,其中一个是数组(tempArr)。

当第二个参数是时,一切都很好。当我将第二个参数更改为 String (以及相关的调用变量)时,我得到了:

  

类型不匹配(错误13)

所以在下面的代码示例中:

  1. Test1运行良好
  2. Test2失败
  3. 问题:

    1)为什么两者之间的行为不同?

    2)如何修复第二个版本,使其按照第一个版本进行操作?

    3)当我将字典值(数组)作为第一个参数传递而不是直接从工作表中读取时,我将如何证明这一点?

    我尝试了什么:

    这似乎是一个关于SO的常见问题,我已经看过其中的一些问题;其中一些我在这个问题的底部作为参考。但是,我仍然没有解决为什么这两个子工作中的第一个工作原理,但第二个工作原理没有?

    我玩了不同的组合:

    1. 添加额外的括号
    2. 明确声明tempArrDim tempArr() As Variant
    3. 的类型
    4. 更改功能签名的一部分:ByRef tempArr() As Variant
    5. 在查看@ Fionnuala对此问题的回答MS Access/VBA type mismatch when passing arrays to function/subroutine之后,我决定尝试使用Call

      Call RemoveEmptyArrRowCol2(ws.Range("C4:I129").Value, tempStr)
      

      这已编译但意味着我需要更改代码的其他部分以确保正确填充tempArr。如果我这样做,我不妨将函数转换为过程。

      按原样,流程是我在测试示例中填写tempArr,直接从工作表填充,然后交给另一个子工作,即

      tempArr = RemoveEmptyArrRowCol(ws.Range("C4:I129").Value, tempStr)
      ArrayToSheet wb.Worksheets("Test").Range("A1"), tempArr
      

      请注意:问题3:

      在最终版本中,我将传递一个数组,从字典中提取,作为第一个参数,即

      tempArr = RemoveEmptyArrRowCol( ArrayDict(tempStr), tempStr)
      

      工作版本:

      Option Explicit
      
      Public Sub Test1()
      
          Dim tempArr() 'variant
      
          Init
      
          Dim tempStr As String: tempStr = "Response Times"
      
          tempArr = RemoveEmptyArrRowCol(ws.Range("C4:I129").Value, categoryDict(tempStr & "Cols"))
      
      End Sub
      
      Private Function RemoveEmptyArrRowCol(ByRef tempArr As Variant, ByVal nCols As Long) As Variant
      
      End Function
      

      版本失败:

      Public Sub Test2()
      
          Dim tempArr()
      
          Init
      
          Dim tempStr As String: tempStr = "Response Times"
      
          tempArr = RemoveEmptyArrRowCol2(ws.Range("C4:I129").Value, tempStr)
      
      End Sub
      
      Private Function RemoveEmptyArrRowCol2(ByRef tempArr As Variant, ByVal tempStr As String) As Variant
      
      End Function    
      

      当前完整功能的示例:

      Private Function RemoveEmptyArrRowCol(ByRef tempArr As Variant, ByVal tempStr As String) As Variant
      
          Dim i As Long
          Dim j As Long
          Dim counter As Long
          counter = 0
      
          Dim tempArr2()
      
          Dim totCol As Long
          Dim adjColTotal As Long
      
          totCol = categoryDict(tempStr & "Cols")
          adjColTotal = categoryDict(tempStr & "ColsAdj")
      
          Select Case tempStr
      
              Case "ResponseTimes", "NoCCPR"
      
                  ReDim tempArr2(1 To 1000, 1 To adjColTotal)
      
                  For i = 1 To UBound(tempArr, 1)
      
                      If tempArr(i, 2) <> vbNullString Then   'process row
      
                          counter = counter + 1                'load row to temp array (counter becomes row count)
      
                          For j = 1 To totCol
      
                              Select Case j
                                  Case Is < 4
                                      tempArr2(counter, j) = tempArr(i, j)
                                  Case Is > 4
                                      tempArr2(counter, j - 1) = tempArr(i, j)
                              End Select
      
                          Next j
      
                      End If
      
                  Next i
      
                  RemoveEmptyArrRowCol = RedimArrDimOne(tempArr2, adjColTotal, counter)
      
             Case "Incidents"
      
          End Select
      
      End Function
      

      其他参考资料:

      1)Passing arrays to functions in vba

      2)Passing array to function returns compile error

      3)Type mismatch error when passing arrays to a function in excel vba

      4)Should I use Call keyword in VBA

2 个答案:

答案 0 :(得分:0)

这实际上取决于您的输入和输出,例如RemoveEmptyArrRowCol2函数中的内容。这是一个选项,其中tempStr as String没有失败:

Public Sub Test2()
    Dim tempArr()
    Dim tempStr As String: tempStr = "Response Times"
    tempArr = RemoveEmptyArrRowCol2(Range("C4:I129").Value, tempStr)
End Sub

Private Function RemoveEmptyArrRowCol2(ByRef tempArr As Variant, _
                                       ByVal tempStr As String) As Variant
    RemoveEmptyArrRowCol2 = Array(1, 2)
End Function

,例如,如果删除返回值(数组(1,2),它会失败),但它应该失败,因为它不会返回任何内容。

答案 1 :(得分:0)

将“Dim tempArr As Variant”定义为“()”的变体数组。

请告诉我们您的功能“categoryDict”和“ArrayDict”

“通话”并非无足轻重!

您可以按如下方式访问值:

Dim r As Long
Dim c As Long
For r = 1 To UBound(tempArr, 1)
    For c = 1 To UBound(tempArr, 2)
        Debug.Print tempArr(r, c)
    Next
Next