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 :

Si la feuille existe alors


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Par défaut Si la feuille existe alors
    Bonjour.

    J'ai lu cette discussion.

    Je me permets de poster ici, car de toutes les solutions proposées, c'est certainement la plus légère que j'ai trouvée (Les autres utilisent des boucles, voir 3 fonctions différentes !), et les réponses déjà apportées sont très proches de ce que je recherche.

    Moi aussi, je souhaite vérifier l'existence d'une feuille dans un autre classeur ouvert.

    Je donne donc toutes les infos :

    Je travaille sur un fichier FichierCible.Xlsm.

    Quand il s'ouvre, il va copier une plage de cellule d'une feuille d'un autre fichier, dans une plage de cellules d'une de ses propres feuilles.

    J'utilise un fichier ini et la fonction lire et écrire dans un fichier ini pour indiquer le fichier source et la feuille à recopier.
    Merci Romain Puyfoulhoux
    https://vb.developpez.com/faq/?page=Systeme#ini

    J'ai ramené cette fonction à INI_READ("Nom du paramètre")

    Voilà ce que contiennent ces paramètres :
    INI_READ("Ini_Database_Tmp_Path") : C:\Users\MonUser\Downloads\DossierDeTravail
    INI_READ("Ini_Xlsm_File_Nm") : FichierAVérifier.Xlsx
    INI_READ("Ini_Xlsm_Sheet") : FeuilleAVérifier

    Le nom de fichier contient en son début l'ID (un identifiant).

    Le nom de la feuille à importer est un nom de mois (mais tous les mois ne sont pas présents dans le fichier source, d'où ma demande).

    Il n'est pas possible de se passer de ce fichier ini dans la configuration que j'utilise

    Voici le 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
    43
    44
    45
    46
    47
    48
    49
    50
    Option Explicit
    Private Sub Workbook_Open()
    'Sur ouverture
     
    'on vitrifie les cellules cibles
    'Merci dubois
    Range("F2:R202").Clear
     
    'On indique l'ID dans la première cellule
    'Merci MarcelG
    'https://www.developpez.net/forums/d1421325/logiciels/microsoft-office/excel/macros-vba-excel/ecrire-cellule-partir-d-fonction-vba/
    Workbooks("FichierCible.Xlsm ").Worksheets("FeuilleCible").Range("A2").Value = Left(INI_READ("Ini_Xlsm_File_Nm"), InStr(INI_READ("Ini_Xlsm_File_Nm"), "#") - 1)
    'Et le mois dans la seconde
    Workbooks("FichierCible.xlsm").Worksheets("FeuilleCible").Range("B2").Value = UCase(Left(INI_READ("Ini_Xlsm_Sheet"), 1)) & LCase(Mid(INI_READ("Ini_Xlsm_Sheet"), 2))
     
    'On recopie les cellules d'origine
     
    'Les variables
    Dim Wrkbks_Nm, Wrkshts_Nm, Wrkbks_Fl_Path As String
    'Leurs valeurs
    Wrkbks_Fl_Path = INI_READ("Ini_Database_Tmp_Path") & "\" & INI_READ("Ini_Xlsm_File_Nm")
    Wrkbks_Nm = INI_READ("Ini_Xlsm_File_Nm")
    Wrkshts_Nm = INI_READ("Ini_Xlsm_Sheet")
     
    'Merci galopin01
    'http://forum.ruemontgallet.com/ruemontgallet/Programmation/vb-vba/comment-fichier-excel-sujet_23042_1.htm
    'Merci Banzai64
     
    'Workbooks("FichierCible.xlsm").Worksheets("FeuilleCible").Cells.ClearContents   'Pour supprimer tout le contenu de la feuille cible !
    Workbooks.Open Filename:=Wrkbks_Fl_Path
     
    "########## Ici devrait se trouver la procédure de test pour vérifier l'existence de la feuille visée."
     
    Workbooks(Wrkbks_Nm).Worksheets(Wrkshts_Nm).Range("A10:M210").Copy _
    Workbooks("FichierCible.xlsm").Worksheets("FeuilleCible").Range("F2:R202")
    Workbooks(Wrkbks_Nm).Close False
     
    'On enregistre tout
    'Merci Idoine
    Dim wb As Workbook
    For Each wb In Workbooks 'boucle sur tous les classeurs ouverts
    wb.Close True 'fermeture du classeur avec sauvegarde
    Next
    'On change un paramètre dans le fichier ini :
    INI_WRT "Ini_Xlsm_Wait", "GO"
     
    'On ferme
    'Application.Quit
     
    End Sub
    Et voilà.

    Tout comme raymoundo, je souhaiterais écrire quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If FeuilleExiste(LeWorkBookDeMonChoix, "feuil1") Then
    Et donc j'ai écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If FeuilleExiste(Wrkbks_Nm, Wrkshts_Nm) Then
    Erreur :
    Wrkbks_Nm surligné en bleu, erreur de compilation : Type d'argument Byref incompatible

    J'ai tenté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If FeuilleExiste(Wrkbks_Fl_Path, Wrkshts_Nm) Then
    Erreur :
    Wrkbks_Fl_Path surligné en bleu, erreur de compilation : Type d'argument Byref incompatible

    Je ne dois pas le faire comme il faut…

    D'avance merci.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Par défaut
    Bonjour.

    Je continue mes recherches :

    J'ai trouvé ça :
    Merci Patrice33740

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function Feuille_Existe(ByVal Nom_Feuille As String) As Boolean
    Dim Feuille As Excel.Worksheet
    On Error GoTo Feuille_Absente_Error
    Set Feuille = ActiveWorkbook.Worksheets(Nom_Feuille)
    On Error GoTo 0
    Feuille_Existe= True
    Exit Function
    Feuille_Absente_Error:
    Feuille_Existe= False
    End Function
    J'espère que j'ai tout bien rangé dans l'ordre, le code d'origine n'était pas formaté...

    Usage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Feuille_Existe("Feuil1") Then
    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not Feuille_Existe("Feuil1") Then
    J'ai essayé de l'adapter pour pouvoir travailler sur le worbook de mon choix :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function Feuille_Existe(ByVal Nom_Classeur, Nom_Feuille As String) As Boolean
    Dim Feuille As Excel.Worksheet
    On Error GoTo Feuille_Absente_Error
    Set Feuille = Workbooks(Nom_Classeur).Worksheets(Nom_Feuille)
    On Error GoTo 0
    Feuille_Existe = True
    Exit Function
    Feuille_Absente_Error:
    Feuille_Existe = False
    End Function
    Usage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If FeuilleExiste(Wrkbks_Nm, Wrkshts_Nm) Then
    Erreur :
    Wrkshts_Nm surligné en bleu, erreur de compilation : Type d'argument Byref incompatible

    Je me demande s'il n'y a pas une histoire avec les guillemets...

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour
    une gestion d'erreur ca vous suffit que vous ajoutez des goto et trucs absolument inutiles!!!

    Fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Function Feuille_Existe(ByVal Nom_Feuille As String) As Boolean
    Dim f As Object
    On Error Resume Next
    Set f = ActiveWorkbook.Worksheets(Nom_Feuille)
    Feuille_Existe = Not f Is Nothing
    End Function
    Sub de test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
    MsgBox Feuille_Existe("toto")
    End Sub
    une fonction est sensée vous renvoyé un resultat dans le cas present
    la gestion d'erreur est obligatoire dans ce contexte oui!!! mais pas la peine d'en rajouter, si erreur il y a: la fonction etant prevu pour renvoyer un booleen elle renverra false car une variable ou fonction (as boolean) est a false d'office et comme elle saute le set en cas d'erreur le f sera nothing d'office
    donc si il n'y a pas d'erreur la fonction prendra la valeur de "= Not f Is Nothing"sinon elle est deja!!! a la base !!! a false


    pas la peine d'en mettre des tartines

    et j'irrais meme plus loin
    puisque vous l'avez compris tout se joue avec le"on error resumenext on vire f et on fait une simple affirmation qui sera rejeter forcement par exemple en demandant l'index d'un sheets nommé ce que vous voulez
    et hop une !!! ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function Feuille_Existe(ByVal Nom_Feuille As String) As Boolean
    On Error Resume Next
    Feuille_Existe = ActiveWorkbook.Worksheets(Nom_Feuille).Index
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
    MsgBox Feuille_Existe("Feuil1")
    End Sub
    perso pour les tartine je prefere le sirop d'erable
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Bonjour,

    Citation Envoyé par patricktoulon Voir le message
    et trucs absolument inutiles!!!
    Vérifions l'utilité des trucs avant de les retirer :
    Avec la function :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function Feuille_Existe(ByVal Nom_Feuille As String) As Boolean
    On Error Resume Next
    Feuille_Existe = ActiveWorkbook.Worksheets(Nom_Feuille).Index
    End Function
    Je l'utilise comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub test()
    On Error GoTo gestion_erreurs
    MsgBox Feuille_Existe("ttt")
    gestion_erreurs:
    If Err.Number <> 0 Then
        MsgBox "Erreur dans la sub test : " & Err.Number & ", " & Err.Description
    End If
    End Sub
    Et là j'ai ma MsgBox qui s'affiche.
    L'objet Err n'est pas réinitialisé à la fin de la procédure Feuille_Existe.

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonsoir Arkham
    bon d'accords un err.clear mais pas dans la sub
    a quoi pourrait bien me servir le err.description dans tout les cas ce sera index 9 hors limite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function Feuille_Existe(ByVal Nom_Feuille As String) As Boolean
    On Error Resume Next
    Feuille_Existe = ActiveWorkbook.Worksheets(Nom_Feuille).Index
    Err.Clear
    End Function
    par contre il faudra m'expliquer pourquoi ta gestion ne se declenche pas comme ca en enlevant le .clear dans la fonctionbien entendu
    il n'y a aucunes raison que le code ne saute pas l'exit sub et pourtant il ne la saute pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
    On Error GoTo gestion_erreurs
    MsgBox Feuille_Existe("ttt")
    Exit Sub
    gestion_erreurs:
    If Err.Number <> 0 Then
        MsgBox "Erreur dans la sub test : " & Err.Number & ", " & Err.Description
    End If
    End Sub
    donc sur le fond tu a raison mais dans la pratique il y a un truc qui cloche dans la gestion puisque le exit sub n'est pas sauté

    une autre preuve que ta gestion cloche quelque part j'affiche un second msgbox puis un 3 eme
    et ils s'affichent bien encore une fois le goto gestion walouh....walouh on a les 4 messages

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub test()
    On Error GoTo gestion_erreurs
    MsgBox Feuille_Existe("ttt")
    MsgBox "un autre message coucou ca passe ou ca passe pas "
    msgbox "ben oui ca passe"
    gestion_erreurs:
    If Err.Number <> 0 Then
        MsgBox "Erreur dans la sub test : " & Err.Number & ", " & Err.Description
    End If
    End Sub
    et le must
    puisque tu met le doigt dessus
    et que par ta demo tu demontre que dans la sub on peut determiner l'erreur et sa description j'ai reinitialisé le module donc err.number=0

    j'ai tenter cela
    puisque selon toi l'object err est bien en memoire puisque j'ai shunter le err.clear et doit donc declancher dans la sub le msgbox de gestion et donc je ne devrais pas avoir les autres msgbox
    meme la variable toto est passée
    donc teste cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test2()
    If Err.Number <> 0 Then GoTo gestion_erreurs
    MsgBox Feuille_Existe("ttt")
    MsgBox "un autre message coucou ca passe ou ca passe pas "
    MsgBox "ben oui ca passe"
    toto="titi"
    gestion_erreurs:
        MsgBox "Erreur dans la sub test : " & Err.Number & ", " & Err.Description & vbcrlf & toto
    End Sub
    walouh walouh on a les 4 msgboxs




    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Ce n'est pas ici le but de faire un cours sur la gestion d'erreurs.
    Tu arrives en disant que tu vas tout simplifier.
    J'arrive en disant que tu simplifies trop et ta solution est pire que la tartine que tu veux corriger.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Par défaut
    Bonsoir messieurs.

    Désolé pour le retard.

    Un grand merci pour vos réponses et votre passion dans ces dernières.

    Le débat à l'air passionnant, mais malheureusement, je ne suis pas à la hauteur pour le comprendre...

    Citation Envoyé par patricktoulon Voir le message
    [...]
    pas la peine d'en mettre des tartines
    [...]
    J'y suis pour rien moi, j'ai juste recopié un code dont je site la source d'ailleurs !

    Ma question suivante va soit faire apparaitre à quel point je n'y comprend rien, soit à quel point je suis ingrat (c'est la première fois que je fait du VBA sous Excel. d'habitude je fait Access... Les notions de classeur et de feuille et de comment on les manipule en VBA...).

    J'ai comme l'impression que vos vérifications se font sur "ActiveWorkbook".

    Je suis presque sûr que c'est le classeur sur le quel je travaille et dans lequel j'héberge le code pour laquelle je demande votre aide.

    Comment indiquer à Excel de vérifier l'existence d'une feuille dans un autre classeur lui aussi ouvert (par ce même code d'ailleurs) avec une variable comme nom de classeur et de feuille ?

    D'avance merci.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Par défaut
    Bonjour.

    Je me permets de rebondir.

    J'ai beau le tourner dans tous les sens, je ne comprend pas pourquoi :

    Set Feuille = Workbooks(Nom_Classeur).Worksheets(Nom_Feuille) ne donne pas le résultat escompté (voir descriptif de l'erreur dans les messages précédent)...

    Est-ce parce que je met Workbooks à la place de Workbook ?

    Je ne vois pas trop quoi essayer de plus...

    Encore merci.

  9. #9
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    J'ai pas relu tout le post, mais il n'y a que trois raisons au problème :
    il faut que Nom_Classeur et Nom_Feuille existent et que Nom_Classeur soit ouvert

    L'adaptation que tu avais fait de mon code fonctionne parfaitement si le classeur est ouvert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function Feuille_Existe(ByVal Nom_Classeur As String, Nom_Feuille As String) As Boolean
    Dim Feuille As Excel.Worksheet
      On Error GoTo Feuille_Absente_Error
      Set Feuille = Workbooks(Nom_Classeur).Worksheets(Nom_Feuille)
      On Error GoTo 0
      Feuille_Existe = True
      Exit Function
    Feuille_Absente_Error:
      Feuille_Existe = False
    End Function

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonsoir patrice

    encore faut il que ce classeur ouvert le soit dans la meme instance d'excel sinon c'est rapé que se soit dans la collection workbooks ou un getobject il ne ressortira pas
    a faire un fonction workbooks et feuille je n'en ferais pas une boolean mais je ferait en sorte qu'elle me retourne l'erreur workbook ou feuille
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Par défaut
    Bonjour à tous.

    Merci pour vos réponse et la confirmation que mon code était bon.

    Un fois que j'ai eu cette info, je suis allé sur un forum BTP pour apprendre à construire un mur.

    Une fois le mur construit, je me suis tapé la tête contre...

    J'utilise le code comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If FeuilleExiste(Wrkbks_Nm, Wrkshts_Nm) Then
    Mais je n'avais déclaré les variables Wrkbks_Nm et Wrkshts_Nm comme il faut. Du coup, ça marche pas...

    (Code bon + usage du code bon + déclaration des variables utilisées dans l'usage mauvaise = code qui marche pas !)

    Maintenant ça marche !

    Merci encore à tout le monde.

    patricktoulon, j'ai pas tout compris à votre dernier post, mais visiblement, ça peut poser des problèmes.

    Moi, j'ai ma solution.

    Mais si vous voulez ajouter une explication pour ceux qui sont dans le cas de figure que vous évoquez, je laisse ouvert encore un peu.

    Encore merci à tous !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/03/2015, 11h22
  2. calcul si la feuille existe
    Par jekeclo dans le forum Excel
    Réponses: 3
    Dernier message: 26/12/2007, 11h22
  3. [VBA-E] Si la feuille existe alors
    Par raymoundo dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/01/2007, 14h19
  4. Réponses: 2
    Dernier message: 16/03/2006, 17h40
  5. [VB6]Possible? : Si textBox1 Existe Alors
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 20/02/2006, 09h58

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