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 :

VBA Fonction uniquement si la cellule est vide ou contient une erreur [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Janvier 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2017
    Messages : 24
    Par défaut VBA Fonction uniquement si la cellule est vide ou contient une erreur
    Bonjour a tous.
    Alors ceci est ma première demande je vais essayer d’être clair.

    Étant débutant en VBA j'ai trouvé sur internet ce code.

    J'ai des références dans la colonne B de ma feuille1 qui se nome ExtractA
    Et je vais cherché des info en feuille2 Qui se nome FB (qui change tous les jour)
    et ce de cette manière.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Sub Extract()
    With Sheets("ExtracA")
     
     
        .Range("L3:L110").Value = WorksheetFunction.VLookup(.Range("B3:B110").Value, Sheets("FB").Range("K:BI"), 4, False)
        .Range("N3:N110").Value = WorksheetFunction.VLookup(.Range("B3:B110").Value, Sheets("FB").Range("K:BI"), 5, False)
     
     
    End With
    End Sub
    Cela fonctionne très bien sauf que si je change ou je remplis les info moi même en feuille 1
    Si je refais une mise a jour mes info change.
    Je voudrais donc que ma fonction ne ce fait que si la cellule a renseigner en feuille 1 est vide ou contient une erreur comme ceci (#N/A).

    Voila j’espère être clair si quelqu’un peut m’aider merci

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 161
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    va voir du côté de la propriété SpecialCells

    regarde bien dans l'aide les deux paramètres dont il dispose, et note dans un coin que tu auras besoin des deux séparément avec une lecture attentive des arguments :

    - xlErrors
    - xlCellTypeBlanks


    sinon, tu seras obligé de faire des test Iserror et isblank cellule après cellule

  3. #3
    Membre averti
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Janvier 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2017
    Messages : 24
    Par défaut Merci pour l'info mais ça bug
    J'ai donc avancé un peut voici mon nouveau code
    Si je fais abstraction des erreur juste en recherchant les cellules vide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sub Extract()
    With Sheets("ExtracA")
     
     
        .Range("L3:L110") .SpecialCells(xlCellTypeBlanks) .Value = WorksheetFunction.VLookup(.Range("B3:B110").Value, Sheets("FB").Range("K:BI"), 4, False)
        .Range("N3:N110") .SpecialCells(xlCellTypeBlanks) .Value = WorksheetFunction.VLookup(.Range("B3:B110").Value, Sheets("FB").Range("K:BI"), 5, False)
     
     
    End With
    Du coup le code ce fais bien uniquement dans les cellules vide mais la recherche n'est pas bonne du tout il me met n'importe quoi.
    il ne tiens pas compte de la valeur inscrit en B?
    Merci de votre aide

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    il faut que tu mettes ta plage dans un tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim tabl1, tabl2
    tabl1=.Range("L3:L110").value
    tes VLookup dans un autre, tabl2
    Ensuite tu boucles sur tabl1 et tu ne mets à jours la feuille que pour les plages vides ou en erreur.
    Ou sinon comme tu débutes tu peux faire cellule par cellule. Ca sera plus lent mais plus simple, tu n'as pas trop d'écritures à faire.
    eric

  5. #5
    Membre averti
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Janvier 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2017
    Messages : 24
    Par défaut
    Merci eriiic mais je ne comprend pas tout?
    est ce que tu peut m'écrire le code complait en reprenant le mien STP
    Car j'ai du mal a comprendre
    Merci

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    en fait on ne peut pas mettre le résultat d'un worksheetFunction dans un tableau, en plus ça fait calculer les 'inutiles'.
    Ex simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Dim tabl1, lig As Long
        With Sheets("Feuil1")
            tabl1 = .Range("A3:A10")
            For lig = 1 To UBound(tabl1)
                If IsError(tabl1(lig, 1)) Then
                    .Cells(lig + 2, 1) = "résultat de ta fonction"
                ElseIf tabl1(lig, 1) = "" Then
                    .Cells(lig + 2, 1) = "résultat de ta fonction"
                End If
            Next lig
        End With
    Et si tu veux optimiser et boucler dans un range qui n'a que les erreurs et vides (et donc plus de tests à faire) regarde le post 2 de joe qui t'invite à regarder l'aide sur SpecialCells.
    eric

  7. #7
    Membre averti
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Janvier 2017
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Janvier 2017
    Messages : 24
    Par défaut
    Merci pour votre aide.
    J'ai explorer l'aide sur sur SpecialCells(xlCellTypeBlanks)
    Mais je n'y arrive toujours pas .
    Il me sélectionne bien que les case vide mais les info importer ne sont pas bonne?(voir mon 2eme post.)
    Si quelqu'un peut m'expliquer pourquoi car je galères pas mal la.

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    un exemple :
    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
    Sub exemple()
        Dim pl As Range, pl2 As Range, c As Range
        Set pl = [b2:b15]
        Set pl2 = Nothing ' pl2 ne doit garder aucune trace d'une précédente utilisation. Sinon le range n'est pas remis à zéro sur une erreur s'il n'y a pas de specialcells détectées 
        On Error Resume Next
        Set pl2 = pl.SpecialCells(xlCellTypeBlanks)
        If pl2 Is Nothing Then
            Set pl2 = pl.SpecialCells(xlCellTypeFormulas, xlErrors)
        Else
            Set pl2 = Union(pl.SpecialCells(xlCellTypeFormulas, xlErrors), pl2)
        End If
        On Error GoTo 0
        If Not pl2 Is Nothing Then
            For Each c In pl2
                Debug.Print c.Address
            Next c
        End If
    End Sub
    eric

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

Discussions similaires

  1. lancer une macro en fonction si une cellule est vide ou non
    Par timtof2011 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 26/11/2011, 15h12
  2. lancer une macro en fonction si une cellule est vide ou non
    Par timtof2011 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/11/2011, 11h01
  3. [VBA-E]Tester si une cellule est vide dans un cas particulier
    Par tonnick dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/09/2007, 11h12
  4. [VBA] Pourquoi mon jeu d'enregistrement est vide ?
    Par gyzmo5 dans le forum Access
    Réponses: 2
    Dernier message: 09/02/2006, 15h15
  5. [VBA-E]selectionner la premiere cellule non vide d'une ligne
    Par muse47 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/10/2005, 09h11

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