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 24/08/2011, 16h02   #1
Nouveau Membre du Club
 
Inscription : avril 2007
Messages : 199
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 199
Points : 31
Points : 31
Par défaut code avec plus de 7 conditions

Bonjour,

J'ai un programme ou je dois inserer un code avec plus de 7 conditions.
Or lorsque j'utilise la formule Si, cela me limite à 7 conditions au maximum.
Pour une meilleur visibilité, j'ai copié seulement le code qui nous interesse :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim d As Integer ' la lettre c symbolise la variable de la derniere ligne de la colonne "code liaison"
    d = Range("d" & Range("d65536").End(xlUp).Row).Row 'adaptation de la formule pour recuperer le N° de la dernière ligne de la colonne C
 
Range("B6").Select
ActiveCell.FormulaR1C1 = "=IF(AND(RC[2]=""63C-1167"",R1C3=""arrivee""),""clermont ferrand"",IF(AND(RC[2]=""63C-1167"",R1C3=""depart""),""erstein""," _
& "IF(AND(RC[2]=""67C-2841"",R1C3=""arrivee""),""erstein"",IF(AND(RC[2]=""67C-2841"",R1C3=""depart""),""cavaillon""," _
& "IF(AND(RC[2]=""67C-1163"",R1C3=""arrivee""),""erstein"",IF(AND(RC[2]=""67C-1163"",R1C3=""depart""),""clermont ferrand""," _
& "IF(RC[1]=""national"",VLOOKUP(RC[2],'P:\Commun\Transport Securité\Docs Madjid\[matrice.xls]matrice hermes'!R1C1:R800C3,3,0),"""")))))))"
 
    'RC[2]= colonne code liaison
 
    Range("B6").Copy
    d = Range("d" & Range("d65536").End(xlUp).Row).Row 'adaptation de la formule pour recuperer le N° de la dernière cellule de la colonne code liaison
    Range("B7:B" & d - 1).Select 'selection de la zone de copie
    Selection.PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:=False, Transpose:=False

Et voici le code que j'essaie de créer mais qui ne fonctionne pas du tout

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
Dim cell As Range
Dim note As Range
Dim valeur As Range
Dim cellule As Range
Dim d As Integer ' la lettre c symbolise la variable de la derniere ligne de la colonne "code liaison"
d = Range("d" & Range("d65536").End(xlUp).Row).Row 'adaptation de la formule pour recuperer le N° de la dernière ligne de la colonne D
 
Set cell = Range("D6")
Set note = Range("C1")
Set valeur = Range("B6")
Set cellule = Range("C6")
 
 
 
If cell = "63C-1167" And note = "arrivee" Then valeur = "clermont ferrand"
If cell = "63C-1167" And note = "depart" Then valeur = "erstein"
If cell = "67C-2841" And note = "arrivee" Then valeur = "erstein"
If cell = "67C-2841" And note = "depart" Then valeur = "cavaillon"
If cell = "67C-1163" And note = "arrivee" Then valeur = "erstein"
If cell = "67C-1163" And note = "depart" Then valeur = "clermont ferrand"
If cell = "55C-1284" And note = "arrivee" Then valeur = "bar le duc"
If cell = "55C-1284" And note = "depart" Then valeur = "cavaillon"
If cell = "84C-1255" And note = "arrivee" Then valeur = "cavaillon"
If cell = "84C-1255" And note = "depart" Then valeur = "bar le duc"
If cellule = "national" Then VLOOKUP(RC[2]),'P:\Commun\Transport Securité\Docs Madjid\[matrice.xls]matrice hermes'!R1C1:R800C3,3,0)
 
 
Range("B6").Copy
    d = Range("d" & Range("d65536").End(xlUp).Row).Row 'adaptation de la formule pour recuperer le N° de la dernière cellule de la colonne code liaison
    Range("B7:B" & d - 1).Select 'selection de la zone de copie
    Selection.PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Une aide serait le bien venu

merci
facteur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 16h26   #2
Membre actif
 
Inscription : novembre 2008
Messages : 188
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 188
Points : 194
Points : 194
Qu'est-ce qui ne fonctionne pas du tout?

Pas de plantage à l'exécution mais le résultat n'est pas celui escompté?

Si ça plante à l'exécution, quelle est l'erreur et sur quelle ligne?
Sclarckone est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2011, 16h30   #3
Membre expérimenté
 
Inscription : juillet 2008
Messages : 757
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 757
Points : 545
Points : 545
Ton premier probleme, c'est qu'en VBA, si tu met un IF, tu as besoin d'un END IF pour le cloturer

Code :
1
2
3
4
5
If Range("a1") = 1 Then
    Cells(1, 2) = "C'est un 1"
Else
    Cells(1, 2) = "C'est autre chose"
End If
(la ligne else est facultative)

Donc comme tu l'as formulé la, il ne va pas compiler du tout parce qu'il lui manque les balises de fin de if

Ton second probleme, c'est que si tu utilise le IF du VBA, ca ne met pas forcement une formule if dans la cellule (fais tourner mon exemple et tu verras que ce qu'il met en B2, c'est une bete chaine de caractere).
Une des conséquences est que si tu étirescette cellule vers le bas, tu n'auras pas le résultat que tu veux, vu que tu vas étirer une valeur et non pas une formule.
Ca se résoud en faisant une boucle en VBA qui va pour chacune de tes lignes (par exemple de 6 a d dans ton cas) faire ta formule vba

mon exemple deviendrait quelque chose comme ca
Code :
1
2
3
4
5
6
7
For i = 1 To 10
    If Range("a" & i) = 1 Then
        Cells(i, 2) = "C'est un 1"
    Else
        Cells(i, 2) = "C'est autre chose"
    End If
Next i
(ca regarde dans la colonne A si ca contient ou non 1, si oui, ca le dit dans la colonne B)

Essaye déja avec ca et dis nous si ca va mieux
EmmanuelleC est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 13h35   #4
Nouveau Membre du Club
 
Inscription : avril 2007
Messages : 199
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 199
Points : 31
Points : 31
Bonjour EmmanuelleC,

j'ai donc repris ton exemple et cela donne à peu prés cela :

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
Sub test2()
 
Dim i As Integer
Dim d As Integer
d = Range("d" & Range("d65536").End(xlUp).Row).Row
 
 
 
For i = 6 To d
 
If Range("D" & i) = "63c-1167" And Range("C1") = "arrivee" Then
Cells(i, 2) = "clermont ferrand"
Else
 
If Range("D" & i) = "63c-1167" And Range("C1") = "depart" Then
Cells(i, 2) = "ertein"
Else
 
If Range("D" & i) = "67c-2841" And Range("C1") = "arrivee" Then
Cells(i, 2) = "erstein"
Else
 
If Range("D" & i) = "67c-2841" And Range("C1") = "depart" Then
Cells(i, 2) = "cavaillon"
Else
 
If Range("D" & i) = "67c-1163" And Range("C1") = "arrivee" Then
Cells(i, 2) = "erstein"
Else
 
If Range("D" & i) = "67c-1163" And Range("C1") = "depart" Then
Cells(i, 2) = "clermont ferrand"
Else
 
If Range("D" & i) = "55c-1284" And Range("C1") = "arrivee" Then
Cells(i, 2) = "bar le duc"
Else
 
If Range("D" & i) = "55c-1284" And Range("C1") = "depart" Then
Cells(i, 2) = "cavaillon"
Else
 
If Range("D" & i) = "84c-1255" And Range("C1") = "arrivee" Then
Cells(i, 2) = "cavaillon"
Else
 
If Range("D" & i) = "84c-1255" And Range("C1") = "depart" Then
Cells(i, 2) = "bar le duc"
 
 
End If
Next i
 
End Sub
Mais quand je lance le programme, cela m'affiche un bug de type :
"erreur de compilation"
"Next sans For"
facteur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 14h55   #5
Nouveau Membre du Club
 
Inscription : avril 2007
Messages : 199
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 199
Points : 31
Points : 31
Rebonjour EmmanuelleC

J'ai reussi à corriger le bug mais un autre est apparu à la ligne 41 avec comme anomalie : " erreur de compilation"
"erreur de syntaxe"

Pourrais tu me dire quelle correction je dois faire :

Merci

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
Sub test2()
 
Dim i As Integer
Dim d As Integer
d = Range("d" & Range("d65536").End(xlUp).Row).Row
 
 
 
For i = 6 To d
 
If Range("D" & i) = "63c-1167" And Range("C1") = "arrivee" Then
Cells(i, 2) = "clermont ferrand"
 
ElseIf Range("D" & i) = "63c-1167" And Range("C1") = "depart" Then
Cells(i, 2) = "ertein"
 
ElseIf Range("D" & i) = "67c-2841" And Range("C1") = "arrivee" Then
Cells(i, 2) = "erstein"
 
ElseIf Range("D" & i) = "67c-2841" And Range("C1") = "depart" Then
Cells(i, 2) = "cavaillon"
 
ElseIf Range("D" & i) = "67c-1163" And Range("C1") = "arrivee" Then
Cells(i, 2) = "erstein"
 
ElseIf Range("D" & i) = "67c-1163" And Range("C1") = "depart" Then
Cells(i, 2) = "clermont ferrand"
 
ElseIf Range("D" & i) = "55c-1284" And Range("C1") = "arrivee" Then
Cells(i, 2) = "bar le duc"
 
ElseIf Range("D" & i) = "55c-1284" And Range("C1") = "depart" Then
Cells(i, 2) = "cavaillon"
 
ElseIf Range("D" & i) = "84c-1255" And Range("C1") = "arrivee" Then
Cells(i, 2) = "cavaillon"
 
ElseIf Range("D" & i) = "84c-1255" And Range("C1") = "depart" Then
Cells(i, 2) = "bar le duc"
 
Else Cells(i,2)= VLOOKUP(Range("D"& i),'P:\Commun\Transport Securité\Docs Madjid\[matrice.xls]matrice hermes'!R1C1:R800C3,3,0)
 
 
 
End If
Next i
 
End Sub
facteur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 15h23   #6
Expert Confirmé
 
Inscription : décembre 2007
Messages : 1 903
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 903
Points : 3 688
Points : 3 688
Là, je ferais autrement, vu le nombre de conditions :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
Select Case True
 
    Case (Range("D" & i) = "63c-1167" And Range("C1") = "arrivee") 
        Cells(i, 2) = "clermont ferrand"
    Case (Range("D" & i) = "63c-1167" And Range("C1") = "depart" )
        Cells(i, 2) = "ertein"
(.../...) 
    Case Else
        Cells(i,2)= VLOOKUP(Range("D"& i),'P:\Commun\Transport Securité\Docs Madjid\[matrice.xls]matrice hermes'!R1C1:R800C3,3,0)
 
End Select
Par contre, il est possible qu'il y aie une erreur sur la ligne else. J'ai copié-collé cette partie de ton code, elle a l'air OK, mais vu la complexité, je ne garantit rien.
__________________
Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
3)le temps de comprendre toutes les exigences, le projet est terminé
4)le temps de terminer le projet, les exigences ont changé
Et le serment de non-allégiance :
Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.
el_slapper est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 15h27   #7
Nouveau Membre du Club
 
Inscription : avril 2007
Messages : 199
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 199
Points : 31
Points : 31
Bonjour el_slapper,

Cà bug toujours ...
facteur est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 25/08/2011, 15h30   #8
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
Par défaut Quel voyage d'Array en Array avec Excel VBA !

La première chose à faire est de décrire la feuille voyage avec les constantes identifiant les rangées et colonnes principales.

Ensuite on décrit les types de voyage, ville de départ et ville d'arrivée dans le tableau varTravel.
Finalement la macro identifie la ville du voyage selon le sens départ ou arrivée.
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
82
83
84
85
86
Option Explicit ' Recherche la ville selon le type du trajet et le sens départ / arrivée
' =============================== Description de la feuille des voyages
Public Const rowPoint = 1       ' Rangée du point de départ ou d'arrivée
Public Const rowTravelStart = 6 ' Rangée du premier voyage
Public Const colCity = 2        ' La colonne B est le nom de la ville
Public Const colPoint = colCity + 1 ' Colonne C : point "DEPART" / "ARRIVEE" en C1
Public Const colNational = colPoint ' Colonne C : "national" ou "#N/A" ou "" à partir de C6
Public Const pointDeparture = "DEPART"
Public Const pointArrival = "ARRIVEE"
Public Const colTravel = colPoint + 1  ' En colonne D on trouve le type du voyage
Public Const typeNational = "national" ' Application de la formule strFormulaNational
Public Const indType = 0 ' Première dimension dans le tableau le plus interne de varTravel
Public Const indDeparture = indType + 1     ' Dimension suivante pour la ville de "DEPART"
Public Const indArrival = indDeparture + 1  ' Dernière dimension pour la ville d'"ARRIVEE"
 
' =============================== Classeur externe matrice.xls pour la formule nationale
Public Const nameXlsHermes = "P:\Commun\Transport Securité\Docs Madjid\[matrice.xls]matrice hermes"
Public Const strFormulaNational = "=VLOOKUP(RC[2],'" + nameXlsHermes + "'!R1C1:R800C3,3,0)"
 
' Recherche la ville selon le type du trajet et le sens départ / arrivée
Sub TravelCity()
Dim indRow As Integer, rowTravelEnd As Integer, indTravel As Integer
Dim strTravelType As String, strPoint As String, varTravel As Variant
Dim varNational As Variant, strCity As String
    Application.ScreenUpdating = False
    varTravel = TravelAssociations() ' tableau des trajets par type, depart, arrivee
    rowTravelEnd = Cells(Columns(colNational).Rows.Count, colTravel).End(xlUp).Row
    If rowTravelEnd < Cells(Columns(colNational).Rows.Count, colNational).End(xlUp).Row Then
        rowTravelEnd = Cells(Columns(colNational).Rows.Count, colNational).End(xlUp).Row
    End If
    strPoint = Cells(rowPoint, colPoint) ' Point du départ ou d'arrivée du voyage
    For indRow = rowTravelStart To rowTravelEnd
        strTravelType = Cells(indRow, colTravel)
        strCity = vbNullString
        For indTravel = LBound(varTravel) To UBound(varTravel)
            If strTravelType = varTravel(indTravel)(indType) Then ' En région
                If strPoint = pointDeparture Then
                    strCity = varTravel(indTravel)(indDeparture): Exit For
                ElseIf strPoint = pointArrival Then
                    strCity = varTravel(indTravel)(indArrival): Exit For
                End If
            End If
        Next
        If strCity <> vbNullString Then ' La ville en région a été identifiée
            Cells(indRow, colCity) = strCity
        Else ' Applique la formule nationale s'il y a typeNational à partir de C6
            varNational = Cells(indRow, colNational).Value
            If VarType(varNational) = vbError Then ' En cas d'erreur de formule
                varNational = vbNullString ' Absorbe l'erreur "#N/A" sans la corriger
            End If
            If varNational = typeNational Then ' Dans la France entière
                Cells(indRow, colCity).Formula = strFormulaNational
            Else
                Cells(indRow, colCity) = vbNullString
            End If
        End If
    Next
    Application.ScreenUpdating = True
    Debug.Print "Nombre de voyages trouvés : " & rowTravelEnd - rowTravelStart + 1
End Sub
 
' Table de chaque association : (type du voyage, ville de départ, ville d'arrivée)
' Si ces informations sont déjà sur la feuille, les lire et mettre à jour le tableau
Function TravelAssociations() As Variant
    TravelAssociations = Array( _
        Array("63c-1167", "ertein", "clermont ferrand"), _
        Array("67c-2841", "cavaillon", "erstein"), _
        Array("67c-1163", "clermont ferrand", "erstein"), _
        Array("55c-1284", "cavaillon", "bar le duc"), _
        Array("84c-1255", "bar le duc", "cavaillon"))
End Function
 
' Enlève les erreurs de formule dans un Range par ClearContents supprimant "#N/A"
' Attention la formule de la cellule générant "#N/A" est effacée !
Sub RemoveErrorNA(ByVal rngTargetWithErrorNA As Range)
Dim cellThis As Range, varCellValue As Variant
 
    For Each cellThis In rngTargetWithErrorNA
        varCellValue = cellThis.Value
        If VarType(varCellValue) = vbError Then
            If varCellValue = CVErr(xlErrNA) Then
                cellThis.ClearContents
            End If
        End If
    Next
End Sub
Notez comment on voit nettement la structure du programme grâce à l'indentation par rapport à la marge. Les noms des variables sont sur plus de trois lettres afin d'être compréhensibles et de pouvoir être renommés aisément en vos propres noms.

Sur la feuille Excel, on a en C1 : la chaîne "depart" sans accent et sans guillemets.
De D6 à D10, on a des types de voyages comme "63c-1167".
En C1, on a "DEPART" ou "ARRIVEE" en majuscule.
En C11 on a : "national" et dessous de C12 à C15 des erreurs de formule #N/A avec de B12 à B15 un texte libre "à effacer" qui sera effacé.

Citation:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
			DEPART	
 
 
 
 
				63c-1167
				67c-2841
				67c-1163
				55c-1284
				84c-1255
			national	
	à effacer	#N/A	
	à effacer	#N/A	
	à effacer	#N/A	
	à effacer	#N/A
Dans la fenêtre d'Exécution immédiate (Ctrl+G) du VBE (Visual Basic Editeur) d'Excel, copier-coller et valider par ENTER :
Nombre de voyages identifiés : 10

De B6 à B15, la procédure TravelCity() a affiché :
Citation:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
			DEPART	
 
 
 
 
	ertein			63c-1167
	cavaillon		67c-2841
	clermont ferrand	67c-1163
	cavaillon		55c-1284
	bar le duc		84c-1255
	#N/A		national	
			#N/A	
			#N/A	
			#N/A	
			#N/A
Décrire la feuille, déclarer les constantes et le tableau des voyages clarifie le problème et donne au moins 50% de la solution.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 25/08/2011, 15h32   #9
Membre expérimenté
 
Inscription : juillet 2008
Messages : 757
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 757
Points : 545
Points : 545
Si tu veux mettre avec du vba une formule dans une cellule (pas juste une valeur), il faut utiliser un .Formula = "formule" apres la cellule

Par exemple, si je veux mettre
Code :
=VLOOKUP(D1;A:B;2;FALSE)
En C3 je vais utiliser le code suivant
Code :
Cells(1,3).Formula = "=VLOOKUP(D1,A:B,2,FALSE)"
Chez moi je dois mettre des "," a la place des ";" dans la formule version VBA, mais c'est peut-etre du au fait que mon office soit en anglais
EmmanuelleC est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 15h54   #10
Nouveau Membre du Club
 
Inscription : avril 2007
Messages : 199
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 199
Points : 31
Points : 31
je dois avouer que la reponse de MattChess me laisse sans voix .
je crois que jevais la laisser de coté car je suis débutant en VBA..desolé .
EmmanuelleC, comment devrais alors adapter ta reponse a cette ligne 41 qui bug
facteur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 16h17   #11
Membre expérimenté
 
Inscription : juillet 2008
Messages : 757
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 757
Points : 545
Points : 545
Laisse sa réponse de coté mais pas longtemps il y a des exellents conseils générique de dévellopement dedans (indenter le code pour qu'il soit lisible, mettre des commentaires,...)
Je sais que quand on débute ca fait beaucoup d'un coup, et que c'est pas toujours simple de lire un code structuré par quelqu'un d'autre, mais si tu penses continuer a toucher a l'occasion a du VBA, revient passer du temps sur sa réponse quand tu auras 10 minutes de libre

Pour ta formule, teste cette formulation

Code :
Cells(i,2).Formula = "=VLOOKUP(D"& i &",'P:\Commun\Transport Securité\Docs Madjid\[matrice.xls]matrice hermes'!R1C1:R800C3,3,0)"
EmmanuelleC est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 16h33   #12
Membre Expert
 
Avatar de rvtoulon
 
Homme Hervé
Agent Technique
Inscription : mars 2009
Messages : 823
Détails du profil
Informations personnelles :
Nom : Homme Hervé
Âge : 36
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Agent Technique
Secteur : Santé

Informations forums :
Inscription : mars 2009
Messages : 823
Points : 1 441
Points : 1 441
Bonjour,
juste une remarque pour EmmnuelleC:
Citation:
Ton premier probleme, c'est qu'en VBA, si tu met un IF, tu as besoin d'un END IF pour le cloturer(...)(la ligne else est facultative)
c'est pas toujours vrai essaye ceci, avec ton exemple et vois ce qui se passe:
Code :
If Range("a1") = 1 Then Cells(1, 2) = "C'est un 1"
__________________
@+

Si vous avez trouvé la solution à votre problème n'oubliez pas d'appuyer sur
Et n'oubliez pas de voter en appuyant sur si ce message a repondu à vos attentes.
Ou sur si ce n'est pas le cas
rvtoulon est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 25/08/2011, 17h09   #13
Nouveau Membre du Club
 
Inscription : avril 2007
Messages : 199
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 199
Points : 31
Points : 31
EmmanuelleC,
N'y aurait il pas un soucis avec ton code

Code :
Cells(i,2).Formula = "=VLOOKUP(D"& i &",'P:\Commun\Transport Securité\Docs Madjid\[matrice.xls]matrice hermes'!R1C1:R800C3,3,0)"
car le programme se lance bien et prend en compte les conditions. mais lorsque celles ci sont epuisées , le programme ne prend pas en compte la ligne 41 . Et dans les celleules de la colonne B s'affiche "#nom?
facteur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 17h20   #14
Nouveau Membre du Club
 
Inscription : avril 2007
Messages : 199
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 199
Points : 31
Points : 31
je précise même que en rajoutant "else:", le code ne fonctionne pas
Code :
Else: Cells(i, 2).Formula = "=VLOOKUP(D " & i & " ,'P:\Commun\Transport Securité\Docs Madjid\[matrice.xls]matrice hermes'!R1C1:R800C3,3,0)"
facteur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 17h28   #15
Responsable
Office & Excel

 
Avatar de Pierre Fauconnier
 
Homme Pierre Fauconnier
Formateur et développeur informatique indépendant
Inscription : novembre 2003
Messages : 8 198
Détails du profil
Informations personnelles :
Nom : Homme Pierre Fauconnier
Âge : 45
Localisation : Belgique

Informations professionnelles :
Activité : Formateur et développeur informatique indépendant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 8 198
Points : 14 403
Points : 14 403
Envoyer un message via Skype™ à Pierre Fauconnier
Salut.

Je suis à peu près certain que c'est, comme très souvent, un problème de conception de classeur à la base.

Si tu souhaites la solution optimale, tu pourrais peut-être nous expliquer en français, ce que tu comptes réaliser.

Mettre des valeurs (comme les noms de ville) en dur dans du code, c'est à ne jamais faire.

Il y a donc, d'abord, une réflexion à mener sur la conception du classeur et des feuilles, afin d'envisager les meilleurs outils à mettre en oeuvre pour la réalisation de ton travail.
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------

Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP
Vous souhaitez rédiger pour DVP? Contactez-moi
Amoureux de la langue française? Venez corriger nos ressources
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
N'oubliez pas de VOTER (en bas à droite d'un message)

---------------
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2011, 18h09   #16
Membre éclairé
 
Inscription : juillet 2011
Messages : 141
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 141
Points : 382
Points : 382
Par défaut EXCEL VBA voyage d'Array en Array

Citation:
Envoyé par Pierre Fauconnier Voir le message
Mettre des valeurs (comme les noms de ville) en dur dans du code, c'est à ne jamais faire.
Très juste. J'ai déjà supprimé la constante numérique 65536 en dur dans le code.

J'ai regroupé l'initialisation du tableau des associations type du voyage, ville de départ et ville d'arrivée dans un tableau dynamique varTravel initialisé par la fonction TravelAssociations() :
Code :
1
2
3
4
5
6
7
8
9
10
11
' Table de chaque association : (type du voyage, ville de départ, ville d'arrivée)
' Si ces informations sont déjà sur la feuille, les lire et mettre à jour le tableau
Function TravelAssociations() As Variant
    TravelAssociations = Array( _
        Array("63c-1167", "ertein", "clermont ferrand"), _
        Array("67c-2841", "cavaillon", "erstein"), _
        Array("67c-1163", "clermont ferrand", "erstein"), _
        Array("55c-1284", "cavaillon", "bar le duc"), _
        Array("84c-1255", "bar le duc", "cavaillon") _
                               )
End Function
On aurait pu mettre les noms de villes en constante pour éviter d'avoir à répéter la même ville plusieurs fois dans le tableau d'association. Ce sera une évolution à faire ultérieurement. Déjà avec mes 14 lignes de déclaration de constantes, la feuille commence à être décrite.
___________________________________________________________________

Citation:
Envoyé par facteur Voir le message
je dois avouer que la réponse de MattChess me laisse sans voix
je suis débutant en VBA..
C'est bien parce que vous débutez en VBA que j'ai commenté le code de ma réponse, j'ai reconstitué la description de votre feuille alors qu'il n'y a que vous qui avez ce classeur.

Il n'y a rien de plus simple qu'une constante : nom = valeur ' Commentaire
Code :
Public Const rowPoint = 1 ' Rangée du Point de départ ou d'arrivée 
Est-ce que le résultat affiché sur la feuille de la cellule B6 à B10 est correct ?
Autrement dit le départ du voyage "63c-1167" correspondra-t-il à la ville ertein ?

Entrez dans la procédure TravelCity() en pas à pas avec le débogueur.
Ligne 17, on trouve le tableau des trajets type, départ, arrivée cité en début de message.
Vous devriez reconnaître vos propres données structurées dans un tableau initialisé par la fonction TravelAssociations().
Au type de voyage "67c-2841", on fait correspondre la ville de départ cavaillon et la ville d'arrivée erstein. C'est beaucoup plus lisible que votre imbrication de If Then Else. Tout tient sur une seule ligne.
Code :
Array("67c-2841", "cavaillon", "erstein"), _
Notez l'opérateur de continuation de ligne " _" en fin de ligne pour poursuivre la déclaration du tableau sur la ligne suivante avec une nouvelle association jusqu'à fermer la parenthèse.

Le calcul de la ligne du dernier voyage est exactement le même que le vôtre sauf que l'on n'a pas mis de constante en dur 65536 pour la rangée maximum de la colonne D mais on a demandé à Excel de faire le calcul.

Code :
    rowTravelEnd = Cells(Columns(colNational).Rows.Count, colTravel).End(xlUp).Row
Sous le débogueur, vous verrez que rowTravelEnd = 10
Il y a cinq voyages de D6 à D10. Le dernier est en ligne 10.

Reste la boucle For Next, beaucoup plus simple que la vôtre car elle ne fait qu'une dizaine de lignes à comparer aux quarante lignes dans votre procédure test2().
40 contre 15 ? Où est la complexité ?

Code :
1
2
    For indRow = rowTravelStart To rowTravelEnd
        strTravelType = Cells(indRow, colTravel)
indRow est beaucoup plus clair que votre variable i. On comprend immédiatement qu'il s'agit d'un indice de rangée qui parcourt les voyages du premier au dernier grâce à la constante de borne rowTravelStart et la variable rowTravelEnd.

On récupère le type du voyage dans strTravelType, ainsi que le point de départ ou d'arrivée strPoint.
Tout est dans les noms des variables préfixées par leur type :
  • Préfixe str pour String
  • Préfixe ind pour un indice Integer
  • Préfixe var pour Variant : un type générique capable d'accepter un Array d'Array de String.


Code :
1
2
        For indTravel = LBound(varTravel) To UBound(varTravel)
            If strTravelType = varTravel(indTravel)(indType) Then
On teste si c'est un voyage connu dans la table des associations varTravel.
  • LBound(varTravel) donne l'indice Low = minimum de la table soit 0.
  • UBound(varTravel) donne l'indice Upper = supérieur de la table soit : ...


Comme vous êtes en pas en pas dans la procédure, on peut interroger VBA.
Dans la fenêtre d'Exécution immédiate (Ctrl+G) du VBE (Visual Basic Editeur) d'Excel, copier-coller et valider par ENTER :
4
La première association étant en 0 et la dernière en 4, il y a 5 associations dans le tableau varTravel. Vous pouvez interrogez ses valeurs par exemple pour le premier élément en 0 :

Code :
? varTravel(0)(indType)
63c-1167

Code :
? varTravel(0)(indDeparture)
ertein

Code :
? varTravel(0)( indArrival)
clermont ferrand

Ce sont vos données, vos associations. C'est beaucoup plus simple que l'inextricable imbrication de vos If Then Else.

Code :
1
2
3
4
5
6
7
            If strTravelType = varTravel(indTravel)(indType) Then
                If strPoint = pointDeparture Then
                    Cells(indRow, colCity) = varTravel(indTravel)(indDeparture)
                ElseIf strPoint = pointArrival Then
                    Cells(indRow, colCity) = varTravel(indTravel)(indArrival)
                End If
            End If
Voilà l'unique test pour savoir s'il s'agit d'une ville de départ ou d'arrivée.
Dans la colonne colCity, on écrit le nom de la ville souhaitée. C'est fini.

Plutôt que rejeter a priori la solution la plus courte, la plus structurée et commentée, il faut poser des questions !
___________

En bas de ce message s'il vous a apporté des éléments de réponse pertinents, pensez également à voter en cliquant sur le bouton vert ci-dessous.
MattChess est déconnecté   Envoyer un message privé Réponse avec citation 21
Vieux 25/08/2011, 20h29   #17
Responsable
Office & Excel

 
Avatar de Pierre Fauconnier
 
Homme Pierre Fauconnier
Formateur et développeur informatique indépendant
Inscription : novembre 2003
Messages : 8 198
Détails du profil
Informations personnelles :
Nom : Homme Pierre Fauconnier
Âge : 45
Localisation : Belgique

Informations professionnelles :
Activité : Formateur et développeur informatique indépendant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 8 198
Points : 14 403
Points : 14 403
Envoyer un message via Skype™ à Pierre Fauconnier
Citation:
Très juste. J'ai déjà supprimé la constante numérique 65536 en dur dans le code.
C'est pour cela que je n'aime pas trop (heu, pas du tout, en fait) les lignes telles que:
Code :
1
2
3
4
5
varTravel = Array(Array("63c-1167", "ertein", "clermont ferrand"), _
                    Array("67c-2841", "cavaillon", "erstein"), _
                    Array("67c-1163", "clermont ferrand", "erstein"), _
                    Array("55c-1284", "cavaillon", "bar le duc"), _
                    Array("84c-1255", "bar le duc", "cavaillon"))
Si on doit modifier la liste, c'est la cata.

Il ne faut pas oublier que l'on est en Excel, donc, on peut travailler avec des plages, éventuellement transformées en tableau.

Et c'est parce que l'on est en Excel que je reviens à la charge en insistant sur une bonne conception de classeur à la base. En VBA avec Excel, il est souvent plus rentable, en terme de maintenance notamment, de placer du code VBA en appoint d'un classeur bien conçu.
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------

Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP
Vous souhaitez rédiger pour DVP? Contactez-moi
Amoureux de la langue française? Venez corriger nos ressources
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
N'oubliez pas de VOTER (en bas à droite d'un message)

---------------
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 26/08/2011, 04h13   #18
Nouveau Membre du Club
 
Inscription : avril 2007
Messages : 199
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 199
Points : 31
Points : 31
Bonjour MattChess,
J'ai archive ta reponse pour l'analyser de plus pres car je dois t'avouer qu'il me faudrait du temps pour decortique ton code .
Et merci encore a EmmanuelleC et aux autres intervenants qui m'ont beaucoup aide ..
facteur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 09h05   #19
Membre expérimenté
 
Inscription : juillet 2008
Messages : 757
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 757
Points : 545
Points : 545
Citation:
Envoyé par facteur Voir le message
je précise même que en rajoutant "else:", le code ne fonctionne pas
Code :
Else: Cells(i, 2).Formula = "=VLOOKUP(D " & i & " ,'P:\Commun\Transport Securité\Docs Madjid\[matrice.xls]matrice hermes'!R1C1:R800C3,3,0)"

Ah, j'ai trouvé je crois
Il ne faut pas de ":" apres le else, mais surtout, j'avais testé avec ma propre url. Et apres, j'ai copié collé la tienne
Tes colonnes ne sont probablement pas juste

Pour mettre une formule, tu peux utiliser .Formula ou .FormulaR1C1
Dans le premier cas, tu dois écrire les lettres des colonnes et les n° des lignes (D1 par exemple), dans le second cas, tu dois écrire le nombre de colonne et de ligne de décalage par rapport a la cellule de départ (par exemple, si ton formule est en A1 et que tu veux tenir compte de quelque chose en D1, ca va etre RC[3] : meme ligne et 3 colonnes plus loin)

Et ta formule de base mélange les deux modes, tu as
Citation:
Else Cells(i,2)= VLOOKUP(Range("D"& i),'P:\Commun\Transport Securité\Docs Madjid\[matrice.xls]matrice hermes'!R1C1:R800C3,3,0)
Il faudrait donc remplacement R1C1:R800C3 par des références avec des noms de colonnes et ca devrait rouler
EmmanuelleC est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 16h49   #20
Nouveau Membre du Club
 
Inscription : avril 2007
Messages : 199
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 199
Points : 31
Points : 31
Bonjour EmmanuelleC.

J'ai remplace le code
Code :
"=VLOOKUP(D " & i & " ,'P:\Commun\Transport Securité\Docs Madjid\[matrice.xls]matrice hermes'!R1C1:R800C3,3,0)"
par le code
Code :
"=VLOOKUP(RC[2],'P:\Commun\Transport Securité\Docs Madjid\[matrice.xls]matrice hermes'!R1C1:R800C3,3,0)"
Mais en lancant le programe, j'ai rencontré un autre soucis.
je réaffiche ton programme pour une meilleur compréhension .

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
Sub test()
 
Dim i As Integer
 
Dim d As Integer
d = Range("d" & Range("d65536").End(xlUp).Row).Row
 
 
For i = 6 To d - 1
 
 
If Range("D" & i) = "63C-1167" And Range("C1") = "ARRIVEE" Then
Cells(i, 2) = "clermont ferrand"
 
ElseIf Range("D" & i) = "63C-1167" And Range("C1") = "DEPART" Then
Cells(i, 2) = "ertein"
 
ElseIf Range("D" & i) = "67C-2841" And Range("C1") = "ARRIVEE" Then
Cells(i, 2) = "erstein"
 
ElseIf Range("D" & i) = "67C-2841" And Range("C1") = "DEPART" Then
Cells(i, 2) = "cavaillon"
 
ElseIf Range("D" & i) = "67C-1163" And Range("C1") = "ARRIVEE" Then
Cells(i, 2) = "erstein"
 
ElseIf Range("D" & i) = "67C-1163" And Range("C1") = "DEPART" Then
Cells(i, 2) = "clermont ferrand"
 
ElseIf Range("D" & i) = "55c-1284" And Range("C1") = "ARRIVEE" Then
Cells(i, 2) = "bar le duc"
 
ElseIf Range("D" & i) = "55c-1284" And Range("C1") = "DEPART" Then
Cells(i, 2) = "cavaillon"
 
ElseIf Range("D" & i) = "84c-1255" And Range("C1") = "ARRIVEE" Then
Cells(i, 2) = "cavaillon"
 
ElseIf Range("D" & i) = "84c-1255" And Range("C1") = "DEPART" Then
Cells(i, 2) = "bar le duc"
 
ElseIf Range("C" & i) = "national" Then
Cells(i, 2).Formula = "=VLOOKUP(RC[2],'P:\Commun\Transport Securité\Docs Madjid\[matrice.xls]matrice hermes'!R1C1:R800C3,3,0)"
 
Else: Cells(i, 2) = ""
 
 
End If
Next i
Ce programme fonctionne mais il bug à la ligne 42. Il s'arrete dés qu'il rencontre , dans la colonne C, la valeur d'erreur #N/A.

Un message d'erreur s'affiche : erreur d'exécution 13
Incompatibilité de type


En effet, les cellules de la colonne C , contiennent une formule qui renvoie deux type de valeurs :
1) du text dont "national"
2) l'argument erreur #N/A . Cette erreur est corrigée manuellement lorsque le programme est fini.

Je souhaiterais, si c'est possible, inserer dans la ligne 42, un code qui permetterait au programme de continuer même s'il rencontre l'argument erreur #N/A.

Merci d'avance
facteur 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 08h25.


 
 
 
 
Partenaires

Hébergement Web