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 :

erreur VBA suite à une cellule non trouvée


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Femme Profil pro
    analyste crédit
    Inscrit en
    Avril 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : analyste crédit

    Informations forums :
    Inscription : Avril 2019
    Messages : 2
    Par défaut erreur VBA suite à une cellule non trouvée
    Bonjour,

    J'ai créé une macro pour importer des données à partir d'un autre fichier. Ce fichier peut avoir un format différent, soit le fichier contient la cellule F27 nommée "_1671", soit cette cellule n'existe pas dans ce cas j'aimerai que 0 soit saisi dans mon fichier.

    Pour importer les données, je dois choisir dans mon répertoire le fichier à ouvrir puis j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ThisWorkbook.Sheets("Passif").Range("F28") = FichXlsx.Sheets(2).Range("F27")
    qui me permet de copier la cellule F27 du fichier ouvert vers la cellule F28 de mon fichier

    Voici mon code pour prendre en compte les fichiers avec et sans la cellule "_1671":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If FichXlsx.Sheets(2).Range("_1671") = Cells(27, 6) Then
    ThisWorkbook.Sheets("Passif").Range("F28") = FichXlsx.Sheets(2).Range("F27")
    Else: ThisWorkbook.Sheets("Passif").Range("F28") = 0
    End If
    Le code utilisé fonctionne lorsque la cellule "_1671" existe par contre lorsque cette cellule n'existe pas j'ai le message d'erreur suivant :
    Erreur d'exécution 1004" : erreur définie par l'application ou par l'objet
    ce qui bloque la macro et donc la suite des lignes à importer.

    Je débute en VBA et ne trouve pas de solution dans les forums.

    J'ai essayé de mettre if is error ou = false mais ça ne fonctionne pas.

    Pouvez-vous m'aider ?

    Merci beaucoup pour votre aide.

  2. #2
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 601
    Par défaut
    Bonjour,

    Pour le coup une solution serait de chercher si le classeur contient une zone nommée "_1671" avant d'essayer de travailler avec.

    Pour parcourir les noms d'un classeur:
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Dim Nom As Name
     
    For Each Nom In ActiveWorkbook.Names
     
        Msgbox Nom.Name
     
    Next Nom

    et donc tu peux adapter:

    Code vba : 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
     
    Dim Nom As Name
     
    ThisWorkbook.Sheets("Passif").Range("F28") = 0
     
    For Each Nom In FichXlsx.Names
     
        If Nom.Name = "_1671" Then
     
            ThisWorkbook.Sheets("Passif").Range("F28") = FichXlsx.Sheets(2).Range("F27")
     
            Exit For
     
        End If
     
    Next Nom

    F28 est d'abord forcée à 0 puis prend F27 de ton 2nd classeur si le nom existe.


    Autre solution sans forcer F28 à 0 des fois que cela engendre des calculs chronophages
    Code vba : 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
     
    Dim Nom As Name
    Dim existe_nom As Long
     
    existe_nom = 0 'pas obligatoire pour une seule passe mais toi tu traites plusieurs fichiers dans une boucle donc tu dois réinitialiser ce témoin pour chaque fichier
     
    For Each Nom In FichXlsx.Names
     
        If Nom.Name = "_1671" Then
     
            existe_nom = 1
     
            Exit For
     
        End If
     
    Next Nom
     
    If existe_nom = 1 Then
     
        ThisWorkbook.Sheets("Passif").Range("F28") = FichXlsx.Sheets(2).Range("F27")
     
    Else
     
        ThisWorkbook.Sheets("Passif").Range("F28") = 0
     
    End If

    Autre solution avec le "on error" mais moins propre diront certains.
    Ici on cherche à retrouver l'adresse du nom voulu dans la variable. Si en sortie la variable est <> "" alors c'est que le nom existe.

    Code vba : 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
     
    Dim nom_a_tester As String
    Dim existe_nom As String
     
    nom_a_tester = "_1671"
     
    existe_nom = "" 'pas obligatoire pour une seule passe mais toi tu traites  plusieurs fichiers dans une boucle donc tu dois réinitialiser ce témoin  pour chaque fichier
     
    On Error Resume Next
    existe_nom = FichXlsx.Names(nom_a_tester).Address
    On Error GoTo 0
     
    If existe_nom = "" Then
     
        ThisWorkbook.Sheets("Passif").Range("F28") = 0
     
    Else
     
        ThisWorkbook.Sheets("Passif").Range("F28") = FichXlsx.Sheets(2).Range("F27")
     
    End If

    Tu choisis.

    Attention de bien initialiser tes variables existe_nom à 0 puisque tu traites plusieurs fichiers dans une boucle. Il faut que pour chaque fichier ce témoin soit remis à 0. C'est pour celà que je l'ai fait dans le code ci-dessus même si, en théorie pour une seule passe, ce n'est pas obligatoire.
    Par défaut un Long est initialisé à 0 donc hors boucle pas de souci mais toi tu dois absolument le forcer à 0 (sinon ce témoin gardera la valeur du test du fichier précédent).

    Et enfin pour info sous certaines conditions tu peux également accéder à une cellule par son nom au lieu de par son adresse (exemple ici si le nom est dans ton classeur):
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MsgBox ActiveSheet.Range("_1671")

    Teste et dis nous.

  3. #3
    Nouveau candidat au Club
    Femme Profil pro
    analyste crédit
    Inscrit en
    Avril 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : analyste crédit

    Informations forums :
    Inscription : Avril 2019
    Messages : 2
    Par défaut
    Merci Alex020181 !

    J'ai essayé la première solution et ça fonctionne très bien !

    J'ai même pu l'utiliser pour d'autres fichiers avec un problème similaire.

    J'en profite vu que tu t'y connais bien...

    J'ai un fichier protégé avec mot de passe et des cellules protégées car elles contiennent des liens vers d'autres fichiers. Dans ce fichier, il y a également une macro pour que la date du jour soit saisie automatiquement lorsqu'une cellule est modifiée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    If Target.Column = 1 Then
        Application.ScreenUpdating = True
        Application.EnableEvents = False
        For Each c In Intersect(Target, Range("A:A"))
            Unprotect ("Risques")
            c.Offset(, 1) = Format(Date, "dd/mm/yyyy")
        Next
        Application.EnableEvents = True
        Protect ("Risques")
    End If
    Le fichier est partagé dans Teams. Lorsque les données sont saisies directement dans Teams la macro ne fonctionne pas, il faut passer par l'application de bureau. Y a-t-il un moyen pour que le code fonctionne même en utilisant le fichier dans Teams ?

    Le fichier étant protégé avec des cellules protégées, le tri des colonnes et les mises à jour des liens ne peuvent pas se faire. Y-a-t-il une macro pour pouvoir utiliser ces fonctions malgré la protection du fichier ?

    Merci pour ton aide.

Discussions similaires

  1. [XL-2010] VBA - Etirer une cellule jusqu'à la dernière cellule non vide
    Par Couette-couette dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/12/2020, 15h55
  2. [XL-2019] Copier avec VBA une cellule non vide
    Par EAU24 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/10/2019, 18h11
  3. Réponses: 11
    Dernier message: 12/09/2014, 15h02
  4. Erreur lors d'un make une inclusion non trouvée
    Par CinePhil dans le forum Bibliothèques
    Réponses: 4
    Dernier message: 22/09/2009, 08h48
  5. [EXCEL][VBA] Compter les cellules non-vides
    Par Squelet dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/02/2006, 15h40

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