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 :

code avec plus de 7 conditions [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    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

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 207
    Par défaut
    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?

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    791
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 791
    Par défaut
    Ton premier probleme, c'est qu'en VBA, si tu met un IF, tu as besoin d'un END IF pour le cloturer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Bonjour EmmanuelleC,

    j'ai donc repris ton exemple et cela donne à 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
    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"

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    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 : 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
    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

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 814
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 814
    Par défaut
    Là, je ferais autrement, vu le nombre de conditions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Bonjour el_slapper,

    Cà bug toujours ...

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    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 : 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
    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é.

    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
    			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é :
    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
    			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.

  9. #9
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    791
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 791
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    =VLOOKUP(D1;A:B;2;FALSE)
    En C3 je vais utiliser le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  10. #10
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    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

  11. #11
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    791
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 791
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(i,2).Formula = "=VLOOKUP(D"& i &",'P:\Commun\Transport Securité\Docs Madjid\[matrice.xls]matrice hermes'!R1C1:R800C3,3,0)"

  12. #12
    Membre Expert Avatar de rvtoulon
    Homme Profil pro
    Agent Technique
    Inscrit en
    Mars 2009
    Messages
    1 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Var (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 042
    Par défaut
    Bonjour,
    juste une remarque pour EmmnuelleC:
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    If Range("a1") = 1 Then Cells(1, 2) = "C'est un 1"

  13. #13
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    EmmanuelleC,
    N'y aurait il pas un soucis avec ton code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  14. #14
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    je précise même que en rajoutant "else:", le code ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Else: Cells(i, 2).Formula = "=VLOOKUP(D " & i & " ,'P:\Commun\Transport Securité\Docs Madjid\[matrice.xls]matrice hermes'!R1C1:R800C3,3,0)"

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    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)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  16. #16
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
        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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    ? varTravel(0)(indType)
    63c-1167

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? varTravel(0)(indDeparture)
    ertein

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  18. #18
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    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 ..

  19. #19
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    791
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 791
    Par défaut
    Citation Envoyé par facteur Voir le message
    je précise même que en rajoutant "else:", le code ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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

  20. #20
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Bonjour EmmanuelleC.

    J'ai remplace le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "=VLOOKUP(D " & i & " ,'P:\Commun\Transport Securité\Docs Madjid\[matrice.xls]matrice hermes'!R1C1:R800C3,3,0)"
    par le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "=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 : 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
    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

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [LDAP] Impossible de faire une requête avec plus de 1 condition
    Par mower666 dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 15/02/2013, 11h24
  2. Exécuter un code avec une condition
    Par herroP dans le forum VB.NET
    Réponses: 19
    Dernier message: 18/05/2012, 17h16
  3. [XL-2003] Simplifier code avec condition
    Par AMO05 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/05/2009, 12h27
  4. Code avec condition "Or"
    Par jam92400 dans le forum Access
    Réponses: 2
    Dernier message: 12/02/2007, 14h43
  5. Plus de 2 conditions avec if ?
    Par h@cker dans le forum Langage
    Réponses: 5
    Dernier message: 08/04/2006, 19h19

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