Как передать 2D-массив процедуре и изменить ее внутри функции? VBA

David Alberici спросил: 13 июня 2018 в 02:47 в: arrays

с помощью VBA для создания макроса Word У меня есть следующая проблема:

Я пытаюсь заполнить массив 2d, используя функцию. Проблема в том, что когда я пытаюсь передать 2D-массив функции, я получаю следующую ошибку:

тип несоответствия или ожидаемый тип пользователя

Мой макрос:

Sub Tests()
'
' Tests Macro
'
Dim paragraphs(21, 1) As String
populate_paragraph (paragraphs)
End Sub

, который вызывает процедуру:

Sub populate_paragraph(replacers() As String)ReDim replacers(21, 1) As Stringreplacers(0, 0) = "%HEADER%"
replacers(1, 0) = "%DESIGN_BRIEF_PARAGRAPH%"
...
replacers(21, 0) = "%DISCLAIMER_PARAGRAPH%"replacers(0, 1) = create_header
replacers(1, 1) = create_design_brief_paragraph
...
replacers(21, 1) = create_disclaimer_paragraphEnd Sub

Если вместо передачи 2D-массива в процедуру, я пытаюсь чтобы инициализировать его с возвращаемым значением функции, я получаю следующую ошибку:

Невозможно назначить массив

Код в этом случае :

Sub Tests()
'
' Tests Macro
'
Dim paragraphs(21, 1) As String
paragraphs = populate_paragraph
End Sub

, которые вызывают функцию:

Function populate_paragraph() As StringDim replacers(21, 1) As Stringreplacers(0, 0) = "%HEADER%"
replacers(1, 0) = "%DESIGN_BRIEF_PARAGRAPH%"
...
replacers(21, 0) = "%DISCLAIMER_PARAGRAPH%"replacers(0, 1) = create_header
replacers(1, 1) = create_design_brief_paragraph
...
replacers(21, 1) = create_disclaimer_paragraphpopulate_paragraph = replacersEnd Function

Спасибо, что прочитали мой вопрос и за вашу помощь


1 ответ

Есть решение
Cindy Meister ответил: 13 июня 2018 в 07:00

Это сложно ...

Вам нужно передать массив ByRef, поскольку вы меняете его в процедуре, которую вы вызываете, и это не функция, так что вы может передать его обратно. В этом конкретном случае VBA настаивает на передаче значения ByRef.

Связанный с этим факт заключается в том, что вы помещаете параметр, который вы передаете в круглые скобки: (paragraphs()) , Поскольку параметр передается в "метод", а не в функцию, вы не должны использовать круглые скобки. Если вы это сделаете, вы сообщаете VBA, что хотите передать параметр ByVal.

Следующие действия:

Sub Tests()
  Dim paragraphs(21, 1) As String  populate_paragraph paragraphs()
End SubSub populate_paragraph(ByRef replacers() As String)  ReDim replacers(21, 1) As String
 'etc.End Sub
Cindy Meister ответил: 13 июня 2018 в 04:29
@TinMan Да, я протестировал его. В скобках я получил сообщение об ошибке, сообщающее мне, что необходимо передать параметр ByRef, даже если ByRef явно указан в сигнатуре метода процедуры. Скобки скопировали массив ByVal. Нет скобок, нет сообщения об ошибке.
TinMan ответил: 13 июня 2018 в 06:09
Извините, я спешил, и я неправильно понял ваш пост. Я думал, что вы говорили об этом populate_paragraph paragraphs) (). Вы публикуете довольно ясно, что вы имеете в виду это populate_paragraph (paragraphs). Что меня действительно смутило, так это то, что я объявляю переменные массива со скобкой, которая меняет ошибку на Type Mismatch: array or user defined type expected Хорошо объяснил. +1
Cindy Meister ответил: 13 июня 2018 в 07:02
@TinMan Нет проблем :-) Бывает со мной регулярно! Спасибо, что объяснили, что вас смутило - я отредактировал и надеюсь, что это яснее с изменениями! Существуют различные способы передачи массива - например, Variant.
David Alberici ответил: 15 июня 2018 в 06:57
Зная, что о круглых скобках уже помогает мне предотвратить другие проблемы. Извините за то, что мы не отметили вопрос, как было решено раньше, только сейчас у меня есть свободное время, и я не ожидал ответов так быстро. Большое спасибо за Вашу помощь

Дополнительное видео по вопросу: Как передать 2D-массив процедуре и изменить ее внутри функции? VBA

VBA Урок_6 | Массив и цикл FOR | Программирование для начинающих Просто и Доступно | Язык VBA

Как изменить размер многомерного массива с помощью ReDim VBA.

Excel VBA - 2D Array Static