IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Scanner une colonne d'une feuille Excel


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 53
    Points : 35
    Points
    35
    Par défaut Scanner une colonne d'une feuille Excel
    Bonjour,
    j'aimerais scanner une colonne d'une feuille Excel à la recherche de certaines valeurs et utiliser le résultat pour remplir une autre colonne.
    En effet la feuille contient des données qui vont être à chaque fois complétées.

    Le scénario:

    A chaque nouvelle valeur d'une variable $variable, scanner la colonne "A" à la recherche de cette dernière. Si elle y figure alors inscrire $variable dans la colonne "J" (ou autre d'ailleurs, mais attention, à la même ligne que celle trouvée en "A") sinon insérer une nouvelle ligne en fin de tableau pour l'y inscrire.

    Quelqu'un a-t-il une idée?

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Je ne connais malheureusement pas de module permettant d'éditer un fichier Excel existant. J'en connais qui savent les lire seulement (read-only), ou les écrire seulement (write-only), mais pas qui savent les lire et les modifier (read-write).

    Si tu trouves une solution je suis aussi intéressé par la réponse.
    Avec les modules que je connais, je ne vois que la solution de copier intégralement la feuille initiale dans une nouvelle feuille en y ajoutant le traitement souhaité.

    Les modules : Excel::Writer::XLSX, Spreadsheet::XLSX ou Spreadsheet::ParseExcel .
    Mais attention, les objets de ParseExcel ne sont pas utilisables pour Excel::Writer.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 53
    Points : 35
    Points
    35
    Par défaut
    entre temps j'ai réussi à faire une petite routine me permettant de scanner ma colonne, ce qui est bien réalisé (voir le code)!
    Par contre, au moment de l'écriture, même si les ligne sont respectées, il chope uniquement le dernier signal de chaque trame. Bon je n'arrive pas à voir l'erreur dans ma boucle, mon code étant un peu...touffu

    Pour tester ma routine le fichier excel ci-joint est nécessaire!
    Le script dans son ensemble produit le résultat du second bloc (excel). Seul le dernier signal de la trame est chopé!!

    Je ne sais pas si je dois joindre aussi le script en entier et les différents docs utilisés mais bon...


    Ma routine pour scanner la colonne B:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    use OLE;
    use Win32::OLE::Const 'Microsoft excel';
    use Cwd;
     
     
    my $directory = &getcwd;
    my $xlsfile = "$directory/Test_Auswertung_RX.xlsx";
     
    #--Signaux à retrouver dans la colonne B---
    my @array = ( 
    	'TEMP_SCRA', 'ST_RMMI_SCRA', 'ST_RFG_SCRA', 'ST_FLLV_PU_SCRA', 'ST_FLLV_LEV_SCRA', 
    	'RFLV_SCRA', 'RELA_MIX_SCRA', 'FLLV_SCRA', 'DISP_RQ_GR_GRB', 'DISP_PRG_GRB', 'DISP_PO_GRB', 
    	'DISP_GR_GRB', 'ST_SYS_ERR_OBD_SCR', 'ST_ILK_SCRS', 'RQ_MIL_DIAG_OBD_SCR', 'AVL_PWR_EL_GEY', 
    	'ST_DIAG_OBD_6_PT_MAX_MUX', 'ST_DIAG_OBD_6_PT_IMME_MUX', 'DIAG_ST_OBD_6_PT_8', 'DIAG_ST_OBD_6_PT_7',
    	'DIAG_ST_OBD_6_PT_6', 'DIAG_ST_OBD_6_PT_5', 'DIAG_ST_OBD_6_PT_4', 'DIAG_ST_OBD_6_PT_3', 'DIAG_ST_OBD_6_PT_2', 
    	'DIAG_ST_OBD_6_PT_1', 'FLLUPT_GPWSUP', 'ST_GR_BAC', 'DSTN_SLRDI_GLB', 'CTR_SNW', 'CTR_SLRDI_GLB', 
    	'CTR_SLP_BUS', 'CTR_FSL', 'ST_ILK_ERRM_FZM', 'ST_ENERG_FZM', 'QC_VEH, I_SC_MIN_VEH', 'I_SC_MAX_VEH', 
    	'CLAS_BT', 'TYP_VEH', 'TYP_BODY', 'CLAS_PWR', 'NO_VECH_7', 'NO_VECH_6, NO_VECH_5', 'NO_VECH_4',
    	'NO_VECH_3, NO_VECH_2', 'NO_VECH_1', 'RQ_PAIC', 'ST_FLLV_FUTA_SPAR', 'RNG', 'MILE_KM', 'FLLV_FUTA_RH', 
    	'FLLV_FUTA_LH', 'FLLV_FUTA', 'T_SEC_COU_REL', 'T_DAY_COU_ABSL', 'STEA_FTAX_EFFV', 'QU_STEA_FTAX_EFFV', 'ST_CT_BTL', 
    	'ST_CT_BON', 'ST_PHTR_ENGSTA_DRV', 'RQ_HTFL_AIC', 'DISP_ECO_CON_HTCL_COOD', 'DISP_ECO_CON_2_HTCL_COOD', 'CTR_RDI_AIC', 
    	'AVL_TORQ_ACCM', 'AVL_SETQ_EFAN_AIC', 'AVL_RQMT_HTFL', 'ST_TAV_PFUTA_2', 'ST_SEN_FUFF_PFUTA_2', 'ST_PURG_RDI', 
    	'ST_PLCHK_P_PFUTA_2', 'ST_PLCHK_PFUTA_TAV_2', 'ST_PLCHK_PFUTA_AIV_2', 'ST_PFUTA_TEMP_2', 'ST_PFUTA_P_2', 'ST_PFUTA_EX_P_2', 
    	'ST_MOD_FULG_PFUTA_2', 'ST_FULG_RQ_PUBU', 'ST_AIV_PFUTA_2', 'ST_ACTR_LOKG_FUFF_PFUTA_2', 'ST_TRAI', 'ST_VEHSS_PBRK', 
    	'TEMP_EX_UNFILT', 'TEMP_EX', 'ST_BLTB_SW_DR', 'TAR_PO_GRB', 'SPEC_TAR_GR_GRB_2', 'ST_PENG_GRB', 'ESTI_WMOM_CRP_IDLG', 
    	'AVL_WMOM_CRP_IDLG', 'CTR_CR_SWO_EKP', 'AVL_OPMO_CHGE'
    );
     
    #-- Fin Signaux à retrouver dans la colonne B---
     
    #---Main----------
    open_excel();
     
    #---Fin Main-------
     
     
    # ###################################################################
    #  Sub Open excel File
    # ###################################################################
     
     
    sub open_excel 
    { #Open Sub 
    	print "Processing excel File:$xlsfile\n\n";
    	$excel = Win32::OLE->GetActiveObject('excel.Application')|| Win32::OLE->new('excel.Application');
     
    		my $workbook = $excel -> Workbooks  -> Open ($xlsfile) or die ( "Can't open $xlsfile" );    
     
    		$excel->{'Visible'} = 0;        #0 is hidden, 1 is visible
    		$excel->{DisplayAlerts}=0;        #0 is hide alerts 
     
     
    		$sheet = $workbook -> Worksheets (1);
     
    		$excel->{'Visible'} = 0;        #0 is hidden, 1 is visible
    		$excel->{DisplayAlerts}=0;        #0 is hide alerts 
    		$sheet = $workbook -> Worksheets (1);
     
    		# Find Last Row	   
    		$LastRow = $sheet -> UsedRange -> Find({What => "*",
    					SearchDirection => xlPrevious,
    					SearchOrder => xlByRows}) -> {Row};	
     
    		foreach (@array)
    		{
    			$Signal = $_;
    			Search_Signal($Signal);
    		}   
     
    }
     
     
    $excel->{'Visible'} = 1;
    undef $workbook;
    undef $excel;
     
     
     
     
    sub Search_Signal
    {        
    	my ($In_file)= @_;
        for $row(16..$LastRow)
    	{	$col=2;     
     
           my $name = $sheet -> Cells($row,$col) -> {'Value'}; 
    		if ($name eq $In_file)
    		{
    			print "Signal $In_file found on line $row\n";
    			$row++;
    		}
     
    	}
    }
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Les solutions à base d'OLE ne fonctionnent que sur Windows, n'est-ce pas ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 53
    Points : 35
    Points
    35
    Par défaut
    hmm un peu difficile pour moi de savoir car je n'ai jamais travaillé sous Mc ou Linux!!

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Les solutions à base d'OLE ne fonctionnent que sur Windows, n'est-ce pas ?
    Je pense (mais n'en suis pas du tout sûr) que oui et qu'il faut de plus que la suite MS-Office soit installée sur le PC. Encore que, si MS-Office est installée sur un Mac, ça marche peut-être.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  2. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  3. [E-00] Syntaxe pour insérer une ligne ou une colonne dans une feuille
    Par Benjycool dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/02/2009, 09h27
  4. Réponses: 4
    Dernier message: 31/10/2007, 20h27
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo