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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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