For each cell in...

thierry.bayard

XLDnaute Junior
Bonjour,

Je rame encore avec le fonctionnement des boucles (et plus généralement avec VBA que je n'utilise pas assez...).

Dans le fichier joint, je souhaite compléter certaines lignes des colonnes G à R avec des fonctions que j'écrirais par la suite.
Dans l'exemple actuel, je voudrais que Excel écrive "Ma formule" dans les colonnes G à R uniquement si la colonne C contient "N-1" et la colonne D "Journées".

Voici le code auquel je pensais mais qui doit être bourré d'erreur puisque la boucle ne se lance visiblement pas... :
Code:
Sub actu_N1_activité()

    Dim zone As Range
    Dim lig As Integer


    With Sheets("Activité")
        Set zone = .Range("G2:R" & Range("D1").End(xlDown).Row)
    
    
    'zone.Select
    
    For Each Cell In zone
        lig = Cells.Row
        If Cell(lig, "C").Value = "N-1" Then
            If Cell(lig, "D").Value = "Journées" Then
                Cell.Value = "Ma formule"
                Else
            End If
            Else
        End If
    Next
    
    End With

End Sub

Pouvez-vous me donner des pistes de travail afin que j'améliore ce code ?

Merci d'avance

Thierry B
 

Pièces jointes

  • Extrait exceldownload.xlsm
    21.2 KB · Affichages: 50

Efgé

XLDnaute Barbatruc
Re : For each cell in...

Bonjour thierry.bayard

Avec ce que j'ai compris.
J'ai changé ta variable Cell en C pour que tu vois plus facilement la différence entre C et Cells
VB:
Sub actu_N1_activité()
Dim zone As Range
Dim lig As Long
Dim C As Range
With Sheets("Activité")
    Set zone = .Range("G2:R" & .Range("D1").End(xlDown).Row) '.Range(..; Sinon il n'est pas utilisé avec la feuille Activité mais avec la feuille active
End With
For Each C In zone
    lig = C.Row
    If Cells(lig, "C").Value = "N-1" Then
        If Cells(lig, "D").Value = "Journées" Then
            C.Value = "Ma formule"
        'Else 'Else veux dire sinon, comme sinon rien, alors c'est inutile
        End If
        'Else 'Même chose
    End If
Next
End Sub
Cordialement
 
Dernière édition:

camarchepas

XLDnaute Barbatruc
Re : For each cell in...

Bonjour Efge , Thierry , [

Une variante

Code:
Sub actu_N1_activité()

Dim zone As Range
Dim lig As Long

Set zone = Sheets("Feuil1").Range("G2:R" & Range("D1").End(xlDown).Row)
   
   For Each Cell In zone.Cells
        lig = Cell.Row
        If Cells(lig, "C").Value = "N-1" And Cells(lig, "D").Value = "Journées" Then Cell.Value = "Ma formule"
   Next
    
End Sub
 

thierry.bayard

XLDnaute Junior
Re : For each cell in...

Merci beaucoup à tous les 2.

Je viens de tester la méthode de Efgé, elle fonctione très bien.
J'avais effectivement un blocage dans la déclaration de ma zone : je n'avais pas pensé à mettre le . devant Range.

Si je peux abuser de vos connaissances, j'aurais une demande supplémentaire. C'est un point sur lequel je bloque régulièrement mais je n'ai jamais trouvé de réponse : dans mon code, je veux que les cellules soient compléter avec le résultat d'une fonction sommeprod. Je m'apprête par conséquent à utiliser un trux que vous avez probablement en horreur : le formulaR1C1, puis de figer les valeurs avec un copier / collage valeur... En gros, tous sauf du code propre.
Comment est-il posible d'éviter cela ? Je ne parviens pas à traduire les fonctions Excel avec beaucoup d'arguments en language VBA...

Merci encore pour votre aide
 

Efgé

XLDnaute Barbatruc
Re : For each cell in...

Bonjour thierry.bayard, Bonjour camarchepas :)

...Je viens de tester la méthode de Efgé, elle fonctione très bien...

La proposition de camarchepas donne le même résultat avec un code mieux présenté ;-)

... Je ne parviens pas à traduire les fonctions Excel avec beaucoup d'arguments en language VBA...

Si tu veux utiliser une formule, il faut faire (dans mon exemple) : C.FormulaLocal = "Ma formule en français".
Par exemple : C.FormulaLocal = "=MAX($A$2:$A$5)" où tu peux remplacer les lignes par une variable
C.FormulaLocal ="=MAX($A$" & C.Row+1 & ":$A$" & C.Row + 3 & ")"

Enfin bref, sans ta formule nous n'irons pas très loin.

Cordialement
 

thierry.bayard

XLDnaute Junior
Re : For each cell in...

Merci Efgé,

Effectivement, j'ai finalement opté pour le code de camarchepas.
Pour la formule, j'ai finalement ouvert une autre discussion avec des éléments plus précis.

Merci beaucoup pour ton aide, tu as débloqué ma situation.

Bonne journée
 

Discussions similaires

Réponses
1
Affichages
168
Réponses
0
Affichages
153

Statistiques des forums

Discussions
312 239
Messages
2 086 495
Membres
103 236
dernier inscrit
Menni