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 :

Combinaison de CountA + While ou For + If avec Variable


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Janvier 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 14
    Par défaut Combinaison de CountA + While ou For + If avec Variable
    Bonjour,

    J'ai un tableau dans lequel il faut que j'aille ligne apres ligne tester si les cellules de certaines colonnes sont vides ou non afin de noter dans la derniere colonne la valeur "National" ou "Local"

    Mon soucis est que j'ai un grand nombre de colonnes et je voudrais introduire un loop avec For ou While et une variable i.
    Pour i = 0 // je passe par la colonne C
    Pour i = 1 // je passe par la colonne G
    Pour i = 2 // je passe par la colonne K
    ...


    Voici mon code proto et mon probleme c'est qu'il prend en compte toutes les colonnes et non pas 1 sur 4. Je ne sais pas comment integrer ma variable.


    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
     
    Private Sub Revendeurs()
        Dim dl As Integer
        Dim pl As Range
        Dim t As String
        Dim i As Integer
     
             With Sheets("Store")
                 dl = .Cells(Application.Rows.Count, 1).End(xlUp).Row
                 Set pl = .Range("R:R" & dl)
             End With 'Sheets("Store")
     
    	For
    		i = 0 to 3   ' imaginons 4 colonnes, la premiere etant C
    	Next	
     
    	For Each cel In pl	
                If Application.WorksheetFunction.CountA(cel.Offset(0, -16).Resize(1, 16)) <> 1 Then
                    cel.Value = "National"
                 Else
                    t = cel.Offset(0, -16).Resize(1, 16).SpecialCells(xlCellTypeConstants).Value
                        cel.Value = "Local"
    	   End If
    	Next
    End Sub
    Mille mercis pour votre aide.

  2. #2
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Bonjour Poor Frog,

    Pour commencer, essaie de mettre ton code entre balises # et de l'indenter pour plus de visibilité.
    Je ne comprend pas bien tes explications, pourrais-tu essayer d'être un peu plus clair ?

    - Quelles colonnes dois-tu vérifier ?
    - Quelles est le critère exact : Faut-il que l'ensemble des valeurs en ligne l pour les différentes colonnes soient toutes vide , ou dès que une vide ?
    - Quelle est la dernière colonne (Pour résultat)?
    - Utilises-tu un tableau structuré ?
    - ...

    Une copie d'écran avant/ après serait aussi un plus.


    Bàt,
    Michaël

  3. #3
    Membre averti
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Janvier 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 14
    Par défaut
    Bonjour Mfoxy,

    Merci pour ta super rapide reponse.

    Voici une recopie d'ecran du tableau en question.

    Les donnees sont rentrees ligne par ligne en allant de la 1ere colonne a gauche et continuant vers la droite.

    Le test est le suivant :

    Si la colonne C est remplie alors on va voir si la colonne G est vide ou non
    Si la colonne G est vide on va inscrire dans la derniere colonne "R" Local
    Si la colonne G est non vide on va inscrire dans la derniere colonne "R" National

    Le test peut effectivement prendre fin des que la colonne G a ete checked. Et on passe a la ligne suivante

    J'espere que mes explications sont un peu plus claires

    Merci de ton aide

    Nom : CountA_For_If.gif
Affichages : 73
Taille : 34,3 Ko

  4. #4
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Re,

    Essaie ce petit bout de code dans une copie de ton fichier.
    Attention a bien modifier Sheet1 par le nom de ta feuille à traiter, et que la colonne A soit complétée pour chaque ligne ( référence a la col A pour déterminé la plage à traiter).


    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
     
    Sub test()
     
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim i As Long
    Dim Localisation As String
     
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
     
    Set wb = ThisWorkbook
    Set ws = wb.Worksheets("Sheet1") ' ! Sheet1 à modifier par le nom de la feuille
     
     With ws
      For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
      Localisation = ""
     
       Select Case True
        Case .Cells(i, 3).Value <> "" And .Cells(i, 7).Value = "" 'Cas ou C n'est pas vide et G vide
          Localisation = "Locale"
        Case .Cells(i, 3).Value <> "", .Cells(i, 7) <> ""         'Cas ou C est vide et G pas vide
          Localisation = "National"
        Case .Cells(i, 3).Value = "", .Cells(i, 7) = ""           'Cas ou C est vide et G est vide
          Localisation = "C et G vide"
        Case Else
          Localisation = "Bug"
       End Select
      .Cells(i, 18).Value = Localisation                          'On ajoute en R(i) la valeur de Localisation
      Next i
     End With
     
    Set ws = Nothing: Set wb = Nothing
     
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
     
    End Sub

  5. #5
    Membre averti
    Femme Profil pro
    Ressources humaines
    Inscrit en
    Janvier 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 14
    Par défaut
    Mfoxy,

    Cela marche à merveille

    Petite question pour être sur d'avoir tout compris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
    me mettra automatiquement a la ligne du dessous

  6. #6
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Hello,

    Content que cela fasse ton bonheur.
    la ligne de code que tu mentionnes, pourrais se traduire par

    Pour i=2 { ligne ou débute les valeurs à analyser) jusqu'à la limitie inférieure du tableau
    ... Traitement
    i suivant

    À chaque passage le i est incrémenté de 1 donc passe à la ligne suivante pour répéter le traitement et s'arrête lorsque la dernière ligne du tableau sera traitée.

    Bat,
    Michael

  7. #7
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Salut mfoxy!

    Pour ma part, je préfèrerais imbriquer 2 Select Case
    Cells(i, 7) dans Cells(i, 3)

    C'est juste mon avis

Discussions similaires

  1. [XSLT] For-each avec variable multidimensionelle
    Par pourloineus dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 05/08/2009, 11h04
  2. Boucle while ou for utilisée avec lame pour les mp3
    Par figarojuju dans le forum Linux
    Réponses: 6
    Dernier message: 09/09/2008, 21h51
  3. xsl:for-each avec un parametre pour select
    Par arnog dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 26/08/2008, 14h09
  4. [XSL] For each avec variables imbriquées
    Par Wells dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 13/05/2008, 20h28
  5. [vb.net] For Each .. avec condition
    Par arnolem dans le forum Windows Forms
    Réponses: 8
    Dernier message: 07/12/2005, 10h18

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