0
我有一個變量從一個子程序傳遞給另一個子程序時出現問題。我已經宣佈它們是公開的,但似乎並不奏效。它說子程序超出範圍。我需要的是在我的第二個子程序中使用varUnique(一個數組)和firstIndex。我需要做什麼來完成這個任務?VBA子程序不能傳遞變量
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
** a)**使用函數返回值而不是從'Sub'中設置全局變量。好的代碼沒有全局變量。 ** b)**也許你應該把變量'firstIndex'稱爲變量,而不是有時調用它'fistIndex'。使用'Option Explicit'並查看會發生什麼。實際上你真的應該在你編寫的所有VBA代碼中使用它。 – Tomalak
@Tomalak告訴人們,好的代碼沒有全局變量是沒有用的。或者是真的。將全局變量取出不會使糟糕的代碼變得更好,並且使用全局變量不會使代碼變得糟糕。另外,你對'Option Explicit'完全正確。 –
@ Seith是的,關於golbal變量的部分有點爭論。無論如何,我認爲避免在全局變量中保持狀態是一個好習慣,特別是作爲初學者,特別是在上述情況下。對於所有事情來說,使用全局變量都很容易,也很誘人,而且可以從中得到一點好處。 – Tomalak