Résolu "concatener" des zones et leur appliquer une fonction

  • Auteur de la discussion popeyem
  • Date de début

popeyem

Habitué
Bonjour à tous,

Petite question toute simple. Voila mon code
[cpp]Private Sub CommandButton2_Click()
Dim i As Integer
'effacer les pourcentages apparus
For i = 14 To 23
i = i + 1
Range(Cells(13, i), Cells(37, i)).ClearContents
Next
End Sub[/cpp]

Je cherche à appliquer cela a 4 zones en tout (soit i=37to46, i=60to69 et i=83to92).

Pour l'instant je repète ma boucle 4 fois. Existe-t-il un moyen de "concatener" ces 4 zones pour faire une seule boucle ??

Merci à tous :)
 

batchy

Grand Maître
Moi j'en voit une : séparer la boucle dans une fonction ou un sub, dans lequel tu passe les bons arguments.

Mais je me demande si pour ce que tu fait, il n'existe pas plus simple avec Range(Cells(13,14), Cells(37, 23)).ClearContents (j'ai pas excell sous la main pour tester)
 

popeyem

Habitué
En fait je cherche a supprimer le contenu des cellules toutes les 2 colonnes (O13:O37, Q13:Q37, ..., W13:W37 (1ere zone) puis AL13:AL37, ..., AT13:AT37 (2eme zone) puis 3e, 4e zone)
Mais je me demande si pour ce que tu fait, il n'existe pas plus simple avec Range(Cells(13,14), Cells(37, 23)).ClearContents
Avec ça, tout ma zone est supprimée..

Dans une fonction je vois pas trop, je pense en arriver au meme pb, comment definir ces 4 zones pour une seule boucle ?
 

zeb

Modérateur
Code:
For i = ...
    i = ...

ILLEGAL !!!!

Tu n'as pas le droit de changer la valeur d'un indice à l'intérieur d'une boucle For. (Du moins en algorithmique. Quand tu mettras au langage C, on en reparlera).

Deux façons de faire.

Façon VB
Code:
For i = 14 To 23 Step 2
    MsgBox i
Next

Façon universelle
Code:
For i = 0 To 4
    MsgBox i * 2 + 14
Next

Je préconise la seconde forme, le VB n'étant pas le seul langage. Et pis un informaticien, un vrai, ça compte à partir de zéro, pis c'est tout :o
 

zeb

Modérateur
Autre chose
Code:
.
  A      B
0 37 -> 46
1 60 -> 69
2 83 -> 92

Donc B(i)=A(i)+1, et A(i+1) = A(i)+23, quelque soit i.

Donc :
Code:
A(i) = Cells(k * 23 + 14)
B(k) = Cells(k * 23 + 14 + 9)
B(k) = A(k).Offset(0, 9)
(Mélange Algo+VB)
 

zeb

Modérateur
Bon, le titre me semble plus explicite que le baratin !

Tu connais la directive Union ?
Viens jouer aux échecs avec moi :)
Code:
Dim ma_zone As Range
    
Set ma_zone = Union(Range("A1:A2"), Range("B3:B4"))
Set ma_zone = Union(ma_zone, Range("C5:C6"), Range("D7:D8"))
Set ma_zone = Union(ma_zone, Range("D3:D4"), Range("C1:C2"), Range("A5:A6"), Range("B7:B8"))

ma_zone.Interior.ColorIndex = 1

Bon, ben maintenant, on fait une double boucle !
Code:
Dim zone_noire As Range
Dim zone_blanche As Range

Cells.Interior.ColorIndex = xlNone

' // Union ne marche pas si une des zones est vide
Set zone_noire = Range("A1")
Set zone_blanche = Range("C1")

For i = 0 To 3
    For j = 0 To 3
        Set zone_noire = Union(zone_noire, Range(Cells(i * 4 + 1, j * 4 + 1), Cells(i * 4 + 2, j * 4 + 2)))
        Set zone_noire = Union(zone_noire, Range(Cells(i * 4 + 3, j * 4 + 3), Cells(i * 4 + 4, j * 4 + 4)))
        
        Set zone_blanche = Union(zone_blanche, Range(Cells(i * 4 + 1, j * 4 + 3), Cells(i * 4 + 2, j * 4 + 4)))
        Set zone_blanche = Union(zone_blanche, Range(Cells(i * 4 + 3, j * 4 + 1), Cells(i * 4 + 4, j * 4 + 2)))
    Next
Next
zone_noire.Interior.ColorIndex = 1
zone_blanche.Interior.ColorIndex = 2
 

popeyem

Habitué
Ah Zeb!
:lol:

oui c'est vrai que je me suis affranchi de certaines règles basiques ..

Donc après une première reflexion je suis arrivé à [cpp]'effacer les pourcentages apparus
For i = 0 To 4
Range(Cells(13, i * 2 + 15), Cells(37, i * 2 + 15)).ClearContents
Range(Cells(13, i * 2 + 38), Cells(37, i * 2 + 38)).ClearContents
Range(Cells(13, i * 2 + 61), Cells(37, i * 2 + 61)).ClearContents
Range(Cells(13, i * 2 + 84), Cells(37, i * 2 + 84)).ClearContents
Next[/cpp] qui marche pil poil comme il faut;

Mais du coup si bien parti je voulais comprendre ta logique. Pour le plateau du jeu d'echec pas trop de pb. J'ai donc essayé de condenser ces 4 lignes ci dessus.[cpp]For j = 0 To 3
Set zone = Range(Cells(13, j * 23 + 15), Cells(37, j * 23 + 23))
For Each c In zone_noire
c.ClearContents 'qqchose pour effacer toutes les 2 colonnes dans ces zones car ça, ça m'efface tout à l'intérieur
Next
Next[/cpp]
Mes zones sont bien définies mais je dois trouver qqch pour que la cellules passe de col 15 à col 17 sans effacer la 16 ...

J'espere que je suis clair.. :whistle:
 

zeb

Modérateur
Meilleure réponse
Mais qu'est-ce que tu fais ?
Code:
For i = 0 To 4
    Range(Cells(13, i * 2 + 15), Cells(37, i * 2 + 15)).ClearContents
    Range(Cells(13, i * 2 + 38), Cells(37, i * 2 + 38)).ClearContents
    Range(Cells(13, i * 2 + 61), Cells(37, i * 2 + 61)).ClearContents
    Range(Cells(13, i * 2 + 84), Cells(37, i * 2 + 84)).ClearContents
Next
Si ça, ça marche. on garde ce qui est commun (en rouge), on regarde ce qui ne l'ai pas (en bleu).

Range(Cells(13, i * 2 + xx), Cells(37, i * 2 + xx)).ClearContents

On a une suite 15, 38, 61, 84. Ben c'est une suite affine, représentable par un polynôme du premier degré, donc TRES facile à trouver :
[fixed]f(x) = 23x + 15
x : [0, 1, 2, 3] -> N[/fixed]

On arrête les maths, on reviens au VB :
Code:
For i = 0 To 4
    For j = 0 To 4
        Range(Cells(13, 2*i + 23*j + 15), Cells(37, 2*i + 23*j + 15)).ClearContents
    Next
Next
 

popeyem

Habitué
Tout simplement.
C'est ça qui me manquait hier, des idées claires !

Ceci dit je trouvais ça bien aussi de définir des zones et d'y appliquer un critère. . La simplicité mathématique l'emportera

Merci Zeb
 

zeb

Modérateur
Ça marche ? :??:
Alors tant mieux ! :)
Maintenant on peut pinailler. :o

Ben oui, quoi. On va la définir cette zone multiple :
Code:
Dim ma_zone As Range
Dim i As Long
Dim j As Long

For i = 0 To 4
    For j = 0 To 4
        Set ma_zone = Union(ma_zone, _
                            Range(Cells(13, 2 * i + 23 * j + 15), _
                                  Cells(37, 2 * i + 23 * j + 15)))
    Next
Next

ma_zone.ClearContents

Bon, comme ce crétin de VB ne sait pas ajouter RIEN à quelque chose, il faut différencier le code si la zone est encore vide ou pas :
Code:
Dim zone_globale As Range
Dim ma_zone As Range

Dim i As Long
Dim j As Long

For i = 0 To 4
    For j = 0 To 4
        
        Set ma_zone = Range(Cells(13, 2 * i + 23 * j + 15), _
                            Cells(37, 2 * i + 23 * j + 15))
                                  
        If zone_globale Is Nothing Then
            Set zone_globale = ma_zone
        Else
            Set zone_globale = Union(zone_globale, ma_zone)
        End If
    Next
Next

zone_globale.ClearContents

Autre version :
Code:
Dim zone_globale As Range

Dim i As Long
Dim j As Long

For i = 0 To 4
    For j = 0 To 4
        If zone_globale Is Nothing Then
            Set zone_globale = Range(Cells(13, 2 * i + 23 * j + 15), _
                                     Cells(37, 2 * i + 23 * j + 15))
        Else
            Set zone_globale = Union(zone_globale, _
                                    Range(Cells(13, 2 * i + 23 * j + 15), _
                                          Cells(37, 2 * i + 23 * j + 15)))
        End If
    Next
Next

zone_globale.ClearContents

Beurk.

Voici donc la fonction Union, revue et corrigéé par votre serviteur :
Code:
Function Union_X(arg1 As Range, arg2 As Range, _
                 Optional arg3  As Range, Optional arg4  As Range, Optional arg5  As Range, _
                 Optional arg6  As Range, Optional arg7  As Range, Optional arg8  As Range, _
                 Optional arg9  As Range, Optional arg10 As Range, Optional arg11 As Range, _
                 Optional arg12 As Range, Optional arg13 As Range, Optional arg14 As Range, _
                 Optional arg15 As Range, Optional arg16 As Range, Optional arg17 As Range, _
                 Optional arg18 As Range, Optional arg19 As Range, Optional arg20 As Range, _
                 Optional arg21 As Range, Optional arg22 As Range, Optional arg23 As Range, _
                 Optional arg24 As Range, Optional arg25 As Range, Optional arg26 As Range, _
                 Optional arg27 As Range, Optional arg28 As Range, Optional arg29 As Range, _
                 Optional arg30 As Range) As Range
    If arg1  Is Nothing And arg2  Is Nothing And arg3  Is Nothing And arg4  Is Nothing And _
       arg5  Is Nothing And arg6  Is Nothing And arg7  Is Nothing And arg8  Is Nothing And _
       arg9  Is Nothing And arg10 Is Nothing And arg11 Is Nothing And arg12 Is Nothing And _
       arg13 Is Nothing And arg14 Is Nothing And arg15 Is Nothing And arg16 Is Nothing And _
       arg17 Is Nothing And arg18 Is Nothing And arg19 Is Nothing And arg20 Is Nothing And _
       arg21 Is Nothing And arg22 Is Nothing And arg23 Is Nothing And arg24 Is Nothing And _
       arg25 Is Nothing And arg26 Is Nothing And arg27 Is Nothing And arg28 Is Nothing And _
       arg29 Is Nothing And arg30 Is Nothing Then
        Set Union_X = Nothing
    Else
        If arg1 Is Nothing Then
            Set Union_X = Union_X(arg2,  arg3,  arg4,  arg5,  arg6,  arg7,  arg8,  arg9, _
                                  arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, _
                                  arg18, arg19, arg20, arg21, arg22, arg23, arg24, arg25, _
                                  arg26, arg27, arg28, arg29, arg30)
        Else
            Dim u As Range
            Set u = Union_X(arg2,  arg3,  arg4,  arg5,  arg6,  arg7,  arg8,  arg9, _
                            arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, _
                            arg18, arg19, arg20, arg21, arg22, arg23, arg24, arg25, _
                            arg26, arg27, arg28, arg29, arg30)
            If u Is Nothing Then
                Set Union_X = arg1
            Else
                Set Union_X = Union(arg1, u)
            End If
        End If
    End If
End Function
:sol:

Et voilà le code pour Popeye :
Code:
Dim zone_globale As Range

Dim i As Long
Dim j As Long

For i = 0 To 4
    For j = 0 To 4
        Set zone_globale = Union(zone_globale, _
                                 Range(Cells(13, 2 * i + 23 * j + 15), _
                                      Cells(37, 2 * i + 23 * j + 15)))
    Next
Next
zone_globale.faire_quelque_chose
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 064
Membres
1 586 394
Dernier membre
Manoushk
Partager cette page
Haut