Передать массив в функцию макроса из C#

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

Мой код выглядит следующим образом: МАКРОКОД

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 - это массив, который я пытаюсь передать

Может ли кто-нибудь предложить, как передать массив в файл макроса, поскольку от этого зависит моя функциональность?

{"Несоответствие типа. (Исключение из HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))"} получение этой ошибки при вызове макроса

Dhivakhar Venkatachalam 21.11.2018 09:07

принимает ли Run строку в качестве первого аргумента? - просто проверка...

Jazb 21.11.2018 09:10

да, здесь xlApp является объектом excel, и этот код отлично работает с другими типами данных, кроме массива

Dhivakhar Venkatachalam 21.11.2018 09:11

но макрос определил arr как variant - это может быть проблемой ...

Jazb 21.11.2018 09:13

показать код def из CountryArr

Jazb 21.11.2018 09:13

Здесь для Country Array я получаю данные из внешнего кода следующим образом:

Dhivakhar Venkatachalam 21.11.2018 09:18

int SelectedCountryCount = liCountry.Items.Count; строка [] Countryarr = новая строка [SelectedCountryCount]; для (я = 0; я <SelectedCountryCount; я ++) {Countryarr [я] = liCountry.Items [я] .ToString (); }

Dhivakhar Venkatachalam 21.11.2018 09:20

попробуйте объявить массив для передачи как тип object

Jazb 21.11.2018 09:22

Пожалуйста, не помещайте код в комментарий. Переместите его к вопросу.

FunThomas 21.11.2018 09:22

Вы пытались определить подпрограмму VBA с Sub arraydef(arr As Variant)?

FunThomas 21.11.2018 09:26

Привет, объявление Sub arraydef (arr As Variant) вместо Sub arraydef (arr () as Variant) работает, здесь (), похоже, проблема. Проблема с синтаксисом.Спасибо FunThomas, у меня эта проблема возникла долгое время

Dhivakhar Venkatachalam 21.11.2018 10:02

@FunThomas Поскольку это что-то вроде FAQ (и я не нахожу точного дубликата, только stackoverflow.com/questions/38010974/…), может быть хорошей идеей написать это в качестве ответа. Напишите мне, и я помогу проголосовать за, и я надеюсь, что OP отметит его как «правильный» ответ, чтобы у нас был хороший пост, на который можно было бы указать людям ...

Cindy Meister 21.11.2018 11:43

@ Синди Мейстер: Готово.

FunThomas 21.11.2018 15:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
13
432
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По сути, при передаче массива что-то в подпрограмму в 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 может дать вам решение.

Другие вопросы по теме