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 :

Incompatibilité 13 - Apparait de manière aléatoire. Je ne comprend pas pourquoi


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 33
    Points : 13
    Points
    13
    Par défaut Incompatibilité 13 - Apparait de manière aléatoire. Je ne comprend pas pourquoi
    Bonjour,

    Avant de vous donner le code, je pense qu'il serait plus judicieux de vous dire ce que je cherche à faire car je bricole seulement un peu sur VBA.

    Mon objectif, chercher une valeur entre 2 colonnes.
    Pour celà, je cherche la colonne avec le terme "Zone de Production MELUN"
    A est une variable qui me permet de stocker la valeur de la colonne soit 49 (AW)
    ensuite je lui demande de rajouter 20 cases pour définir ma plage soit de la colonne AW à la colonne BP
    Une fois la plage définie je lui demande de chercher ma variable Domaine1 dans la zone de recherche ce qui me donne en B une adresse de type "$AX$6"

    A partir de là je continue avec la macro sans erreur particulière.

    Les variables sont définis ainsi :
    Public A As Integer
    Public B As String
    Public Domaine1 As String

    Veuillez trouver ci dessous un extrait du code incriminé.

    _________________________________________________________________________________________________________________________________
    Sub MAJDONNEETOTAL()

    'On determine les colonnes où l'on recherche les thèmes à mettre à jour
    A = Cells.Find(What:="Zone de Production MELUN", After:=ActiveCell, _
    LookIn:=xlFormulas2, LookAt:=xlWhole, SearchOrder:=xlByRows, _
    SearchDirection:=xlNext, MatchCase:=True, SearchFormat:=False).Column
    'Une fois les colonnes ciblées, on cherche le chaptitre à mettre à jour
    B = Worksheets("DashBoard").Columns(A).Resize(, 19).Find(What:=Domaine1, After:=ActiveCell, LookIn _
    :=xlFormulas2, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:= _
    xlNext, MatchCase:=True, SearchFormat:=False).Address

    MPS1 = MPS1 + MPS1Bis: MPS2 = MPS2 + MPS2Bis

    'Mise à jour du domaine global (MPS + MPC de chaque thème)
    If MPS1 + MPC1 = 0 Then
    Worksheets("DashBoard").Range(B)(1, 11).Value = 1
    Else
    If MPS2 + MPC2 = 0 Then
    Worksheets("DashBoard").Range(B)(1, 11).Value = 0
    Else
    Worksheets("DashBoard").Range(B)(1, 11).Value = (MPS2 + MPC2) / (MPS1 + MPC1)
    End If
    End If

    End sub

    _________________________________________________________________________________________________________________________________

    Je ne comprends pas pourquoi le plus souvent ça marche et parfois il me dit incompatibilité 13...
    C'est à n'y rien comprendre...

    Pourriez vous m'aiguiller s'il vous plaît ?

    Cordialement

  2. #2
    Membre confirmé Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 362
    Points : 644
    Points
    644
    Par défaut
    Salut,
    Je serais tenté de dire : et si A n'est pas trouvé ?
    Jean-Paul sous Office 365 et Windows 10/11 (Intel I7 16Go)

    Si vous avez trouvé réponse à votre question penser à la passer en Vous avez aimé la discussion alors un fait toujours plaisir.
    Le savoir n'a de valeur que s'il est partagé.
    La vérité de demain se nourrit de l'erreur d'hier. Antoine de Saint-Exupéry

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 118
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 118
    Points : 1 644
    Points
    1 644
    Par défaut
    Hello,

    La méthode Find renvoie un objet Range, qui vaut Nothing en cas d'échec.
    Il convient de tester si la recherche est fructueuse ou pas.

    Tu as l'impression que ton code fonctionne car en cas de succès, VBA effectue des convertions implicites.
    En cas d'echec tu obtiens une erreur car Nothing n'est pas convertible en entier ni en chaîne.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 33
    Points : 13
    Points
    13
    Par défaut
    Merci pour le retour mais du coup tu me conseilles quoi ?
    Peut être que la méthode .find n'est pas la plus approprié pour trouver la cellule dans la plage souhaitée?

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par Kalagane75 Voir le message
    Merci pour le retour mais du coup tu me conseilles quoi ?
    Peut être que la méthode .find n'est pas la plus approprié pour trouver la cellule dans la plage souhaitée?
    la méthode find est trop longue, trop de paramètres.
    Essayer de la "splitter" avec quelques éléments au début pour voir quel paramètre ne fonctionne pas.
    C'est certainement un problème de paramètres passé à cette méthode.
    Après une fois que la méthode fonctionne c'est bon on peut faire une instruction à rallonge.
    Après comment vous faites si dans une cellule c'est orthographié "zone de prod de Melun" ?
    Je vous conseille de balayer toutes les cellules,mettre les chaînes de caractères en mnuscule au besoin et tester si vous avez la bonne chaîne de caractères

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 118
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 118
    Points : 1 644
    Points
    1 644
    Par défaut
    Citation Envoyé par Kalagane75 Voir le message
    Merci pour le retour mais du coup tu me conseilles quoi ?
    Peut être que la méthode .find n'est pas la plus approprié pour trouver la cellule dans la plage souhaitée?
    Utilises des type de donnée adaptés.
    Find renvoie un objet de type Range, stocke le dans un objet de type Range (concordance des types, c'est la base de la programmation).

  7. #7
    Membre confirmé Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 362
    Points : 644
    Points
    644
    Par défaut
    Salut,
    Passer le paramètre MatchCase à True, est selon moi trop restrictif. Si la valeur de la cellule est "Zone de Production Melun" elle ne sera pas trouvée.
    Idem pour le paramètre After:=ActiveCell, cela peut entrainer des résultats exotiques. Si tu dois trouver toutes les occurrences dans une plage, préfères lui un boucle comme donné dans l'exemple de la méthode Find.
    Range.Find, méthode (Excel) | Microsoft Learn
    N'ayant pas l'entièreté du code, une procédure minimaliste donnerais à peu près cela.
    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
    Sub MAJDONNEETOTAL()'On determine les colonnes où l'on recherche les thèmes à mettre à jour
        Dim A As Range
        Set A = Cells.Find(What:="Zone de Production MELUN", After:=ActiveCell, _
                           LookIn:=xlFormulas2, LookAt:=xlWhole, SearchOrder:=xlByRows, _
                           SearchDirection:=xlNext, MatchCase:=True, SearchFormat:=False)    ' //On recherche la plage .Column
        If Not A Is Nothing Then
            'Une fois les colonnes ciblées, on cherche le chaptitre à mettre à jour
            Dim B As Range
            Set B = Worksheets("DashBoard").Columns(A.Column).Resize(, 19).Find(What:=domaine1, After:=ActiveCell, LookIn _
                                                                                                                   :=xlFormulas2, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:= _
                                                                                xlNext, MatchCase:=True, SearchFormat:=False)    ' // Ici aussi on recherche une plage .Address
            If Not B Is Nothing Then
                MPS1 = MPS1 + MPS1Bis: MPS2 = MPS2 + MPS2Bis
                'Mise à jour du domaine global (MPS + MPC de chaque thème)
                If MPS1 + MPC1 = 0 Then
                    Worksheets("DashBoard").Range(B.Address)(1, 11).Value = 1
                Else
                    If MPS2 + MPC2 = 0 Then
                        Worksheets("DashBoard").Range(B.Address)(1, 11).Value = 0
                    Else
                        Worksheets("DashBoard").Range(B.Address)(1, 11).Value = (MPS2 + MPC2) / (MPS1 + MPC1)
                    End If
                End If
            Else
                ' // ToDo si B n'est pas trouvé
            End If
        Else
            ' // ToDo si A n'est pas trouvé
        End If
    End Sub
    Jean-Paul sous Office 365 et Windows 10/11 (Intel I7 16Go)

    Si vous avez trouvé réponse à votre question penser à la passer en Vous avez aimé la discussion alors un fait toujours plaisir.
    Le savoir n'a de valeur que s'il est partagé.
    La vérité de demain se nourrit de l'erreur d'hier. Antoine de Saint-Exupéry

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2012
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 33
    Points : 13
    Points
    13
    Par défaut
    Merci beaucoup Valtrase !
    Juste pour savoir. Le concept "Set" A ou B... sert à quoi ?

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 773
    Points : 28 637
    Points
    28 637
    Billets dans le blog
    53
    Par défaut
    Bonjour?
    Juste pour savoir. Le concept "Set" A ou B... sert à quoi ?
    L'instruction Set sert à attribuer une référence d'objet à une variable objet

    Pour en savoir plus sur le sujet, je vous conseille la lecture de ce tutoriel Utiliser les variables en VBA Excel et tout particulièrement le chapitre II-K. Object
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

Discussions similaires

  1. Réponses: 8
    Dernier message: 30/11/2006, 12h26
  2. Faire apparaitre des calques de manière aléatoire
    Par __arno__ dans le forum Flash
    Réponses: 2
    Dernier message: 21/09/2006, 15h02
  3. lancer un script de manière aléatoire
    Par emilie75 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/09/2006, 10h13
  4. [VB-Excel]Erreur d'execution apparaissant de manière aléatoire
    Par Junness dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/07/2006, 12h40

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