Trying to open and write data into two different excel files from separate perl scripts but simultaneously.
It doesn't throw any error if run one after other. But while running simultaneously it one of the script terminates with following error.
entering
No Error
excel new created!
Win32::OLE(0.1709) error
0x8001010a: "The message filter indicated that the application is
busy"
in METHOD/PROPERTYGET "Workbooks" at TwoExcelFiles.pl line 29. came out. sleeping 20 C:\Users\s.mailappan\Desktop\Test>
Perl script-1:
# ================
# Modules Required
# ================
use Win32::OLE qw(in with); # OLE Automation extensions
use Win32::OLE::Const 'Microsoft Excel'; # Extract constant definitions from TypeLib
use Cwd; # Get pathname of current working directory
use File::Copy; # Copy files or filehandles
$Win32::OLE::Warn = 3;
# Open Excel application
# my $Excel2 = Win32::OLE->GetActiveObject('Excel.Application')
# || Win32::OLE->new( 'Excel.Application', 'Quit' );
# use existing instance if Excel is already running
printf "\nentering";
eval {$Excel2 = Win32::OLE->GetActiveObject('Excel.Application');printf "\nNo Error";};
die "Excel not installed" if $@;
printf "\nexcel new created!";
unless (defined $Excel2) {
printf "\ncreating new excel on file-2";
$Excel2 = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;})
or die "Oops, cannot start Excel";
}
printf "\ncame out. sleeping 20";
# Open workbook
# my $Book1 = $Excel2->Workbooks->Open("C:\\Users\\s.mailappan\\Desktop\\Test\\CoreNetwork_Master_Excel_WSS_Oma.xlsx");
my $Book2 = $Excel2->Workbooks->Open("C:\\Users\\s.mailappan\\Desktop\\Test\\CoreNetwork_Master_Excel_WSS_Che.xlsx");
# $Book1->Save;
# $Book1->Close();
$Book2->Save;
$Book2->Close();
sleep(20);
printf "\nsleep done";
$Excel2->Quit();
Perl script-2:
# ================
# Modules Required
# ================
use Win32::OLE qw(in with); # OLE Automation extensions
use Win32::OLE::Const 'Microsoft Excel'; # Extract constant definitions from TypeLib
use Cwd; # Get pathname of current working directory
use File::Copy; # Copy files or filehandles
$Win32::OLE::Warn = 3;
# Open Excel application
# my $Excel1 = Win32::OLE->GetActiveObject('Excel.Application')
# || Win32::OLE->new( 'Excel.Application', 'Quit' );
# use existing instance if Excel is already running
printf "\nentering";
eval {$Excel1 = Win32::OLE->GetActiveObject('Excel.Application');printf "\nNo Error";};
die "Excel not installed" if $@;
printf "\nexcel new created!";
unless (defined $Excel1) {
printf "\ncreating new excel on file-2";
$Excel1 = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;})
or die "Oops, cannot start Excel";
}
printf "\ncame out. sleeping 20";
# Open workbook
my $Book1 = $Excel1->Workbooks->Open("C:\\Users\\s.mailappan\\Desktop\\Test\\CoreNetwork_Master_Excel_WSS_Oma.xlsx");
# my $Book2 = $Excel1->Workbooks->Open("C:\\Users\\s.mailappan\\Desktop\\Test\\CoreNetwork_Master_Excel_WSS_Che.xlsx");
$Book1->Save;
$Book1->Close();
# $Book2->Save;
# $Book2->Close();
sleep(20);
printf "\nsleep done";
$Excel1->Quit();
As hinted by stenci - instead of using Win32::OLE->GetActiveObject, using Win32::OLE->new works as defined below.
unless (defined $Excel1_Parse4G) {
$Excel1_Parse4G = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;})
or die "Oops, cannot start Excel";
}
my $Book1 = $Excel1_Parse4G->Workbooks->Open("C:\\path\file1.xls");
unless (defined $Excel2_Parse4G) {
$Excel2_Parse4G = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;})
or die "Oops, cannot start Excel";
}
my $Book2 = $Excel2_Parse4G->Workbooks->Open("C:\\path\file2.xls");
User contributions licensed under CC BY-SA 3.0