Использование Win32 :: OLE для выполнения макроса в Access 2007 - PullRequest
0 голосов
/ 22 августа 2009

В настоящее время я пытаюсь выполнить макрос в Microsoft Access через Perl OLE

Мне интересно, как правильно сделать вызов для запуска макроса. Я пытался

1) $oDatabase -> DoCmd.RunMacro("Macro1");
2) $oDatabase -> DoCmd -> RunMacro("Macro1");

Но меня бросают "Не могу вызвать метод" DoCmd "для неопределенного значения" или "Бесполезное использование конкатенации"

Возможно ли вообще выполнить DoCmd через Win :: 32 OLE? Любая помощь будет принята с благодарностью.

Вот полный код. Он пытается найти текущий Microsoft Access, который открыт.

use strict; 
use warnings; 
use Win32::OLE;

my $oAccess;
my $oDatabase;

my $filename = "C:\\Sample.accdb"; 
$oAccess = Win32::OLE->GetActiveObject('Access.Application');

$oDatabase = $oAccess->OpenCurrentDatabase($filename);
$oDatabase -> DoCmd.RunMacro("Macro1");

Ответы [ 2 ]

1 голос
/ 24 августа 2009

Согласно довольно запутанной документации Microsoft , DoCmd является свойством объекта Application, а RunMacro является метод из DoCmd. В Win32 :: OLE методы используют синтаксис метода, а свойства используют синтаксис хеша. (Точка '.' Является синтаксисом Visual Basic. В Perl 5 используйте '->').

Итак, две последние строки вашего кода должны быть (я думаю):

$oAccess->OpenCurrentDatabase($filename);
$oAccess->{DoCmd}->RunMacro("Macro1");

У меня нет Access 2007, поэтому я не могу проверить это.

Обратите внимание, что OpenCurrentDatabase ничего не возвращает, поэтому вы получаете сообщение "Не удается вызвать метод" DoCmd "для неопределенного значения", когда вы пытаетесь вызвать методы в $ oDatabase (который является UNDEF).

Ссылки на документацию Microsoft работали 23 августа 2009 г., но Microsoft никогда не читала Классные URI не меняются , поэтому ваш пробег может отличаться.

0 голосов
/ 22 августа 2009

Как сказал HansUp, вы должны использовать переменную экземпляра приложения Access для использования DoCmd.
В вашем случае это будет переводить

$oAccess->DoCmd.RunMacro("macro1");

Примечание: я не знаю Perl:)

...