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 :

Savoir si classeur ouvert avant de demander à l'ouvrir ?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 16
    Par défaut Savoir si classeur ouvert avant de demander à l'ouvrir ?
    Bonjour,

    Je crée une macro pour copier des feuilles d'un classeur1 vers un classeur2.

    Pour cela je demande à ouvrir mon classeur1 : Pas de problème s'il était fermé. Mais s'il était déjà ouvert j'ai le message d'alerte suivant. "Classeur1 est déjà ouvert. si vous l'ouvrez à nouveau, toutes vos modifications seront perdues..."

    Donc je cherche à créer une petite macro qui ne fasse rien si le classeur est ouvert, et qui l'ouvre sinon. J'ai essayé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub testOuvertureFichier()
     If IsOpen.Workbooks("DevisFactures.xls") Then
     MsgBox ("ça fonctionne !")
     Else: Workbooks.Open Filename:="E:\DUT GEA\3ème année\Stage\DevisFactures.xls"
     End If
    End Sub
    Et là j'ai une erreur d'exécution : "objet requis"

    A prioris l'erreur vient de IsOpen. Pouvez-vous m'aider à éclaircir tout ça ?

    Merci
    Nat

  2. #2
    Membre éclairé Avatar de zandru
    Homme Profil pro
    Ingénieur conception mécanique
    Inscrit en
    Mars 2008
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2008
    Messages : 507
    Par défaut
    Bonjour,

    ce que j'ai fait pour contourner ce problème, c'est parcourir les fichiers ouverts et comparer leurs noms. Si on trouve celui que l'on cherche c'est qu'il est ouvert:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim Flg As Boolean
    Dim X As Integer
    For X = 1 To Workbooks.Count
         If Workbooks(X).Name = "DevisFactures.xls" Then
              Flg = True
              MsgBox("ça marche")
         End If
    Next X
    donc si Flg=true c'est déjà ouvert
    il ne te reste plus qu'à adapter et tester

  3. #3
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 16
    Par défaut
    Merci pour ta réponse Zandru.

    Ta macro fonctionne bien, mais le soucis est que je n'arrive pas à l'adapter.

    Ce que je voudrais c'est :
    si mon classeur est ouvert, je sors de la macro
    S'il ne l'est pas, je l'ouvre

    voici comment je l'ai modifiée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Test()
    Dim Flg As Boolean
    Dim x As Integer
    For x = 1 To Workbooks.Count
         If Workbooks(x).Name = "DevisFactures.xls" Then
            Flg = True
            End
        Else
            Flg = False
            Workbooks.Open Filename:="E:\DUT GEA\3ème année\Stage\DevisFactures.xls"
        End If
    Next x
    End Sub
    Mais si le classeur est ouvert, la macro ne s'arrête pas pour autant et essaye de me l'ouvrir une 2ème fois...

    Pourquoi ?

    A bientôt pour la suite
    nat

    Merci à toi aussi Kiki29.

    J'ai fait comme tu as dit et j'ai été sur la FAQ (je n'avais pas vu cette question là ce matin)

    J'ai fait du copier-coller, modifié quelques trucs et cela donne ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Test3()
        If VerifOuvertureClasseur("E:\DUT GEA\3ème année\Stage\DevisFactures.xls") Then
            End
        Else
            Workbooks.Open Filename:="E:\DUT GEA\3ème année\Stage\DevisFactures.xls"
        End If
    End Sub
    et aussi ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function VerifOuvertureClasseur(Fichier As String) As Boolean
        Dim x As Integer
     
        On Error Resume Next
        x = FreeFile()
     
        Open Fichier For Input Lock Read As #x
        Close x
     
        If Err.Number = 0 Then VerifOuvertureClasseur = False
        If Err.Number = 70 Then VerifOuvertureClasseur = True
     
        On Error GoTo 0
    End Function
    Cela fonctionne parfaitement, sauf que j'ai copié sans comprendre ce que je faisais.

    La partie sub, c'est bon. Mais la partie fonction... Je ne sais même pas quelle est la différence entre sub et fonction (je ne savais d'ailleurs pas qu'il existait autre chose que sub)
    Il faut dire que je découvre et j'apprends la programmation des macros sur le tas avec mon stage.

    Quelqu'un peut-il m'expliquer et me commenter cette partie là ?

    Merci
    Nat

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Par défaut
    Sub correspond à une procédure où il n'y a pas de "sortie". Function est une fonction (héhé) qui te renvoie une "sortie". En gros, dans ta fonction, tu lui passes un paramètre qui est un String et elle te retourne un Booléen en sortie.
    Ainsi, pour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Test3()
        If VerifOuvertureClasseur("E:\DUT GEA\3ème année\Stage\DevisFactures.xls") Then
            End
        Else
            Workbooks.Open Filename:="E:\DUT GEA\3ème année\Stage\DevisFactures.xls"
        End If
    End Sub
    cela signifie que si ta fonction t'a retourné TRUE tu es dans le 1er cas. Le FALSE correspond au deuxième cas. La "sortie" correspond à un résultat généré par ta fonction qui peut ainsi être réutilisé hors de ta fonction.

    C'est bien ça, hein? En ce qui concerne le code de la fonction, je laisse quelqu'un d'autre t'expliquer (et m'expliquer aussi au passage quelques points sombres sur lesquels je planche aussi )

  6. #6
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut,l'aide en ligne devrait être suffisante : sous VBE sélectionner Open puis [F1] , dans fenêtre "Aide contextuelle" la sélection par défaut "VBA open" étant la bonne, cliquer sur bouton Aide

  7. #7
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Voici comment je procède:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      Dim iErr As Long
      Dim strListFile As String
      Dim strListPath As String
      Dim wbkList As Workbook
      strListPath = "LeCheminDuRepertoire"
      strListFile = "LeNomDuFichier.xls"
      Err.Clear
      On Error Resume Next
      Set wbkList = Workbooks(strListFile)
      iErr = Err.Number
      On Error GoTo 0
      If Not iErr = 0 Then
        Set wbkList = Workbooks.Open(strListPath & "\" & strListFile)
      End If
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Une petite variante (qui ne change rien)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim CL1 As Workbook
    On Error Resume Next
    Set CL1 = Workbooks("UnClasseur.xls")
    If Not CL1 Is Nothing Then
        MsgBox "Fichier ouvert"
        Else
        MsgBox "Fichier fermé"
    End If
    On error goto 0
    (salut Alain)

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 16
    Par défaut
    Merci à tous,

    Bon, je vais essayer de comprendre par moi-même ce qu'est une fonction. En tout cas plus de problèmes pour ma macro.

    à bientôt sans doute...
    Nat

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

Discussions similaires

  1. Réponses: 23
    Dernier message: 25/04/2007, 16h36
  2. cacher entièrement un classeur ouvert
    Par roseau dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/03/2007, 11h39
  3. [VBA-Excel] Adresse du classeur ouvert
    Par marsupilami34 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/11/2006, 17h07
  4. affectation d'un nom de classeur ouvert dans une variable
    Par nolive915 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/09/2006, 10h55
  5. [VBA-E] Probleme avec l'activate d'un classeur ouvert pour un copy paste
    Par AliochaBada dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/08/2006, 22h31

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