Добавьте все каталоги cwd в массив, итерируйте каталог по каталогу и сохраните в нем только файлы .xlsm (Windows 10) - PullRequest
1 голос
/ 14 апреля 2020

Цель: Добавить все каталоги в массив, перебрать каталог по каталогу и открыть и сохранить только файлы .xlsm. (когда они открываются, макрос vba выполняется автоматически)

Ошибка: Неисследованное исключение из кода пользователя: Открытие каталога Z: / Folder1 / Projects / Templates / Abschlussbesuch ошибка: неверный аргумент в строке stammdaten.pl 26 .

Каталоги:

enter image description here

stammdaten.cmd:

@echo off

perl -w stammdaten.pl

pause

Код:

# ------ Module ------ #
use strict;
use warnings;
use diagnostics;
use Cwd;
use OLE;
use Win32::OLE::Const "Microsoft Excel";
use Unicode::UTF8;
#----------------------#

# ------ HAUPTPROGRAMM ------ #
my $excel = CreateObject OLE "Excel.Application";
$excel->{Visible} = 0;
$excel->{DisplayAlerts} = 0;
$excel->{AskToUpdateLinks} = 0;

opendir(OD, cwd) or die "Kann Arbeitsverzeichnis nicht öffnen! $!";

my @verzeichnisse = grep { -d } glob cwd . "/*"; 

closedir OD;

foreach my $v(@verzeichnisse)
{
    my $dir = cwd . "/$v";
    opendir(my $verz, $dir) or die "Opening of directory $v failed: $!"; # LINE 26
    foreach my $xlsm (<*.xlsm>)
    {               
        open(FH, $xlsm) or die "Die Excel-Mappe $xlsm konnte nicht geoeffnet werden: $!";
            my $mappe = $excel->Workbooks->Open($xlsm);
            $mappe->Save;
            $mappe->Close;
            $excel->Quit;
        close FH;
    }
    closedir($verz);
}
#-----------------------------#

# ------ ENDE ------ #
exit 0;

1 Ответ

1 голос
/ 14 апреля 2020

Пожалуйста, попробуйте следующий код (он должен дать тот же результат)

# ------ Module ------ #
use strict;
use warnings;
use diagnostics;
use Cwd;
use OLE;
use Win32::OLE::Const "Microsoft Excel";
use Unicode::UTF8;
#----------------------#

# ------ HAUPTPROGRAMM ------ #
my $excel = CreateObject OLE "Excel.Application";
$excel->{Visible} = 0;
$excel->{DisplayAlerts} = 0;
$excel->{AskToUpdateLinks} = 0;

my $path = cwd;

foreach my $xlsm (glob('*/*.xlsm'))
{               
    $xlsm = $path . $xlsm;
    open(FH, $xlsm) or die "Die Excel-Mappe $xlsm konnte nicht geoeffnet werden: $!";
    my $mappe = $excel->Workbooks->Open($xlsm);
    $mappe->Save;
    $mappe->Close;
    $excel->Quit;
    close FH;
}
#-----------------------------#

# ------ ENDE ------ #
exit 0;

Совет: modern perl стр. 139 - рекомендует использовать следующую форму открытия

open my $fh, '<', $filename
     or die "Couldn't open $filename";

....
....

close $fh;
...