VBA Collection - передача переменной в качестве ключа - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь написать код, который возвращает название текущего месяца на французском языке.Я создал коллекцию, и она возвращает мой месяц, но я не могу подключить ее ко второй функции, которая возвращает номер текущего месяца.

Первый и второй MsgBox возвращают DECEMBRE и «12», как и ожидалось, но последний возвращает ошибку времени выполнения «5»: неверный вызов процедуры или аргумент.

Sub test()

    Dim Month1 As String
    Dim dict As New Collection

    dict.Add "JANVIER", "1"
    dict.Add "FÉVRIER", "2"
    dict.Add "MARS", "3"
    dict.Add "AVRIL", "4"
    dict.Add "MAI", "5"
    dict.Add "JUIN", "6"
    dict.Add "JUILLET", "7"
    dict.Add "AOUT", "8"
    dict.Add "SEPTEMBRE", "9"
    dict.Add "OCTOBRE", "10"
    dict.Add "NOVEMBRE", "11"
    dict.Add "DÉCEMBRE", "12"

    Month1 = """" & Month(Now) & """"
    MsgBox (dict.Item("12"))     '1st check - OK
    MsgBox (Month1)              '2nd check - OK
    MsgBox (dict.Item(Month1))   'final result - FAIL

End Sub

Где находитсяошибка?

Ответы [ 4 ]

0 голосов
/ 27 декабря 2018

Я немного переписал ваш код для разделения проблем и просто использовал неявное преобразование Excel, чтобы получить Месяц (Сейчас) в виде строки.VBA просто преобразует значение в строку, но вы также можете использовать преобразование типов для преобразования чисел в строки с помощью CSTR ().

В целом, некоторые другие решения компактны, и вы должны их использовать, ноэто действительно указывает на то, что вам, возможно, нужно больше осознавать разделение интересов (по сути, хорошие привычки кода), преобразование типов и неявное / явное преобразование в VBA.Кроме того, вам может быть проще использовать Debug.Print при кодировании / отладке, а также использовать окна Immediate и Locals для понимания вашего кода.

Код

Private dict As Collection
Sub SetArray()

    Set dict = New Collection

    dict.Add "JANVIER", "1"
    dict.Add "FÉVRIER", "2"
    dict.Add "MARS", "3"
    dict.Add "AVRIL", "4"
    dict.Add "MAI", "5"
    dict.Add "JUIN", "6"
    dict.Add "JUILLET", "7"
    dict.Add "AOUT", "8"
    dict.Add "SEPTEMBRE", "9"
    dict.Add "OCTOBRE", "10"
    dict.Add "NOVEMBRE", "11"
    dict.Add "DÉCEMBRE", "12"

End Sub

Тесты:

Sub Test()

    SetArray

    Dim Month1 As String

    Debug.Print dict.Item("12")     '1st check - OK

    Month1 = Month(Now)
    Debug.Print Month1               '2nd check - OK

    Debug.Print dict.Item(Month1)   'final result - SUCCEED

    Month1 = CStr(Month(Now))
    Debug.Print dict.Item(Month1)   'final result - SUCCEED

End Sub
0 голосов
/ 27 декабря 2018

"""" & Month(Now) & """" заключает значение в двойные кавычки, где "1" просто конвертирует число 1 в строку.Коллекции VBA даже не важно, числовое число или строковое.И Month1 = Month(Now), и MsgBox dict.Item(Month(Now)) работают.

При этом я бы просто использовал массив.

Function getMois(MonthIndex As Long) As String
    getMois = Array("JANVIER", "FÉVRIER", "MARS", "AVRIL", "MAI", "JUIN", "JUILLET", "AOUT", "SEPTEMBRE", "OCTOBRE", "NOVEMBRE", "DÉCEMBRE")(MonthIndex - 1)
End Function
0 голосов
/ 27 декабря 2018
Function GetMonth(iMonth%)
    GetMonth = Choose(iMonth, "JANVIER", ..., "DÉCEMBRE")
End Function
0 голосов
/ 27 декабря 2018

Используйте только:

Month1 = "" & Month(Now)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...