2009-09-15 4 views
4

EDIT: Si vous avez un exemple dans VBA, je vais le prendre. J'essaie juste de comprendre comment utiliser l'objet Range avec la collection Tables pour copier et coller plusieurs tables sans boucler. Autrement dit, comment puis-je spécifier une plage de 1..lastTable en utilisant la collection Tables? Si je peux voir un exemple fonctionnel de VBA, je vais travailler sur la conversion VBA -> Perl. J'essaie d'utiliser le module Win32::OLE de Perl (via l'excellent livre de Dave Roth) pour automatiser quelques tâches que j'ai besoin d'effectuer à plusieurs reprises sur certains documents Word. Cependant, le livre (et la plupart des exemples Web) a tendance à utiliser Excel comme exemple, donc je ne suis pas sûr de savoir comment copier et coller efficacement avec l'objet de collection Tables.Comment puis-je copier et coller une série de tables dans Word?

Voici un extrait de mon code:

my $originalDoc = $MSWord->Documents->Open('C:\Perl\testDocument.doc'); 
my $newDoc = $MSWord->Documents->Add; 
my $selection = $MSWord->Selection(); # this may be spurious 

my $Count = int($originalDoc->Tables()->{Count}); 
my $range = $originalDoc->Tables()->Range({ Start => $originalDoc->Tables(1)->{Range}->{Start}, 
              End => $originalDoc->Tables($Count)->{Range}->{End} 
              }); 
$range->Copy(); 
$newDoc->Range()->Paste(); 

Le code original utilisé paragraphes, pas de tableaux, donc je suppose quelques-uns des insectes sont des artefacts de ce code (ou plus probablement ma non-compréhension de ce code).

+0

Ma suggestion est d'essayer d'effectuer la tâche manuellement pendant l'enregistrement d'une macro, puis regardez le sous-programme VBA produit. Vous devriez être capable de généraliser cela et de le transposer en Perlish sans trop de problèmes. –

+0

L'utilisation de cette méthode me montre comment utiliser Selection pour obtenir une table, alors que si j'essaie de sélectionner plusieurs tables, la macro est écrite pour saisir le texte entre elles, ce qui n'est pas ce que je recherche. – romandas

Répondre

5

Copier et coller des tables une à la fois pourrait préférable:

#!/usr/bin/perl 

use strict; 
use warnings; 

use File::Spec::Functions qw(catfile); 

use Win32::OLE; 
use Win32::OLE::Const 'Microsoft Word'; 
$Win32::OLE::Warn = 3; 

my $word = get_word(); 
$word->{Visible} = 1; 

my $doc = $word->{Documents}->Open(catfile $ENV{TEMP}, 'test.doc'); 
my $newdoc = $word->Documents->Add; 

my $n_tables = $doc->Tables->Count; 

for my $table_i (1 .. $n_tables) { 

    my $table = $doc->Tables->Item($table_i); 
    $table->Select; 
    $word->Selection->Copy; 

    my $end = $newdoc->GoTo(wdGoToLine, wdGoToLast); 
    $end->InsertBefore("\n"); 
    $end = $newdoc->GoTo(wdGoToLine, wdGoToLast); 
    $end->Select; 

    $word->Selection->Paste; 
} 

$doc->Close(0); 
$newdoc->SaveAs('test-output.doc'); 

sub get_word { 
    my $word; 
    eval { 
     $word = Win32::OLE->GetActiveObject('Word.Application'); 
    }; 

    die "[email protected]\n" if [email protected]; 

    unless(defined $word) { 
     $word = Win32::OLE->new('Word.Application', sub { $_[0]->Quit }) 
      or die "Oops, cannot start Word: ", 
        Win32::OLE->LastError, "\n"; 
    } 
    return $word; 
} 
+0

Super! Une question cependant .. est-il impossible de sélectionner une gamme d'objets à partir d'un objet de collection? Dites, tous les objets de la table, sans autre texte en une seule opération? Je demande simplement si cela est possible - j'ai l'impression que ce n'est pas le cas, ou du moins cela ne fonctionne pas comme je le pense. – romandas

+0

@romandas Je ne pense pas. La collection 'Tables' n'a pas de méthode' Range'. –

+0

Merci! +1 et accepté – romandas

Questions connexes