Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/01/2012, 11h28   #1
Futur Membre du Club
 
Inscription : mai 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 57
Points : 18
Points : 18
Par défaut Problème d'imbrication de With ?

Bonjour à tous,

Débutant en VBA, j'aurai besoin de vos lumières.

Je développe des petites automatisations sur un fichier Excel pour un gain de temps mais je rencontre un petit problème.

Tout d'abord le code avec les fontions utilisées :

Code :
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
 
Private Sub MonteeExport_Click()
 
Dim MaPlage As Range, Trouve As Range
Dim NomFichier As String
Dim DerniereLigneNonVide As Integer, NumColExport As Integer
Dim Adresse1 As String
 
DerniereLigneNonVide = Sheets("SUIVI_OBJETS").Range("D65536").End(xlUp).Row
 
NumColExport = NumColonneExportSelectionne
 
If Me.ListeExport <> "" Then
    If NumColExport <> Nul And NumColExport > 0 Then
        Set MaPlage = Sheets("SUIVI_OBJETS").Range(Cells(6, NumColExport), Cells(DerniereLigneNonVide, NumColExport))
        Set Trouve = MaPlage.Find("x", MaPlage.Cells(1), xlValues, xlWhole, xlByRows, xlNext)
 
        If Not Trouve Is Nothing Then
            Adresse1 = Trouve.Address
            NomFichier = Range("D" & Trouve.Row).Value
            If Me.RecetteE = True Then
                Do
                    DecocheOldVersion DerniereLigneNonVide, NomFichier, "G"
                    Sheets("SUIVI_OBJETS").Range("G" & Trouve.Row).Value = "x" 'Environnement recette
                    Sheets("SUIVI_OBJETS").Range("K" & Trouve.Row).Value = TranscoQuadri 'Quadrigramme responsable
                    Sheets("SUIVI_OBJETS").Range("L" & Trouve.Row).Value = Date 'Date installation recette
                Set Trouve = MaPlage.FindNext(Trouve)
                Loop While StrComp(Adresse1, Trouve.Address) <> 0
            Else
                Do
                    DecocheOldVersion DerniereLigneNonVide, NomFichier, "H"
                    Sheets("SUIVI_OBJETS").Range("H" & Trouve.Row).Value = "x" 'Environnement production
                    Sheets("SUIVI_OBJETS").Range("M" & Trouve.Row).Value = TranscoQuadri 'Quadrigramme responsable
                    Sheets("SUIVI_OBJETS").Range("N" & Trouve.Row).Value = Date 'Date installation recette
                Set Trouve = MaPlage.FindNext(Trouve)
                Loop While StrComp(Adresse1, Trouve.Address) <> 0
            End If
        End If
    Else
        MsgBox "Export inexistant, utilisez de préférence la liste déroulante.", vbInformation, "Erreur de mise à jour"
    End If
Else
    MsgBox "Vous devez entrer le nom du document mis à jour.", vbInformation, "Erreur de mise à jour"
    Me.ListeExport.SetFocus
End If
 
End Sub
 
 
Private Function NumColonneExportSelectionne()
 
Dim MaPlage As Range, Cell As Range
Dim DerniereColonneNonVide As Integer
 
DerniereColonneNonVide = Sheets("SUIVI_OBJETS").Range("P2").End(xlToRight).Column - 2
 
For Each Cell In Sheets("SUIVI_OBJETS").Range(Cells(2, 16), Cells(2, DerniereColonneNonVide))
    If Cell.Value = Me.ListeExport Then
        NumColonneExportSelectionne = Cell.Column
    End If
Next Cell
 
End Function
 
 
Private Sub DecocheOldVersion(ByVal DerniereLigneNonVide As Integer, ByVal NomFichier As String, ByVal Environnement As String)
 
Dim MaPlage As Range, Trouve As Range
Dim Adresse As String
 
Set MaPlage = Sheets("SUIVI_OBJETS").Range(Cells(6, 4), Cells(DerniereLigneNonVide, 4))
Set Trouve = MaPlage.Find(NomFichier, MaPlage.Cells(1), xlValues, xlWhole, xlByRows, xlNext)
 
If Not Trouve Is Nothing Then
    Adresse = Trouve.Address
    Do
        Sheets("SUIVI_OBJETS").Range(Environnement & Trouve.Row).Value = "" ' Decoche l ancienne version
    Set Trouve = MaPlage.FindNext(Trouve)
    Loop While StrComp(Adresse, Trouve.Address) <> 0
End If
End Sub
L'erreur se situe dans la proc MonteeExport_Click() sur la ligne :
Code :
 Loop While StrComp(Adresse1, Trouve.Address) <> 0
Erreur renvoyée : Variable objet ou variable bloc With non définie (erreur 91)

Je pense que l'erreur vient du fait que dans ma procédure DecocheOldVersion, je parcours une autre plage, et donc de l'imbrication de "with" (entre guillemets).
J'ai vu quelques sujets sur ce problème, essayé de mettre des with end with mais sans réussite...

Merci de votre aide.
et comme je suis débutant en VBA, si vous avez quelques remarques sur mon code n'hésitez pas.
squall62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 11h35   #2
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Le problème à mon avis, c'est qu'au bout d'un moment, Trouve devient Nothing car il ne trouve plus rien, du coup, tu ne peux plus lui demander son Address.
C'est bien sûr une première remarque sans avoir essayé de comprendre ton code. Tu vois quoi dans Trouve dans le débuggeur au moment de l'erreur ?
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 11h44   #3
Futur Membre du Club
 
Inscription : mai 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 57
Points : 18
Points : 18
Oui dans mon Trouve j'ai Nothing au moment du FindNext.
Mais justement ca ne devrait pas être le cas car il y a bien d'autres cellules à parcourir dans la plage.

Donc soit j'alimente mal ma plage soit il se perd dans les with soit je persiste à chercher l'erreur à l'endroit qu'elle n'est pas ...
squall62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 11h51   #4
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Je ne vois pas pourquoi tu parles de "with" depuis le début vu qu'il n'y en a pas dans ton code. Et ta plage à l'air bien alimentée.
J'essaierais de savoir la dernière cellule "x" trouvée avant que ça plante (En pas à pas ou avec des Debug.Print Adresse1 s'il y en a beaucoup), pour essayer une recherche manuelle ensuite et voir ce qui se passe.

Une idée toute bête, essaie de remplacer
Code :
Set Trouve = MaPlage.FindNext(Trouve)
par
Code :
Set Trouve = MaPlage.FindNext
S'il n'y avait qu'un "x", ça pourrait être le souci
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 11h59   #5
Futur Membre du Club
 
Inscription : mai 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 57
Points : 18
Points : 18
J'ai testé en enlevant le (Trouve), mais toujours le même message d'erreur.

Dans un Test, j'ai mis 4 "x" (Ligne 1444-1445-1446-1447)

Il fait bien les changements de valeurs pour la ligne 1444 mais plante avant d'atteindre la ligne suivante.
squall62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 12h24   #6
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Et ce ne serait pas par hasard parce que DecocheOldVersion enlèves les "x" ? Du coup, il n'y en a plus au FindNext suivant
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 12h43   #7
Futur Membre du Club
 
Inscription : mai 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 57
Points : 18
Points : 18
Non les "x" sont toujours présents pour cette colonne.

Les "x" que je supprime ne sont pas sur la même colonne.
squall62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 14h16   #8
Membre Expert
 
Avatar de ZebreLoup
 
Homme Sebastien L
Ingénieur Financier
Inscription : mars 2010
Messages : 880
Détails du profil
Informations personnelles :
Nom : Homme Sebastien L
Âge : 33
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur Financier
Secteur : Finance

Informations forums :
Inscription : mars 2010
Messages : 880
Points : 1 867
Points : 1 867
Je suis bête, tu fais un Find dans DecocheOldVersion, du coup, le FindNext que tu fais ensuite dans MonteeExport_Click va chercher nomFichier au lieu de "x" et ne le trouve pas...
Il vaudrait mieux refaire un Find en partant de Trouve
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer
« Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell
ZebreLoup est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 14h45   #9
Futur Membre du Club
 
Inscription : mai 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 57
Points : 18
Points : 18
Nickel !!

Merci beaucoup ! très gentil de m'avoir repondu et merci d'avoir trouvé la solution.
squall62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h15.


 
 
 
 
Partenaires

Hébergement Web