代码之家  ›  专栏  ›  技术社区  ›  MTT

整数的ByRef参数类型不匹配

  •  1
  • MTT  · 技术社区  · 8 年前

    我已经将I和j声明为整数,并将ByRef放在DisplayTreeHelp函数中,以保留完成DisplayTreeHelp函数后为I和j获取的值。(否则,该值将返回到在输入DisplayTreeHelp之前的值)。但是,如果不在DisplayTreeHelp函数中指定ByRef,则j将保留该值。

    Public Sub DisplayTree()
        'Given country
        Dim country As String
        country = Sheets("Tree").Range("Country").Value2
    
        'Start cell
        Dim start As Range
        Set start = Range("A2")
    
        Dim dic1 As Dictionary
        Dim key1 As Variant
        Dim i, i_max As Integer
        Dim j, j_max As Integer
    
        Set dic1 = CreateTree
        'Column start
        j = start.Column
        j_max = j
        'Row start
        i = start.Row
        i_max = i
    
        Dim tempArrSize As Long
        tempArrSize = 1
    
        Dim tempArr1() As Variant
        ReDim tempArr1(1 To 1)
    
        'Iterate dictionary to get nodes with parent node 0
        For Each key1 In dic1.Keys()
            If dic1(key1).country = country Then
                If dic1(key1).parentNodeId = 0 Then
                    'make array 1 bigger
                    tempArrSize = tempArrSize + 1
                    ReDim Preserve tempArr1(1 To tempArrSize + 1)
                    'store it in an array
                    tempArr1(dic1(key1).OrderId) = key1
                End If
            End If
        Next
    
        If Not IsEmpty(tempArr1) Then
            Dim key2 As Variant
            For Each key2 In tempArr1
                If Not IsEmpty(key2) Then
                    i = i + 1
                    If i > i_max Then
                        i_max = i
                    End If
    
                    Sheets("Tree").Cells(i, j).Value = dic1(key2).NodeName
    
                    Dim dic2 As Dictionary
                    Set dic2 = dic1(key2).ChildNodes
    
                    Call DisplayTreeHelp(dic2, i, j, i_max, j_max)
                End If
            Next
        End If
    
        Call Format_tree(start, i_max, j_max)
    End Sub
    

    递归函数

    Private Function DisplayTreeHelp(dic2 As Dictionary, ByRef i As Integer, ByRef j As Integer, ByRef i_max As Integer, ByRef j_max As Integer) As Variant
    
        If dic2.Count = 0 Then
            'Do nothing
        Else
            Dim key3 As Variant
            Dim tempArr2() As Variant
            ReDim tempArr2(1 To dic2.Count + 1)
    
            j = j + 1
            If j > j_max Then
                j_max = j
            End If
    
            'Create array with the proper order within the bucket
            For Each key3 In dic2.Keys()
                'Add all keys to array in the index of the order id
                tempArr2(dic2(key3).OrderId) = key3
            Next
    
            If Not IsEmpty(tempArr2) Then
                Dim key4 As Variant
                For Each key4 In tempArr2
                    If Not IsEmpty(key4) Then
                        i = i + 1
                        If i > i_max Then
                            i_max = i
                        End If
                        Sheets("Tree").Cells(i, j).Select
                        Selection.Value = dic2(key4).NodeName
    
                        Call DisplayTreeHelp(dic2(key4).ChildNodes, i, j, i_max, j_max)
                    End If
                Next key4
                j = j - 1
            End If
        End If
    End Function
    

    有人知道这个吗?提前谢谢!

    2 回复  |  直到 8 年前
        1
  •  8
  •   Comintern    8 年前

    i j 未声明为 Integer ,它们是隐式的 Variant . 在这些申报栏上。。。

    Dim i, i_max As Integer
    Dim j, j_max As Integer
    

    最后的 列表中的变量是强类型的。您需要为每个类型指定一个类型:

    Dim i As Integer, i_max As Integer
    Dim j As Integer, j_max As Integer
    
        2
  •  7
  •   Tim Williams    8 年前

    “我已声明I和j为整数”

    在VBA中,必须单独键入每个变量—不能只在逗号分隔的声明列表中键入最后一个变量。

    Dim i, i_max As Integer
    

    应该是

    Dim i As Integer, i_max As Integer