powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Передача параметра при вызове макроса Excel из Delphi
5 сообщений из 5, страница 1 из 1
Передача параметра при вызове макроса Excel из Delphi
    #33469787
Robertino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С Рождеством, уважаемые господа!
Вот пример вызова из Delphi6 макроса VBA Excel :

//******************
Wksheet: TExcelWorksheet;
Wkbook: TExcelWorkbook;
XlApp: TExcelApplication;
.......
Var
SomeStr : String;

procedure MyProc;
Var
NewValue : String;
begin
SomeStr := 'Hello!';
XlApp.Run('VBA_Sub',SomeStr);
NewValue := SomeStr;
end;
//***********************


Имеется макрос VBA_Sub, откуда надо вернуть в MyProc значение SomeStr = 'By!'

'**************************
Sub VBA_Sub(ByRef Vba_Param)
NewStr = Vba_Param

' ............. Здесь NewStr = "Hello!" (!!!)
Vba_Param = "By!"
End Sub
'***************************


Параметр передается по ссылке, но только в одну сторону. Почему SomeStr возвращается равным 'Hello!' вместо ожидаемого 'By!'?!

Вызываю тот же VBA_Sub из макроса Makros1:

'***********************
Sub Makros1()
Dim ActualParam as String
ActualParam = "Hello!"
Call VBA_Sub(ActualParam)
NewStr = ActualParam
' ........NewStr действительно равна "By!".
End Sub
************************

Что здесь неправильно? Как вернуть новое значение параметра?

Спасибо за внимание.
...
Рейтинг: 0 / 0
Передача параметра при вызове макроса Excel из Delphi
    #33469882
sergeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы, батенька, немного покривили душой, надо бы написать в Excel так и тогда получается аналогичный результат
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Sub Makros1()
Dim ActualParam As String
ActualParam = "Hello!"
'Call VBA_Sub(ActualParam)
x = Application.Run("VBA_Sub", ActualParam)
NewStr = ActualParam
' ........NewStr действительно не равна "By!".
End Sub

Может такой вариант подойдет
в Delphi
Код: plaintext
NewValue := XlApp.Run('VBA_Sub',SomeStr);
в Excel
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Function VBA_Sub(ByRef Vba_Param) As String
NewStr = Vba_Param
' ............. Здесь NewStr = "Hello!" (!!!)
VBA_Sub = "By!"
End Function

Sub Makros1()
Dim ActualParam As String
ActualParam = "Hello!"
'Call VBA_Sub(ActualParam)
NewStr = Application.Run("VBA_Sub", ActualParam)
' ........NewStr действительно равна "By!".
End Sub
...
Рейтинг: 0 / 0
Передача параметра при вызове макроса Excel из Delphi
    #33470561
Robertino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sergeyvqВы, батенька, немного покривили душой, надо бы написать в Excel так и тогда получается аналогичный результат

Function VBA_Sub(ByRef Vba_Param) As String
NewStr = Vba_Param
' ............. Здесь NewStr = "Hello!" (!!!)
VBA_Sub = "By!"
End Function

Как говаривал Ги де Мопассан - "Да здравствует маленькая разница!"
В Вашем варианте, уважаемый Sergeyvq, новое значение возвращает функция , но мне хотелось изменить и вернуть "By!" вместо "Hello!" для формального параметра VBA_Param .

Или я неверно понял описание ByRef?!
VBA Help
Sub Statement
..............
ByRef ---- Optional. Indicates that the argument is passed by reference . ByRef is the default in Visual Basic.
..............
by reference

A way of passing the address of an argument to a procedure instead of passing the value. This allows the procedure to access the actual variable. As a result, the variable's actual value can be changed by the procedure (выделение цветом - мое) to which it is passed. Unless otherwise specified, arguments are passed by reference.

Разумеется, можно построить и так, чтобы после анализа формального параметра внутри функции VBA в Delphi сама функция вернула нужное значение. Но я не о том спрашивал, согласитесь?
...
Рейтинг: 0 / 0
Передача параметра при вызове макроса Excel из Delphi
    #33470585
Robertino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sergeyvq
Может такой вариант подойдет
в Delphi
NewValue := XlApp.Run('VBA_Sub',SomeStr);


Прошу простить, уважаемый sergeyvq, мою невнимательность. В самом деле, именно так и работает, через вызов функции с присвоением.

Что сказать? Я был не прав.
Вопрос снят.

Благодарю Вас за помощь. Всего Вам самого светлого!
...
Рейтинг: 0 / 0
Передача параметра при вызове макроса Excel из Delphi
    #33470728
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Robertino, возвращать значение можно конечно и через функцию и это даже более удобно. Но и через параметры можно без проблем :)
Замени в исходном Дельфийском примере SomeStr: String; на SomeStr: TOleVariant; и все должно заработать.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Передача параметра при вызове макроса Excel из Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]