comment fait-on pour contrôler une plage de cellule avec Cells ?

dmoluc

XLDnaute Occasionnel
Bonjour à tous

Je bloque sur une syntaxe sans doute toute simple : je veux faire une boucle pour inscrire la variable Q si la plage ligne 6 à ligne 36 n'est pas vide et tant que le compteur n'est pas égal à la durée

Voilà mon code mais je ne sais pas comment faire pour la plage avec Cells, je ne sais pas si on peu utiliser Range car la colonne varie tout le temps

Code:
Do
                Colonne = Colonne + 1
                If Application.WorksheetFunction.Sum(Cells(ligne6, ligne36, Colonne - 1)) <> 0 And compteur <= Durée Then
                Cells(Ligne, Colonne).Value = Q
                compteur = compteur + 1
                Loop

Merci pour votre aide

Cordialement

Didier
 

Staple1600

XLDnaute Barbatruc
Re : comment fait-on pour contrôler une plage de cellule avec Cells ?

Bonjour à tous

demoluc
Pour des détails sur la syntaxe avec Range et Cells, le chemin qui mène à Rome: ALT+F11 puis F1
où tu devrais trouver des choses du style
Range(Cells(1,1), Cells(1,3))

PS: Un fichier exemple peut ne pas être inutile pour aider à illustrer (puis résoudre) ton problème :rolleyes:
 
Dernière édition:

dmoluc

XLDnaute Occasionnel
Re : comment fait-on pour contrôler une plage de cellule avec Cells ?

Bonjour JM,

L'aide n'a pas fait mon bonheur, j'ai trouvé la syntaxe pour sélectionner 1, 2 ou trois cellules moi je cherche à en vérifier 30, ça va faire un peu long comme code.
j'ai essayé de reproduire le code sur un petit fichier, sinon je mets le lien du fichier original ; le code se trouve UserForm5, Onglet Déboursé et tâche, bouton renseigner le planning, vers la fin du code
http://cjoint.com/?3Hspyc9Rl7t

merci pour votre aide

cordialement
 

Pièces jointes

  • essais.xlsm
    16.1 KB · Affichages: 66
  • essais.xlsm
    16.1 KB · Affichages: 60
  • essais.xlsm
    16.1 KB · Affichages: 72

Staple1600

XLDnaute Barbatruc
Re : comment fait-on pour contrôler une plage de cellule avec Cells ?

Re


Je ne comprends pas ce que tu veux faire avec ce code
Quel drôle de Q que voilà !
Et où sont tes Dim ?
Code:
Sub essais()
Range("A1").Value = "essais"
ligne = Range("A36").End(xlUp).Row
colone = Cells(ligne, 1).End(xlToRight).Column
compteur = 1
                colonne = colonne + 1
                If Application.WorksheetFunction.Sum.Range(Cells(ligne, colonne - 1), Cells(36, colonne + 1)) <> 0 Then
                ligne = 37
                Do
                Cells(ligne, colonne).Value = Q
                compteur = compteur + 1
                Loop
                End If
End Sub

Tu pourrais donner plus de détails ou mettre dans ta PJ
Ce que tu as AVANT ta macro
Et le résultat à obtenir APRES l’exécution de la macro.

Merci d'avance.
 

dmoluc

XLDnaute Occasionnel
Re : comment fait-on pour contrôler une plage de cellule avec Cells ?

je vais essayer d'expliquer un peu

je fais tout un tas de calcul avec un UserForm et avec je renseigne un diagramme de gant

première partie du code je format sous condition la colonne quantité

Code:
Private Sub CommandButton10_Click()

With Sheets("Programme des travaux")

Dim L As Long, C As Long
C = 4
L = Range("A36").End(xlUp).Row
Cells(L, C).Value = TextBox85.Value
Unload UserForm1
With Cells(L, C)
ActiveSheet.Unprotect
If ListBox35 = "M²" Then
.NumberFormat = "#,##0.00 ""M²"""
End If
If ListBox35 = "M³" Then
.NumberFormat = "#,##0.0 ""M³"""
End If
If ListBox35 = "Forfait" Then
.NumberFormat = "#,##0 ""F"""
End If
If ListBox35 = "ML" Then
.NumberFormat = "#,##0.0 ""ML"""
End If
If ListBox35 = "Unitée" Then
.NumberFormat = "#,##0 ""Unt."""
End If
If ListBox35 = "Tonne" Then
.NumberFormat = "#,##0.0 ""T"""
End If
If ListBox35 = "Kg" Then
.NumberFormat = "#,##0 ""Kg"""
End If
If ListBox35 = "Litre" Then
.NumberFormat = "#,##0 ""L"""
End If
End With

Deuxième partie, je colore la zone graphique et c'est pas simple avec les weekend et jour férié, j'aurai aussi voulu mettre la même couleur de police que celle du remplissage de cellule en même temps mai je n'y arrive qu'en 2 fois, enfin ça marche c'est le principal

Code:
Dim W As String
Dim K As String
Dim P As String
Dim Début As Date
Dim J As Double
Dim F As Date
Dim compteur As Double
Dim x As Range
Dim Ligne
Dim Colonne
Début = DTPicker1.Value
Dim Valeur As Double, Durée As Double

For i = 6 To 36
 Durée = CDbl(TextBox113.Value)
 Sheets("Feuil1").Range("A17") = Durée
If Range("A" & i) = "" And _
       Range("A" & i - 1) <> "" Then
    J = 0
    J = (Durée * 2)
    Ligne = 5
    Colonne = Application.Match(Me.DTPicker1 * 1, Rows(5))
    If Me.ToggleButton3 = False Then
    ActiveSheet.Cells(Ligne, Colonne).Offset(i - 6, 0) = 1
    End If
    
    If Me.ToggleButton3 = True Then
    ActiveSheet.Cells(Ligne, Colonne).Offset(i - 6, 1).Select
    ActiveCell.Offset(0, -1) = 1
    End If
    
    If Durée = 0.5 Then
        Range("ZZ" & i - 1).End(xlToLeft).Select
Dim rng As Range: Set rng = Selection
 With rng
 .Interior.Color = showcolor
 .Font.Color = showcolor
 End With
        Exit Sub
End If
   
     compteur = 1
    
    While compteur < J
        compteur = compteur + 1
        F = Range("ZZ" & i - 1).End(xlToLeft).Offset(-1 * (i - 6), 0)
        P = Range("ZZ" & i - 1).End(xlToLeft).Offset(-1 * (i - 6), 7)
        Range("ZZ" & i - 1).End(xlToLeft).Offset(0, 1) = 1
        W = WeekdayName(Weekday(F))
        K = WeekdayName(Weekday(F))
        
        If W = "samedi" And compteur < J Then
            Range("zz" & i - 1).End(xlToLeft).Select
            Range(ActiveCell, ActiveCell.End(xlToLeft)).Select

 Set rng = Selection
 With rng
 .Interior.Color = showcolor
 .Font.Color = showcolor
 End With
         
            MsgBox "La tâche n'est pas achevée !", vbOKOnly
            If Range("ZZ" & i - 1).End(xlToLeft).Offset(-1 * (i - 6), 5).Interior.Color = 255 Then
            Range("ZZ" & i - 1).End(xlToLeft).Offset(0, 7) = 1
            End If
            Range("ZZ" & i - 1).End(xlToLeft).Offset(0, 5) = 1
        End If
        If W = "samedi" And compteur = J Then
            Range("zz" & i - 1).End(xlToLeft).Select
            Range(ActiveCell, ActiveCell.End(xlToLeft)).Select
            Set rng = Selection
 With rng
 .Interior.Color = showcolor
 .Font.Color = showcolor
 End With
            Exit Sub
        End If
        Range("ZZ" & i - 1).End(xlToLeft).Offset(0, 1).Select
        If ActiveCell.Interior.Color = 255 And compteur < J Then
            Range("zz" & i - 1).End(xlToLeft).Select
            Range(ActiveCell, ActiveCell.End(xlToLeft)).Select
           Set rng = Selection
 With rng
 .Interior.Color = showcolor
 .Font.Color = showcolor
 End With
            MsgBox "La tâche n'est pas achevée !", vbOKOnly
            Range("ZZ" & i - 1).End(xlToLeft).Offset(0, 3) = 1
        End If
         If ActiveCell.Interior.Color = 255 And W = "vendredi" And compteur < J Then
         Range("zz" & i - 1).End(xlToLeft).Select
            Range(ActiveCell, ActiveCell.End(xlToLeft)).Select
            Set rng = Selection
 With rng
 .Interior.Color = showcolor
 .Font.Color = showcolor
 End With
            MsgBox "La tâche n'est pas achevée !", vbOKOnly
            Range("ZZ" & i - 1).End(xlToLeft).Offset(0, 7) = 1
            End If
            
         If ActiveCell.Interior.Color = 255 And W = "jeudi" And compteur < J Then
         Pont = MsgBox("Jeudi Férié ! Voulez-Vous faire le Pont?" & vbYesNo)
         If Pont = vbYes Then
         Range("zz" & i - 1).End(xlToLeft).Select
            Range(ActiveCell, ActiveCell.End(xlToLeft)).Select
            Set rng = Selection
 With rng
 .Interior.Color = showcolor
 .Font.Color = showcolor
 End With
            MsgBox "La tâche n'est pas achevée !", vbOKOnly
            Range("ZZ" & i - 1).End(xlToLeft).Offset(0, 9) = 1
            End If
          If Pont = vbNo Then
         Range("zz" & i - 1).End(xlToLeft).Select
            Range(ActiveCell, ActiveCell.End(xlToLeft)).Select
             Set rng = Selection
 With rng
 .Interior.Color = showcolor
 .Font.Color = showcolor
 End With
            MsgBox "La tâche n'est pas achevée !", vbOKOnly
            Range("ZZ" & i - 1).End(xlToLeft).Offset(0, 3) = 1
            End If
           End If
            
        Range("ZZ" & i - 1).End(xlToLeft).Offset(0, 7).Select
        If ActiveCell.Interior.Color = 255 And K = "mardi" And compteur < J Then
         Pont = MsgBox("Mardi Férié ! Voulez-Vous faire le Pont?" & vbYesNo)
         If Pont = vbYes Then
         Range("zz" & i - 1).End(xlToLeft).Select
            Range(ActiveCell, ActiveCell.End(xlToLeft)).Select
             Set rng = Selection
 With rng
 .Interior.Color = showcolor
 .Font.Color = showcolor
 End With
            MsgBox "La tâche n'est pas achevée !", vbOKOnly
            Range("ZZ" & i - 1).End(xlToLeft).Offset(0, 9) = 1
            End If
          If Pont = vbNo Then
         Range("zz" & i - 1).End(xlToLeft).Select
            Range(ActiveCell, ActiveCell.End(xlToLeft)).Select
            Set rng = Selection
 With rng
 .Interior.Color = showcolor
 .Font.Color = showcolor
 End With
            MsgBox "La tâche n'est pas achevée !", vbOKOnly
            Range("ZZ" & i - 1).End(xlToLeft).Offset(0, 5) = 1
            End If
            End If
         
        If ActiveCell.Interior.Color = 255 And compteur = J Then
        Range("zz" & i - 1).End(xlToLeft).Select
            Range(ActiveCell, ActiveCell.End(xlToLeft)).Select
            Set rng = Selection
 With rng
 .Interior.Color = showcolor
 .Font.Color = showcolor
 End With
            End If
    Wend
    Range("zz" & i - 1).End(xlToLeft).Select
    Range(ActiveCell, ActiveCell.End(xlToLeft)).Select
    Set rng = Selection
 With rng
 .Interior.Color = showcolor
 .Font.Color = showcolor
 End With
End If
Next i
enfin troisième et dernière partie
suivant le graphique du dessus, c'est à dire si j'ai mis 1 dans les cellules du graphique pour les colorées. Je renseigne trois zones, personnels, matériels et fournitures qui doivent bien sur correspondre à la tâche
Tout cela à été calculer sur l'userform, le plus dur reste à le mettre au bon endroit sur la feuille, c'est donc là qu'intervient la sommesi au lieu de recommencer le processus de selection comme pour les couleurs ; ça m'a sembler plus simple et plus rapide. S'il y a un 1 dans la dernière ligne remplie de la zone de graphique alors j'inscrit ma quantité journalière

Bon je sais avec mes modestes connaissances en vba j'ai surtout fait une usine à gaz :(

Code:
Dim z As Long
Dim Q As Double
Dim A

 For i = 11 To 34
 For z = 115 To 137
        Select Case i
        Case 11 To 16
           Select Case z
           Case 115 To 120
            A = Me("ListBox" & i).Text
                If Application.CountIf(Range("A39:A45"), "=" & A) <> 0 And A <> "" And Me.Controls("TextBox" & z).Value <> "" Then
                Ligne = Application.Match(A, Columns(1), 0)
                Cells(Ligne, Colonne).Value = Q
                compteur = 1
                Colonne = Colonne + 1
                If Application.WorksheetFunction.Sum(Range("G6:G36, zz6:zz36")) <> 0 And compteur <= Durée Then
                Do
                Cells(Ligne, Colonne + 1).Value = Q
                compteur = compteur + 1
                Loop
                End If
                ElseIf Application.CountIf(Range("A39:A45"), "=" & A) = 0 And A <> "" And Me.Controls("TextBox" & z).Value <> "" Then
                Range("A45").End(xlUp).Offset(1, 0) = A
                Ligne = Range("A45").End(xlUp).Row
                Q = CDbl(Me.Controls("TextBox" & z).Value)
                Cells(Ligne, Colonne).Value = Q
            End If

          End Select
        Case 17 To 26

           Select Case z
           Case 121 To 129
            A = Me("ListBox" & i).Text
            If Application.CountIf(Range("A87:A128"), "=" & A) <> 0 And A <> "" And Me.Controls("TextBox" & z).Value <> "" Then
                Ligne = Application.Match(A, Columns(1), 0)
               Q = CDbl(Me.Controls("TextBox" & z).Value)
                Cells(Ligne, Colonne).Value = Q
                ElseIf Application.CountIf(Range("A87:A128"), "=" & A) = 0 And A <> "" And Me.Controls("TextBox" & z).Value <> "" Then
                Range("A128").End(xlUp).Offset(1, 0) = A
                Ligne = Range("A128").End(xlUp).Row
               Q = CDbl(Me.Controls("TextBox" & z).Value)
                Cells(Ligne, Colonne).Value = Q
            End If
          End Select

                Case 27 To 34
                   Select Case z
           Case 130 To 137
            A = Me("ListBox" & i).Text

              If Application.CountIf(Range("A49:A83"), "=" & A) <> 0 And A <> "" And Me.Controls("TextBox" & z).Value <> "" Then
                Ligne = Application.Match(A, Columns(1), 0)
                Q = CDbl(Me.Controls("TextBox" & z).Value)
                Cells(Ligne, Colonne).Value = Q
                ElseIf Application.CountIf(Range("A49:A83"), "=" & A) = 0 And A <> "" And Me.Controls("TextBox" & z).Value <> "" Then
                Range("A83").End(xlUp).Offset(1, 0) = A
               Ligne = Range("A83").End(xlUp).Row
               Q = CDbl(Me.Controls("TextBox" & z).Value)
               Cells(Ligne, Colonne).Value = Q
            End If
          End Select

        End Select
      
    Next z
   Next i
 
    
    
End With
Exit Sub
ETIQUETTE:

End Sub
la dernière partie du code n'est bien sur pas achevée, mais avec l'aide que tu viens de m'apporter le bout du tunel n'est pas loin...
 

dmoluc

XLDnaute Occasionnel
Re : comment fait-on pour contrôler une plage de cellule avec Cells ?

Voici le code que j'espérais achevé mais les boucles Do ne fonctionne pas, la condition sommesi ne fonctionne pas non plus car j'ai des valeur qui s'inscrivent les weekend alors que les lignes de 6 à 36 sont vides

Compliquer pour faire quelque chose de simple qui fonctionne : Mad:

Code:
 For i = 11 To 34
 For z = 115 To 137
        Select Case i
        Case 11 To 16
           Select Case z
           Case 115 To 120
            A = Me("ListBox" & i).Text
                If Application.CountIf(Range("A39:A45"), "=" & A) <> 0 And A <> "" And Me.Controls("TextBox" & z).Value <> "" Then
                Ligne = Application.Match(A, Columns(1), 0)
                Cells(Ligne, Colonne).Value = Q
                compteur = 1
                Colonne = Colonne + 1
                If Application.WorksheetFunction.Sum(Cells(Ligne, Colonne + 1), Cells(36, Colonne + 1)) <> 0 And compteur <= Durée Then
                Do
                Cells(Ligne, Colonne + 1).Value = Q
                compteur = compteur + 1
                Loop
                End If
                ElseIf Application.CountIf(Range("A39:A45"), "=" & A) = 0 And A <> "" And Me.Controls("TextBox" & z).Value <> "" Then
                Range("A45").End(xlUp).Offset(1, 0) = A
                Ligne = Range("A45").End(xlUp).Row
                Q = CDbl(Me.Controls("TextBox" & z).Value)
                Cells(Ligne, Colonne).Value = Q
                compteur = 1
                Colonne = Colonne + 1
                If Application.WorksheetFunction.Sum(Cells(Ligne, Colonne + 1), Cells(36, Colonne + 1)) <> 0 And compteur <= Durée Then
                Do
                Cells(Ligne, Colonne + 1).Value = Q
                compteur = compteur + 1
                Loop
                End If
            End If

          End Select
        Case 17 To 26

           Select Case z
           Case 121 To 129
            A = Me("ListBox" & i).Text
            If Application.CountIf(Range("A87:A128"), "=" & A) <> 0 And A <> "" And Me.Controls("TextBox" & z).Value <> "" Then
                Ligne = Application.Match(A, Columns(1), 0)
               Q = CDbl(Me.Controls("TextBox" & z).Value)
                Cells(Ligne, Colonne).Value = Q
                compteur = 1
                Colonne = Colonne + 1
                If Application.WorksheetFunction.Sum(Cells(Ligne, Colonne + 1), Cells(36, Colonne + 1)) <> 0 And compteur <= Durée Then
                Do
                Cells(Ligne, Colonne + 1).Value = Q
                compteur = compteur + 1
                Loop
                End If
                ElseIf Application.CountIf(Range("A87:A128"), "=" & A) = 0 And A <> "" And Me.Controls("TextBox" & z).Value <> "" Then
                Range("A128").End(xlUp).Offset(1, 0) = A
                Ligne = Range("A128").End(xlUp).Row
               Q = CDbl(Me.Controls("TextBox" & z).Value)
                Cells(Ligne, Colonne).Value = Q
                compteur = 1
                Colonne = Colonne + 1
                If Application.WorksheetFunction.Sum(Cells(Ligne, Colonne + 1), Cells(36, Colonne + 1)) <> 0 And compteur <= Durée Then
                Do
                Cells(Ligne, Colonne + 1).Value = Q
                compteur = compteur + 1
                Loop
                End If
            End If
          End Select

                Case 27 To 34
                   Select Case z
           Case 130 To 137
            A = Me("ListBox" & i).Text

              If Application.CountIf(Range("A49:A83"), "=" & A) <> 0 And A <> "" And Me.Controls("TextBox" & z).Value <> "" Then
                Ligne = Application.Match(A, Columns(1), 0)
                Q = CDbl(Me.Controls("TextBox" & z).Value)
                Cells(Ligne, Colonne).Value = Q
                compteur = 1
                Colonne = Colonne + 1
                If Application.WorksheetFunction.Sum(Cells(Ligne, Colonne + 1), Cells(36, Colonne + 1)) <> 0 And compteur <= Durée Then
                Do
                Cells(Ligne, Colonne + 1).Value = Q
                compteur = compteur + 1
                Loop
                End If
                ElseIf Application.CountIf(Range("A49:A83"), "=" & A) = 0 And A <> "" And Me.Controls("TextBox" & z).Value <> "" Then
                Range("A83").End(xlUp).Offset(1, 0) = A
               Ligne = Range("A83").End(xlUp).Row
               Q = CDbl(Me.Controls("TextBox" & z).Value)
               Cells(Ligne, Colonne).Value = Q
               compteur = 1
                Colonne = Colonne + 1
                If Application.WorksheetFunction.Sum(Cells(Ligne, Colonne + 1), Cells(36, Colonne + 1)) <> 0 And compteur <= Durée Then
                Do
                Cells(Ligne, Colonne + 1).Value = Q
                compteur = compteur + 1
                Loop
                End If
            End If
          End Select

        End Select
      
    Next z
   Next i
 

Discussions similaires

Réponses
7
Affichages
348

Statistiques des forums

Discussions
312 206
Messages
2 086 203
Membres
103 157
dernier inscrit
youma