Вызов функции, возвращающей ArrayList - PullRequest
1 голос
/ 10 июля 2020

Я больше всего знаком с другими языками программирования, такими как java и C ++. VBA для меня все еще новинка, и я почти не знаю, что делаю. Я попытался вернуть Arraylist из функции, но продолжаю получать ошибку 5 - недопустимый вызов процедуры или аргумент.

Dim months As ArrayList
Dim temp As Integer

Set months = New ArrayList

'Copy and Paste State and Quarter Specific Data
Sheets("The Data (2)").Select
ActiveSheet.Range("$A:$T").AutoFilter Field:=6, Criteria1:=stateName
months = getMonths(Year, Quarter)
ActiveSheet.Range("$A:$T").AutoFilter Field:=17, Criteria1:=months.Item(0), Operator:=xlOr, Criteria2:=months.Item(1), Operator:=xlOr, Criteria3:=months.Item(2)
Range("$A$1:$$T$1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Windows("State Rate Planning Template.xlsm").Activate
Sheets(3).Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Range("A1").Select

Я получаю сообщение об ошибке «months = getMonths (Year, Quarter)». Год и Квартал - это строки, объявленные над кодом, который у меня здесь.

Вот функция getMonths:

Function getMonths(Year As String, Quarter As String) As ArrayList

    Dim i As Integer
    Dim month As String
    Dim monthList As ArrayList
    
    Set monthList = New ArrayList
    
    If (StrComp(Quarter, "1", compare) = 0) Then
        For i = 1 To 3
            month = Year & "-0" & i
            monthList.Add month
        Next i
    
    ElseIf (StrComp(Quarter, "2", compare) = 0) Then
        For i = 4 To 6
            month = Year & "-0" & i
            monthList.Add month
        Next i
    
    ElseIf (StrComp(Quarter, "3", compare) = 0) Then
        For i = 7 To 9
            month = Year & "-0" & i
            monthList.Add month
        Next i
    
    ElseIf (StrComp(Quarter, "4", compare) = 0) Then
        For i = 10 To 12
            month = Year & "-" & i
            monthList.Add month
        Next i
    
    End If
    
    Set getMonths = monthList

End Function

Любая помощь будет оценена для VBA newb ie:)

Ответы [ 3 ]

1 голос
/ 10 июля 2020

Попробуйте этот код.

Private Sub Test()
    ' 066
    
    Dim Months()    As String
    Dim Temp        As Integer
    
    Months = getMonths(2020, 4)
    For Temp = 1 To 3
        Debug.Print Months(Temp)
    Next Temp
End Sub

Function getMonths(ByVal Year As Integer, _
                   ByVal Quarter As Integer) As String()
    ' 066

    Dim Fun(1 To 3) As String               ' function return array
    Dim i           As Integer
    
    For i = 1 To 3
        Fun(i) = Format(((Quarter - 1) * 3) + i, CStr(Year) & "-00")
    Next i
    getMonths = Fun
End Function
1 голос
/ 10 июля 2020
Ответ

@ Super Symmetry - это именно то, что вам нужно, чтобы продолжать работу.

Другие, кто может наткнуться на этот вопрос, должны знать, что для того, чтобы иметь возможность напрямую работать с типом ArrayList из VBA (т.е. в раннее связывание ), нужно добавить ссылку на mscorlib.dll из Tools / References / Browse, а затем перейти к нужной папке. NET Framework (например, C: \ Windows \ Microsoft.NET \ Framework \ v4. #. #####) и выбрав файл mscorlib.tlb. Позднее связывание позволит вашим макросам работать на компьютерах с разными версиями. NET framework (YMMV) за счет Intellisense.

Вы упомянули, что вы новичок в VBA, поэтому вот некоторая дополнительная информация.

Явный оператор Option

Используйте Явный параметр Option в верхней части всех ваших модулей и модулей классов. Вы можете настроить редактор VBA, чтобы он делал это автоматически, выбрав Инструменты / Параметры / Редактор / Требовать объявление переменной. Затем вы можете использовать отладку / компиляцию для быстрого поиска проблем.

Как избежать использования select в Excel VBA

Для надежного и чистого кода избегайте использования метода select. Если вы записываете макросы, пусть это будет только для целей обнаружения; очистите их с помощью методов, приведенных в этом популярном ответе.

Наконец, я не мог не сократить вашу функцию getMonths. Вот и тестовый переводчик:

Option Explicit

Function getMonths(iYear As Integer, iQuarter As Integer) As ArrayList
    Dim monthList As ArrayList
    Dim i As Byte
    Dim item As String
    
    Set monthList = New ArrayList
    
    'Assumption: iYear and iQuarter are both within valid ranges.
    For i = (iQuarter - 1) * 3 + 1 To (iQuarter - 1) * 3 + 3
        item = CStr(iYear) & "-" & Format(i, "00")
        monthList.Add item
    Next
    
    Set getMonths = monthList
End Function

Public Sub Test()
    Dim months As ArrayList
    Dim iYear As Integer
    Dim iQuarter As Integer
    Dim monthItem As Variant
    
    iYear = 2020
    For iQuarter = 1 To 4
        Set months = getMonths(iYear, iQuarter)
        For Each monthItem In months
            Debug.Print monthItem
        Next
    Next
End Sub
1 голос
/ 10 июля 2020

Измените строку ошибки на

Set months = getMonths(Year, Quarter)

, и вам не нужна строка

Set months = New ArrayList

months содержит ссылку на объект (используя c ++ и java термины) и для установки этой ссылки вам нужно использовать ключевое слово VBA Set.

Edit:

И если вы используете функцию @ Variatus getMonths() (которая возвращает собственный Array I VBA Я почти уверен, что вы можете упростить свой фильтр следующим образом:

ActiveSheet.Range("$A:$T").AutoFilter Field:=17, Criteria1:=months

Это не проверено, и я должен быть исправлен, так как массив, возможно, должен быть небольшим, но попытаться не повредит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...