Erreur de syntaxe sur Select Case/While

Bonjour à tous,

Je viens vous solliciter votre aide si possible : j'ai quelques bases en programmation et j'aimerais automatiser une tâche cependant c'est plus dur que ça en a l'air et je ne comprends pas mon erreur ; si vous pouviez m'aider.

Il s'agit d'effectuer une RechercheV en boucle pour définir des coeffs selon chaque secteur (il y a 4 secteurs).

Sub definirCoeff()

    Dim ligne_xl As Long
    Dim code_gc As Integer
    Dim article As Integer

Sheets("Conso_Mois").Select

    ligne_xl = 2

While Cells(ligne_xl, 12).Select <> ""

    Select Case code_gc
        Case Is = "NORD"
            Range("L2").Activate 'colonne des coeff
            ActiveCell.Formula = "=VLOOKUP(article,COEF!A:B, 2, FALSE)"

        Case Is = "EST"
            Range("L2").Activate
            ActiveCell.Formula = "=VLOOKUP(article,COEF!C:D, 2, FALSE)"

        Case Is = "OUEST"
            Range("L2").Activate
            ActiveCell.Formula = "=VLOOKUP(article,COEF!E:F, 2, FALSE)"

        Case Is = "SUD"
            Range("L2").Activate
            ActiveCell.Formula = "=VLOOKUP(H2,COEF!G:H, 2, FALSE)"

        Case Else
            MsgBox "Coeff terminé. Il y a eu " & ligne_xl & " coefficients mise à jour."

    End Select

    ligne_xl = ligne_xl + 1
    code_gc = Cells(ligne_xl, 5).Value
    article = Cells(ligne_xl, 8).Select

    ActiveCell.Offset(1, 0).Select

Wend

End Sub

Bonjour,

Malheureusement il n'y a pas qu'un problème de syntaxe :

Fournir le fichier KIVABIEN avec ce que tu veux faire.

A+

Salut,

Quand tu dis de fournir le fichier KIVABIEN, c’est le classeur c’est ça ? Car en l’occurrence, tout se trouve sur le même classeur mais sous différents onglets.

Pour ce que je vois là, il n'y a que la Sheets("Conso_Mois") qui soit concernée.

Donc on peut déjà essayer avec ça... après c'est à toi de voir si en supprimant les autres feuilles tu as plein de messages d'erreurs, tu fais le ménage en conséquence...

Pour préciser un peu :

article = Cells(ligne_xl, 8).Select 'ça ne veux rien dire !
article = Sheets("Conso_Mois").Cells(ligne_xl, 8).Value 'ça je peux comprendre...

A chaque fois que tu mets du select ou activate dans ton code ça ne sert à rien : Juste à rendre les choses plus confuses.

EDIT : Les ActiveTRUC c'est pareil c'est des salades

'aulieu de :
            Range("L2").Activate 'colonne des coeff
            ActiveCell.Formula = "=VLOOKUP(article,COEF!A:B, 2, FALSE)"
'mettre
            Sheets("Conso_Mois").Range("L2").Formula = "=VLOOKUP(article,COEF!A:B, 2, FALSE)"

A+

J’effectue la rechercheV sur cette feuille Conso_Mois, justement et la feuille où je récupère mes coefficients se trouve sur la feuille COEF justement : du coup c’est celle la que je dois bien définir son chemin d’accès ? Car en soi vu que c’est sur le même classeur j’ai cru comprendre qu’en mettant juste le_nom_de_la_feuille!mes_colonnes c’était bon ?

Édit : ça marche, merci je viens de voir ta précision, je vais apporter les modifications et tenir au jus.

Revoir ma réponse précédente vec les modifs.

Bonjour, salut Galopin01 !

Autre chose, la variable code_gc n'est pas initialisée au début, (= elle est donc vide) et déclenchera donc l'instruction Case Else. En plus, elle est censée contenir un nombre entier, mais tu cherches des contenu de type texte ("NORD", "OUEST", etc).

Un essai :

Sub definirCoeff()

Dim ligne_xl As Long, code_gc As String, article As Integer, LigFin As Long 'Vérifier que article est bien un (petit) nombre entier

With Sheets("Conso_Mois")
    LigFin = .Cells(Rows.Count, 12).End(xlUp).Row 'Dernière ligne non vide
    For ligne_xl = 2 To LigFin 'Boucle sur les lignes
        code_gc = .Cells(ligne_xl, 5).Value
        article = .Cells(ligne_xl, 8).Value
        Select Case code_gc
            Case "NORD"
                .Range("L2"). = Application.VLookUp(article,Sheets("COEF").Range("A:B"), 2, False)
            Case "EST"
                .Range("L2"). = Application.VLookUp(article,Sheets("COEF").Range("C:D"), 2, False)
            Case "OUEST"
                .Range("L2"). = Application.VLookUp(article,Sheets("COEF").Range("E:F"), 2, False)
            Case "SUD"
                .Range("L2"). = Application.VLookUp(article,Sheets("COEF").Range("G:H"), 2, False)
        End Select
        If ligne_xl = LigFin Then MsgBox "Coeff terminé. Il y a eu " & ligne_xl & " coefficients mise à jour."
    Next ligne_xl
End With

End Sub

Merci de vos réponses !

Du coup par rapport aux différents chemins, je viens de tous les mettre à jour : je pensais que vu que c'était situé sur le même classeur, en l'occurence c'était pas la peine de préciser l'onglet en question.

@Galopin21 Les ActiveCell, c'est la même chose également pour le ActiveCell.Offset ?

@Pedro22 Salut à toi, et merci de ton aide ; du coup je viens de définir comme tu as dis la variable code_gc, car sur mon code en effet, je l'ai déclaré juste avant que la boucle ne s'incrémente de un étant donné qu'elle a en paramètre la variable "ligne_xl".

J'ai essayé ton code également (en le décortiquant un peu histoire de comprendre un peu les nouvelles fonctions/structures par rapport au With/End With et la fonction Rows.Count (je viens de tomber sur un de tes posts qui explique cela) et dans les deux cas j'ai toujours un problème :

Dans mon programme d'origine, ça bloque au niveau du premier cas "Case Is = "UIA"" et sur ta version Pedro au niveau de quand j'affecte la case adéquate à la variable "article".

De plus, j'ai vu que dans tes Case t'as pas mis le "Is", ça change rien ? Et quelle est la différence en VB de la fonction rechercheV entre "Application.VLookup" et "VLOOKUP" tout simplement ?

Dans mon programme d'origine, ça bloque au niveau du premier cas "Case Is = "UIA"" et sur ta version Pedro au niveau de quand j'affecte la case adéquate à la variable "article".

Je n'ai pas compris... Tu as une erreur ? Tu n'obtiens pas le résultat souhaité ?

De plus, j'ai vu que dans tes Case t'as pas mis le "Is", ça change rien ?

Is est utilisé pour des comparaison mathématiques, tel que Is > 0. Pour une égalité stricte, il est inutile.

Et quelle est la différence en VB de la fonction rechercheV entre "Application.VLookup" et "VLOOKUP" tout simplement ?

Dans ta macro initiale, tu écris une formule Excel dans la cellule. Dans celle que je te propose, j'utilise la même fonction (qui n'existe pas dans VBA, donc le Application. sert à lui dire que c'est une fonction Excel) sauf que j'affecte directement le résultat dans la cellule. A la fin de la macro, tu ne verras donc aucune fonction dans ta cellule, juste le résultat de la recherche.

Attention, avec cette solution, le résultat ne change pas automatiquement, comme il peut le faire avec une fonction Excel en cas de changement l'affectant.

@Galopin21 Les ActiveCell, c'est la même chose également pour le ActiveCell.Offset ?

C'est encore pire parce que avec le offset en plus personne n'y comprend plus rien...

Au lieu de définir une cellule pour définir sa voisine autant définir directement la bonne cellule.

Je ne joindrai pas de fichier ni de proposition puisque tu n'en a pas mis : mais c'est une mauvaise habitude. Outre que ça ne nous permet pas de répondre avec précision. ça ne te permet pas de voir comment coder proprement...

Xcellus : Si tu utilises With... Autant utiliser les " . " ensuite... (devant .Cells(.Rows .Count... et .Range("L2")

Euh... formulé à la louche hein ! Parce que en l'absence de fichier je sais pas pourquoi je me fatigue...

A+

Merci de ta rapidité !

Oui, c'est ça j'ai un problème, je n'obtiens pas le résultat souhaité ; ah oui, je viens de changer "NORD" par "UIA" mais je pense pas que l'erreur vient de là :

coeff1 coeff2

Mais quand tu me dis absence de fichiers, tu veux que je te joins mon fichier excel c'est ça ? J'ai pas compris, je demande de l'iade je peux vous fournir tt les documents nécessaires

Attention, la variable article est à sortir des guillemets dans ta formule de recherche pour pouvoir être interprétée.

Range("A1").Formula = "=TaFonction(article)"
'Devient :
Range("A1").Formula = "=TaFonction("&article&")"

@Galopin01, j'ai ajouté les "." omis dans mon code pour que l'utilisation de With ait du sens.

Voici mon fichier en question.

Je viens de modifier aussi l'appel de la "variable".

Et oui, j'ai compris que avec l'instruction With, ça permettait d'éviter d'écrire toujours tout le chemin du fichier en question.

3calcul-coeff.xlsm (160.70 Ko)

Bonjour,

Une Solution :

Sub definirCoeff()

Dim ligne As Long, CodeGc As String, article As String, LigFin As Long 'Vérifier que article est bien un (petit) nombre entier

With Sheets("Conso_Mois")
    LigFin = .Cells(.Rows.Count, 8).End(xlUp).Row 'Dernière ligne non vide
    For ligne = 2 To LigFin 'Boucle sur les lignes
        CodeGc = .Cells(ligne, 5).Value
        article = .Cells(ligne, 8).Text
        Select Case CodeGc
            Case "UIA"
                .Cells(ligne, 12) = Application.VLookup(article, Sheets("COEF").Range("A:B"), 2, False)
            Case "EST"
                .Cells(ligne, 12) = Application.VLookup(article, Sheets("COEF").Range("C:D"), 2, False)
            Case "OUEST"
                .Cells(ligne, 12) = Application.VLookup(article, Sheets("COEF").Range("E:F"), 2, False)
            Case "SUD"
                .Cells(ligne, 12) = Application.VLookup(article, Sheets("COEF").Range("G:H"), 2, False)
        End Select
        If ligne = LigFin Then MsgBox "Coeff terminé. Il y a eu " & ligne - 1 & " coefficients mise à jour."
    Next ligne
End With

End Sub

Particuièrement signalés : les points devant :

LigFin = .Cells(.Rows.Count, 8).End(xlUp).Row  '. Cells et .RowsCount
'et devant :
.Cells(ligne, 12)

ainsi que article qui ne peut être qu'un String. De plus les string n'ont pas de Value

article = .Cells(ligne, 8).Text

Edit : J'ai viré les " _" qui m'énervent...

A+

A noter que le "." devant Rows.Count est inutile dans la mesure où cette valeur ne dépends pas de la feuille, mais de la version Excel.

Je vous remercie, c'est ce qu'il me fallait, ça marche à merveille, merci beaucoup !

J'aimerais juste comprendre à la fin du code le "If ligne = LigFin", la variable ligne s'incrémente jusqu'à ce qu'elle atteint la variable LigFin et le -1 correspond à l'entête de la colonne H ?

@Pedro22 J'utilise actuellement la version 2016 de Excel

J'aimerais juste comprendre à la fin du code le "If ligne = LigFin"

Cette instruction permet d'afficher le message uniquement au dernier tour de la boucle, et pas à chaque passage.

...le -1 correspond à l'entête de la colonne H ?

Comme la boucle débute à la ligne 2, il faut effectivement retirer 1 à la variable ligne pour en déduire le nombre réel de coefficients mis à jour.

@Pedro22 J'utilise actuellement la version 2016 de Excel

Le code est générique pour toutes les versions. Depuis Excel 2007, Rows.Count (qui correspond au nombre max de lignes d'une feuille) est de 1 048 576. Il était auparavant de 65 536 lignes.

Ça marche, merci de tes explications et je vous remercie encore tous les deux !

Bon courage à vous !

Rechercher des sujets similaires à "erreur syntaxe select case while"