Я пытаюсь передать переменную массива в качестве параметра функции макроса, но получаю несоответствие ошибки при вызове этого файла макроса,
Мой код выглядит следующим образом: МАКРОКОД
Sub arraydef(arr() As Variant)
MsgBox (arr(0))
End Sub
Код C# для вызова функции макроса путем передачи массива:
Excel.Application xlApp = new Excel.Application();
Excel.Workbook xlWorkBook;
xlWorkBook = xlApp.Workbooks.Open(Server.MapPath("\\MacroFile\\MYTEFINAL1.xlsm"));
xlApp.Visible = false;
xlApp.Run("arraydef", Countryarr);
Где Countryarr - это массив, который я пытаюсь передать
Может ли кто-нибудь предложить, как передать массив в файл макроса, поскольку от этого зависит моя функциональность?
принимает ли Run строку в качестве первого аргумента? - просто проверка...
да, здесь xlApp является объектом excel, и этот код отлично работает с другими типами данных, кроме массива
но макрос определил arr как variant - это может быть проблемой ...
показать код def из CountryArr
Здесь для Country Array я получаю данные из внешнего кода следующим образом:
int SelectedCountryCount = liCountry.Items.Count; строка [] Countryarr = новая строка [SelectedCountryCount]; для (я = 0; я <SelectedCountryCount; я ++) {Countryarr [я] = liCountry.Items [я] .ToString (); }
попробуйте объявить массив для передачи как тип object
Пожалуйста, не помещайте код в комментарий. Переместите его к вопросу.
Вы пытались определить подпрограмму VBA с Sub arraydef(arr As Variant)?
Привет, объявление Sub arraydef (arr As Variant) вместо Sub arraydef (arr () as Variant) работает, здесь (), похоже, проблема. Проблема с синтаксисом.Спасибо FunThomas, у меня эта проблема возникла долгое время
@FunThomas Поскольку это что-то вроде FAQ (и я не нахожу точного дубликата, только stackoverflow.com/questions/38010974/…), может быть хорошей идеей написать это в качестве ответа. Напишите мне, и я помогу проголосовать за, и я надеюсь, что OP отметит его как «правильный» ответ, чтобы у нас был хороший пост, на который можно было бы указать людям ...
@ Синди Мейстер: Готово.





По сути, при передаче массива что-то в подпрограмму в VBA самое простое решение - объявить параметр как Variant.
Объявление параметра как массива означает, что вызывающая процедура должна передавать именно этот тип массива. Если объявлена подпрограмма для получения массива Long, вы должны передать массив Long. Ни Integer, ни Variant. То же самое верно, если подпрограмма объявлена для получения массива Variant - вы должны передать массив Variant.
Теперь Variant - это своего рода волшебный тип данных. Вариантом может быть что-либо - даже массив. Когда вы объявляете параметр как Variant и передаете Long (или String, или ...), VBA Runtime Engine заботится о создании Variant, сохраняет содержимое Long (или String или ...) и следит за тем, что он в настоящее время хранит.
Если вы передаете массив в этот вариант, VBA сохраняет этот массив в Variant (вероятно, только ссылку) и отслеживает не только тот факт, что он содержит массив, но также и тип массива.
Однако, если вы объявите параметр как массив Variant, среда выполнения не сможет творить чудеса. Вы говорите среде выполнения, что получите связку Variants, но затем передадите связку Integer. Среда выполнения должна преобразовать каждый отдельный элемент массива из Integer в Variant - а она этого просто не делает. Вместо этого компилятор VBA жалуется или при вызове через Application.Run выдает ошибку времени выполнения "Несоответствие типов".
Есть несколько функций, которые могут помочь вам получить информацию о том, что (в настоящее время) хранится в варианте: IsArray сообщает вам, содержит ли Variant ошибку, а VarType предоставит вам информацию о типе (для получения дополнительной информации о VarType см. https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/vartype-function) . LBound и Ubound дадут вам размер массива. Единственное, что вы не можете получить, - это информацию о размерах массива. В редких случаях, когда вы не знаете количество измерений, https://stackoverflow.com/a/6902088/7599798 может дать вам решение.
{"Несоответствие типа. (Исключение из HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))"} получение этой ошибки при вызове макроса