Excel VBA 调用功能(主要然后是许多 SUB):)



我试图为我的任务创建一个 vba。但我担心它不起作用,只会返回消息"程序太大"。所以在我完成它之前(我只完成了 50 个程序中的 4 个(,我想知道是否有一种方法可以划分我的工作,比如使用"CALL"功能。

但我的问题是,我使用"FOR-NEXT"功能,结合"IF-ELSE"功能。这是我代码的一部分。

For R = 10 To LROW
If ws.Cells(R, 2).Value = "ASIA UNITED BANK" And ws.Cells(R, 3).Value = "C/A# 001-01-002838-0" Then
ws1.Range("A1").AutoFilter Field:=1, Criteria1:=Years & "-" & Months & "-" & Days
ADD = WorksheetFunction.Sum(ws1.Range("E2:E1500").SpecialCells(xlCellTypeVisible))
ws.Cells(R, 5).Value = ADD
ws1.Cells.AutoFilter
ws1.Range("A1").AutoFilter Field:=1, Criteria1:=Years & "-" & Months & "-" & Days
MIN = WorksheetFunction.Sum(ws1.Range("D2:D1500").SpecialCells(xlCellTypeVisible))
ws.Cells(R, 11).Value = MIN
ws1.Cells.AutoFilter
ElseIf ws.Cells(R, 2).Value = "ASIA UNITED BANK" And ws.Cells(R, 3).Value = "C/A# 001-01-003813-3" Then
ws2.Range("A1").AutoFilter Field:=1, Criteria1:=Years & "-" & Months & "-" & Days
ADD = WorksheetFunction.Sum(ws2.Range("E2:E1500").SpecialCells(xlCellTypeVisible))
ws.Cells(R, 5).Value = ADD
ws2.Cells.AutoFilter
ws2.Range("A1").AutoFilter Field:=1, Criteria1:=Years & "-" & Months & "-" & Days
MIN = WorksheetFunction.Sum(ws2.Range("D2:D1500").SpecialCells(xlCellTypeVisible))
ws.Cells(R, 11).Value = MIN
ws2.Cells.AutoFilter

如您所见,我使用变量"R"来寻址行号。我将有近 50 个"else If"函数。

我想要一个"MAIN"函数,然后我放置"FOR-NEXT"函数,然后放置"IF-ELSE",但"IF-ELSE"函数包含的唯一过程是"CALL"函数。

但是变量"R"将不再起作用。而且我不知道如何将"IF ELSE"函数中的"R"与下一个 SUB 匹配。

希望有人能理解这篇长文。谢谢!

你真的不需要过滤 - 你可以使用SUMIF.

以下示例中的ReturnMyNumbers函数根据第A列中的日期将列EK中的数字相加。 然后,它将两个号码返回到调用过程。
我已经在函数参数中包含银行名称和标识符- 我不确定您如何使用它们来决定从哪个工作表中相加,所以我想我会把它们留在那里。

Test过程是您在每次循环迭代时将参数传递给函数ws单步执行行的位置。

Public Sub Test()
Dim MyResults As Variant
With ThisWorkbook
'Can put results directly into cells.
.Worksheets("Sheet1").Range("A1:B1") = ReturnMyNumbers( _
Bank:="Asia United Bank", _
Account:="C/A# 001-01-002838-0", _
AccountSheet:=.Worksheets("Sheet2"), _
ActiveDate:=DateSerial(2018, 9, 13))
'Or pass results back to variable.
MyResults = ReturnMyNumbers("Asia United Bank", "C/A# 001-01-002838-0", .Worksheets("Sheet3"), DateSerial(2019, 4, 15))
'And then paste into cells.
.Worksheets("Sheet1").Range("A2:B2") = MyResults
'Or use the two results separately.
MsgBox MyResults(0) & " and " & MyResults(1)
End With
End Sub
Public Function ReturnMyNumbers(Bank As String, Account As String, _
AccountSheet As Worksheet, ActiveDate As Date) As Variant
Dim rLastCell As Range
Dim Add As Double
Dim Min As Double
With AccountSheet
Set rLastCell = .Cells(.Rows.Count, 1).End(xlUp)
Add = WorksheetFunction.SumIf(.Range("A1", rLastCell), ActiveDate, .Range(.Cells(1, 5), rLastCell.Offset(, 5)))
Min = WorksheetFunction.SumIf(.Range("A1", rLastCell), ActiveDate, .Range(.Cells(1, 11), rLastCell.Offset(, 11)))
End With
ReturnMyNumbers = Array(Add, Min)
End Function

最新更新