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

Macros et VBA Excel Discussion :

problème : ouverture de fichier excel + countif [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Par défaut problème : ouverture de fichier excel + countif
    Bonsoir,

    J'ai un souci ; je travaille sur excel 2003.

    Je suis dans un fichier excel "macro.xls" où il y a un bouton.
    Ce bouton lance la macro suivante qui fonctionne de façon étrange :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Set oXL = New Excel.Application
    Set oBook = oXL.Workbooks.Open("d:\Documents and Settings\KRIMO\test.xls")    
    Set oSheet = oXL.ActiveWorkbook.Sheets("Table")
    '   Set oSheet = oBook.Worksheets("Table")      
    '    oXL.Visible = False
    '    oSheet.Activate
    '   oSheet.Select
     
        Range("E17") = Application.WorksheetFunction.CountA(oSheet.Range("C:C")) 
        Range("E22") = Application.WorksheetFunction.CountIf(Range("C:C"), "Site")
    La fonction CountA fait le travaille correctement de recherche dans le fichier ouvert "test.xls".
    Par contre la fonction CountIF travaille sur le fichier à partir duquel j'appelle la macro via le bouton macro.xls. ET c'est pas le but

    J'aurai voulu que countIF joue sur le fichier "test.xls" feuille "Table" comme countA !
    D'où provient le problème svp


    J'ai essayé plein de bricolage mais sans succès (mis en commentaires code ci-dessus)


    Merci d'avance et bon week-end

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 317
    Par défaut
    Bonsoir,

    Pourquoi ouvrir une nouvelle instance d'Excel????

    Tu peux ouvrir un autre fichier dans l'instance en cours.

    Il suffit de déterminer à l'avance le fichier en cours, et s'y référencer pour tes calculs.

    Bon courage

  3. #3
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour,

    Citation Envoyé par krimoleroi
    La fonction CountA fait le travaille correctement de recherche dans le fichier ouvert "test.xls".
    Par contre la fonction CountIF travaille sur le fichier à partir duquel j'appelle la macro via le bouton macro.xls. ET c'est pas le but
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("E17") = Application.WorksheetFunction.CountA(oSheet.Range("C:C")) 
        Range("E22") = Application.WorksheetFunction.CountIf(Range("C:C"), "Site")
    Vois les tutos sur le VBA pour comprendre ce qui se passe dans les codes que tu récupères

    Programmer efficacement avec Excel en VBA http://bidou.developpez.com/tutoriels/ExcelVBA/

    CountIf n'a rien à y voir, dans un cas tu invoques l'objet feuille Table via oSheet, dans l'autre tu invoques Range("C:C") direct donc implicitement tu t'adresses à la feuille active de l'instance d'Excel qui porte le code

    Cordialement,

    Ps : si le côté technique de la réponse = OK ou pas => pensez à cliquer sur les pouces et quand question résolue à la taguer résolue, et chaque action vous rapporte des points

    Didier

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Il n'y a rien d'étrange au fonctionnement du code que tu nous présente. Bien évidemment, comme le dit si bien mapeh, il ne te sert à rien de créer une seconde instance d'Excel, une instance pouvant gérer plusieurs classeurs, tu peux l'ouvrir dans la même que le classeur appelant.
    Le compilateur a été conçu pour interpréter les Range comme faisant parti du parent actif où se déroule les macros donc,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("E17") = Application.WorksheetFunction.CountA(oSheet.Range("C:C"))
    Range("E17") est considéré comme faisant parti de la feuille active du classeur où se déroule la macro mais par contre, comme il y a précision sur la feuille où appliquer la fonction CountA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.WorksheetFunction.CountA(oSheet.Range("C:C"))
    le résultat est celui que tu attends.
    Dans le cas de la fonction CountIf, tu ne précise pas que tu souhaite travailler sur la feuille "Table" et donc, logiquement le compilateur en déduit que tu veux travailler sur la colonne "C" de la feuille active du classeur où se déroule cette macro.
    Quand on travaille sur plusieurs classeurs, il est fortement conseillé d'utiliser des variables pour y faire référence ou de préciser de façon explicite sur quel objet ou souhaite travailler :
    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
     
    Dim oBook As Workbook
    Dim ClasseurActif As Workbook
    Dim oSheet As Worksheet
    Dim FeuilleActive As Worksheet
     
    Set oBook = Workbooks.Open("d:\Documents and Settings\KRIMO\test.xls")
    Set ClasseurActif = ThisWorkbook
     
    Set oSheet = oBook.Sheets("Table")
    Set FeuilleActive = ClasseurActif.ActiveSheet
     
    'NOTE : Range("E17") fait référence à la feuille active du classeur où se déroule cette macro
     
    'ici, CountA fait bien référence à la feuille "Table" du classeur "Test"
    Range("E17") = Application.WorksheetFunction.CountA(oSheet.Range("C:C"))
    'il est mieux de faire référence à l'objet parent :
    FeuilleActive.Range("E17") = Application.WorksheetFunction.CountA(oSheet.Range("C:C"))
     
    'mais par contre, ici, CountIf fait référence à la colonne C de la feuille active
    'du classeur où se déroule cette macro, ce comportement est tout à fait normal
    'puisque que c'est de cette façon que le compilateur a été conçu !
    FeuilleActive.Range("E22") = Application.WorksheetFunction.CountIf(Range("C:C"), "Site")
     
    'dans le cas contraire, il te faut aussi faire référence à la feuille "Table" du classeur "Test"
    FeuilleActive.Range("E22") = Application.WorksheetFunction.CountIf(oSheet.Range("C:C"), "Site")
    Hervé.

    Re,

    Désolé Didier, je n'ai pas rafraîchi avant de poster.

    Hervé.

  5. #5
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    @ Hervé.


  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 10
    Par défaut
    Citation Envoyé par Theze Voir le message
    Bonjour,
    ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FeuilleActive.Range("E22") = Application.WorksheetFunction.CountIf(oSheet.Range("C:C"), "Site")
    ...
    Hervé.
    J'avais senti d'où venait le problème mais je ne savais pas comment le résoudre.
    J'avais essayé justement d'écrire ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("E22") = Application.WorksheetFunction.CountIf(oSheet.Range("C:C"), "Site")
    Et ça n'avait rien donné.

    J'ai maintenant recopié ton code et ça marche nickel.
    Maintenant je comprend mieux le concept.

    Merci infiniment pour le temps que tu m'as consacré.
    Et merci également aux autres intervenants.

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

Discussions similaires

  1. [XL-2007] Problème Ouverture de fichier Excel
    Par meumeu73.1 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/09/2012, 11h04
  2. problème d'ouverture de fichier Excel avec Matlab
    Par Lize50 dans le forum MATLAB
    Réponses: 4
    Dernier message: 19/05/2010, 16h18
  3. [XL-2007] problème de recalcul des macro à l'ouverture du fichier excel?
    Par law56100 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 01/09/2009, 13h38
  4. Problème ouverture de fichier excel
    Par label55 dans le forum C#
    Réponses: 2
    Dernier message: 26/03/2009, 14h15
  5. problème d'ouverture du fichier excel
    Par nadiaflamingenierie dans le forum Langage
    Réponses: 1
    Dernier message: 21/04/2008, 19h48

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