0

あるサブルーチンから別のサブルーチンに変数を渡す際に問題があります。それらを公開と宣言しましたが、機能していないようです。サブルーチンが範囲外だと言っています。必要なのは、2 番目のサブルーチンで varUnique (配列) と firstIndex を使用することだけです。これを達成するために何をする必要がありますか?

Public fistIndex As Integer
Public varUnique As Variant
Sub FindUnique()

    Dim varIn As Variant
    Dim iInCol As Long
    Dim iInRow As Long
    Dim iUnique As Long
    Dim nUnique As Long
    Dim isUnique As Boolean
    Dim lastIndex As Integer

    varIn = Range("List")
    ReDim varUnique(1 To UBound(varIn, 1) * UBound(varIn, 2))

    nUnique = 0
    For iInRow = LBound(varIn, 1) To UBound(varIn, 1)
        For iInCol = LBound(varIn, 2) To UBound(varIn, 2)

            isUnique = True
            For iUnique = 1 To nUnique
                If varIn(iInRow, iInCol) = varUnique(iUnique) Then
                    isUnique = False
                    Exit For
                End If
            Next iUnique

            If isUnique = True Then
                nUnique = nUnique + 1
                varUnique(nUnique) = varIn(iInRow, iInCol)
            End If

        Next iInCol
    Next iInRow
    '// varUnique now contains only the unique values.
    '// Trim off the empty elements:
    ReDim Preserve varUnique(1 To nUnique)
    firstIndex = LBound(varUnique)
    lastIndex = UBound(varUnique)


create:
    If Not varUnique(firstIndex) = "Sub-Total" Then
    Worksheets.Add.Name = varUnique(firstIndex)
    Call Ledge(varUnique, firstIndex)
    Else
    End
    End If
    If Not firstIndex = lastIndex Then
    firstIndex = firstIndex + 1
    ActiveCell.Offset(1, 0).Select
    GoTo create
    Else
    End If
End Sub
Sub Ledge(varUnique, firstIndex)
'

'

'Define Variables
Dim Account_type As String
Dim Debit As Long
Dim Credit As Long


'Select Journal and Cell B4
    Sheets("Journal").Select
    Range("B4").Select

Account_Search:
'Make that cell= account_type
    Account_type = ActiveCell.Value
'If that cell= cash then save the values adjecent
    If Account_type = varUnique(firstIndex) Then
        ActiveCell.Offset(0, 1).Select
        Debit = ActiveCell.Value
        ActiveCell.Offset(0, 1).Select
        Credit = ActiveCell.Value
'Then go back to where you began
        ActiveCell.Offset(0, -2).Select
'Select Cash and Cell A2
        Sheets(varUnique(firstIndex)).Select
        Range("A2").Select
Search:
'If both cells are empy
            If ActiveCell.Value = "" And ActiveCell.Offset(0, 1).Value = "" Then
'Then write values and indicate you have done so
               ActiveCell.Value = Debit
               ActiveCell.Offset(0, 1).Select
               ActiveCell.Value = Credit
               Else
'If they are not empty go down one cell and search again
               ActiveCell.Offset(1, 0).Select
               GoTo Search
            End If
'Once it is recorded go to Journal again and go down one more cell
                Sheets("Journal").Select
                ActiveCell.Offset(1, 0).Select
'If it wasn't cash then go down one
    Else
        ActiveCell.Offset(1, 0).Select
    End If
'Record that cell value and check to see if it is not sub-total
    Account_type = ActiveCell.Value
    If Not Account_type = "Sub-Total" Then
'Now see if it is cash
        GoTo Account_Search
    Else
    End If
End Sub
4

1 に答える 1

1

「範囲外の添え字」は、配列firstIndex内の欠落した項目を指している可能性がありますが、エラーはパラメーターを渡すためではないと思います。varUnique

あなたのコードに関するいくつかの考え:

  • 一般に、バリアントは避けるべきですが、配列に関してはバリアントが便利な場合があります。代わりに、型付き配列 (この場合は文字列配列、Dim varUnique() as String代わりに使用) またはコレクションを使用します。
  • 質問へのコメントに記載されているように、可能であればパブリック変数またはグローバル変数も避ける必要があります。上記のコードでは、それらは絶対に必要ありません。
  • Option Explicit上記の も使用します。この方法でコンパイルすると、多くのエラーが見つかります。他の方法では見つけるのが非常に難しいエラーです ( fistIndexvsを参照firstIndex) 。
  • 関数を使用して、呼び出し元のサブに値を渡します-あなたの例では必要ないと思います-firstIndex私が知る限り、あなたは変更しません

最後に、私が知っているサブルーチンと関数の間でパラメーターを渡すいくつかの例がありますが、私が言ったように、それが問題を抱えているとは思いません。

Option Explicit

Sub OuterSub()
    Dim varUnique As Variant
    Dim firstIndex As Integer
    Dim returnedInt As Integer

    '***** Create array
    varUnique = Array("String#1", "String#2", "String#3", "String#4", "String#5", "String#6")

    '***** Get first index
    firstIndex = LBound(varUnique)

    '***** Pass variables to second sub
    Call InnerSub(varUnique, firstIndex)

    '***** Pass variables to and from function
    returnedInt = InnerFunction(varUnique, firstIndex)

    Debug.Print "returnedInt=" & returnedInt & ", varUnique(returnedInt)=" & varUnique(returnedInt)
End Sub

Sub InnerSub(pvIn As Variant, piIndex As Integer)
    '***** Do something with the paramterers, like
    '***** checking to see if pvIn is an array
    If IsArray(pvIn) Then
        Debug.Print pvIn(piIndex)
    Else
        Debug.Print "pvIn not an array..."
    End If
End Sub

Function InnerFunction(pvIn As Variant, piIndex As Integer) As Integer
    '***** Return Integer
    InnerFunction = piIndex + 1
End Function
于 2012-10-22T08:55:15.540 に答える