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

VBScript Discussion :

[VBS-Excel] Ecrire à partir de la dernière ligne


Sujet :

VBScript

  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    893
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 893
    Points : 833
    Points
    833
    Par défaut [VBS-Excel] Ecrire à partir de la dernière ligne
    Bonjour le forum,
    mon script ouvre excel et doit ajouter des informations à partir de la dernière ligne.

    La seconde ligne de code ne fonctionne pas en VBS (mais fonctionne en VBA sans "objExcel."):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    objExcel.cells(2,5).value = "Taille"
    objExcel.Range("A1").End(xlDown).Offset(1,0).Select  
    ...
    Erreur : Erreur d'exécution inconnue"
    code : 800A03EC
    Si la seconde ligne est mise en remarque, le remplissage se fait depuis "A1".


    Avez-vous une proposition de solution ?
    Merci.

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    893
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 893
    Points : 833
    Points
    833
    Par défaut complément
    le fait de changer en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    objExcel.cells(2,5).value = "Taille"
    'objExcel.cells(1,1).End(xlDown).Offset(1,0).Select
    objexcel.cells(1,1).value="eeeeeee"
    le code fonctionne en commençant à la cellule "F19" !

    ESVBA

  3. #3
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Bonsoir,
    on ne voit pas comment tu ouvre ton fichier excel. .. si objExcel est ton objet application, améliore ton code en précisant classeur et feuille ..

    évite d'utiliser select et Activate c'est source de problèmes..., comme il est source de problème en VBA d'utiliser Cells sans préciser classeur et feuille...

  4. #4
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    893
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 893
    Points : 833
    Points
    833
    Par défaut bonsoir et merci bbil,
    bonsoir et merci bbil,

    le but est de récupérer la liste des logiciels installés sur le poste et à mettre les infos dans une feuille excel.

    Voici un peu plus de code :
    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
        '--- Déclaration
        Dim objExcel, objClasseur
        Set objExcel = CreateObject("Excel.Application")
        Set objClasseur = objExcel.Workbooks.Open("RecupInstallation.xlsm")
     
        '--- Création de la feuille si besoin
        Dim strNomFeuille
        strNomFeuille = "Liste logiciels tout poste"
     
        '--- si erreur => n'existe pas
        If objExcel.IsError(objExcel.Evaluate("='" & strNomFeuille & "'!A1")) Then
            objExcel.Sheets.Add ,objExcel.Sheets(objExcel.Sheets.Count) 
            objExcel.ActiveSheet.Name = strNomFeuille
        Else
            '--- Active la feuille
            objExcel.Sheets(strNomFeuille).Activate
        End If
     
        objExcel.cells(1,1).value = "Applications installées"
        objExcel.cells(2,1).value = "Ordinateur"
        objExcel.cells(2,2).value = "Logiciels"
        objExcel.cells(2,3).value = "Date"
        objExcel.cells(2,4).value = "Version"
        objExcel.cells(2,5).value = "Taille"
        '---- Erreur ci-dessous
        objExcel.workbooks("RecupInstallation.xlsm").Sheets(strNomFeuille).Range("A1").End(xlDown).Offset(1,0).Select 
        ''---------------------
     
        ' List All Installed Software
        Const HKLM = &H80000002
        strKey = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"
     
        If GetCompName = vbNullString Then Quit
        If trim(GetCompName) = "" Then StrComputer = "."
     
        Set objReg = GetObject("winmgmts://" & StrComputer & "/root/default:StdRegProv")
     
        objReg.EnumKey HKLM, strKey, arrSubkeys
     
        '--- Recherche
        For Each strSubkey In arrSubkeys
             ...
    Ca ne fonctionne toujours pas en déclarant tout.
    Ce code fonctionne en VBA. Pour le convertir en vbs, j'ai simplement créer l'objet Excel et ajouter sa déclaration aux fontions.

    Y a-t-il d'autres choses à savoir ?

    ESVBA

  5. #5
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Bonjour,
    il te faut déclarer la constante xlDown .., tout en haut du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Option Explicit 
    Const xlDown  = -4121
    j'ai aussi rajouter l'option explicit qui t'aurais permit de détecter l'erreur plus tôt.



    Ce code fonctionne en VBA. Pour le convertir en vbs, j'ai simplement créer l'objet Excel et ajouter sa déclaration aux fontions.
    Peu être cela n'empêche qu'utiliser les variables, collections.. pointant sur le classeur actif, la feuille active , la cellule active ... est source de problème...

    Ainsi lors de l'ouverture du classeur tu affecte celui-ci à une variable, c'était bien parti...
    utilise ensuite cette variable pour accéder à ton classeur par exemple pour la ligne qui te cause problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objClasseur.Sheets(strNomFeuille).Range("A1").End(xlDown).Offset(1,0).Select
    (bon j'ai laissé le select .. qui ne me plait pas trop mais ne connaissant pas la suite de ton code je ne peu le supprimer.)



    Pour accéder à ta feuille plutôt qu'utiliser l'objet cellules du classeur actif.. utilise directement la feuille en rajoutant une référence à celle-ci.. pour le principe :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim objExcel, objClasseur,oshLstLog
      (...)
        If objExcel.IsError(objExcel.Evaluate("='" & strNomFeuille & "'!A1")) Then
           set oshLstLog = objExcel.Sheets.Add (,objExcel.Sheets(objExcel.Sheets.Count) )
            oshLstLog.Name = strNomFeuille
        Else
            '--- Active la feuille 
            set oshLstLog = objExcel.Sheets(strNomFeuille)
        End If
     
        oshLstLog.cells(1,1).value = "Applications installées"
        oshLstLog.cells(2,1).value = "Ordinateur"
    (...)

  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    893
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 893
    Points : 833
    Points
    833
    Par défaut Trouvé
    Il faut vraiment tout déclarer entièrement. Voici la solution fonctionnant pour moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        oshLstLog.Activate  'Nécessaire pour pointer ailleurs que sur la dernière feuille !
        oshLstLog.Range("A1").End(xlDown).Offset(1,0).Select 'Nécessite la ligne précédente
    En effet, sans la première ligne, la seconde ligne pointe uniquement sur la dernière feuille même en la déclarant complétement (Objet.Classeur.feuille.plage) l'instruction.



    Voir le résultat dans les contibutions VBS.

    Merci à vous bbil.


    ESVBA

  7. #7
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Citation Envoyé par ESVBA Voir le message
    ...
    En effet, sans la première ligne, la seconde ligne pointe uniquement sur la dernière feuille même en la déclarant complètement (Objet.Classeur.feuille.plage) l'instruction.

    ...
    tu as essayé d'inverser les lignes 2 et 3 ... ? voir si ce que tu dis la est vrai ?

  8. #8
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    893
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 893
    Points : 833
    Points
    833
    Par défaut Vérification
    Si l'on ne met pas la première ligne (mise en remarque), il y a erreur
    La méthode SELECT de la classe RANGE a échoué
    Alors qu'effectivement, si l'on permute les deux lignes, le code fonctionne.



    POURRAIS-JE CONNAITRE VOTRE PENSEE ?
    C'est un peu trop subtil pour moi. Ca signifie quoi ?




    ESVBA




    ------------------------------------------------------------
    Rq : sur des PC "images", la fonction "FormatDateTime(Now, 0)" ne donne pas la même chose ! Elle oublie parfois les horaires; mais pas la date !

  9. #9
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    cela signifie que l'Activate n'est seulement utile que pour afficher la feuille concernée .. pour modifier celle-ci pas besoin de l'afficher et donc d'utiliser les "select, sélection , Activate ..." et consort...

    comment écrivez vous dans la feuille ?

    vous pouvez le faire ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     oshLstLog.Range("A1").End(xlDown).Offset(1,0) = "Ma nouvelle valeur"

  10. #10
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    893
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 893
    Points : 833
    Points
    833
    Par défaut Euréka
    C'est dur pour moi de faire l'effort de comprendre.

    Effectivement en VBA, "ça va tout seul" (ou presque).



    Au début lors des déclarations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
                 Set oshLstLog = objClasseur.Sheets.Add (,objExcel.Sheets(objExcel.Sheets.Count))
                 oshLstLog.Name = strNomFeuille
     
        End Select
     
        '--- Mise en page
        oshLstLog.cells(1,1).value = "APPLICATIONS INSTALLEES" 'TITRE
        oshLstLog.cells(2,1).value = "Ordinateurs"             ' Entêtes de colonne
        '...
        oshLstLog.Range("A1:F2").Font.Bold = True
        oshLstLog.Activate  'Nécessaire pour pointer ailleurs que sur la dernière feuille !
        oshLstLog.Range("A1").End(xlDown).Offset(1,0).Select 'Nécessite la ligne précédente
    Dans la boucle pour inscrire les données sur la feuille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        objExcel.ActiveCell.Offset(0, 4).Value = intValue3 & "." & IntValue4
        'd'autres écritures
        objExcel.ActiveCell.Offset(0, 5).Value = Round(intValue5 / 1024, 3) & " Mo"
        ' Passe à la ligne du dessous
        objExcel.ActiveCell.Offset(1, 0).Select
    Next
    Et là, maintenant, ça me saute aux yeux.
    J'utilise l'objet Excel "objExcel" et non pas l'objet feuille "oshLstLog".

    Au démarrage, la cellule active n'est pas forcément sur la bonne feuille d'où la nécessité d'activer la feuille désirée.


    Merci bbil.


    ESVBA

  11. #11
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    et donc j'espère que tu as bien modifié ton code pour supprimer ces activate et select ...

    du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    oshLstLog.Range("A1:F2").Font.Bold = True
        ' A EVITER  : oshLstLog.Activate  'Nécessaire pour pointer ailleurs que sur la dernière feuille !
        with oshLstLog.Range("A1").End(xlDown).Offset(1,0)
               .Offset(0, 4).Value = intValue3 & "." & IntValue4
        'd'autres écritures
               .Offset(0, 5).Value = Round(intValue5 / 1024, 3) & " Mo"
        ' Passe à la ligne du dessous
       End with
     
    End with

  12. #12
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    893
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 893
    Points : 833
    Points
    833
    Par défaut Honte à moi. Pas Encore.
    Effectivement avec cette méthode plus besoin de mettre un "feuille.activate"
    que la feuille à remplir soit la dernière ou non du classeur.

    Plus quelques corrections... et c'est bon pour moi.



    Merci à vous bbil.



    ESVBA

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/05/2014, 13h30
  2. Réponses: 5
    Dernier message: 12/02/2014, 10h41
  3. [XL-2000] Copier données à partir de la dernière ligne remplie
    Par chouki60 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/07/2011, 17h45
  4. Réponses: 3
    Dernier message: 07/07/2009, 17h47
  5. Ajouter/supprimer ligne à partir de la dernière ligne d'une plage
    Par jedimaster10 dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 22/02/2008, 15h18

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