"concatener" des zones et leur appliquer une fonction
Dernière réponse : dans Programmation
Bonjour à tous,
Petite question toute simple. Voila mon code
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
Petite question toute simple. Voila mon code
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
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
Autres pages sur : concatener zones appliquer fonction
Lassé par la pub ? Créez un compte
Meilleure solution
Mais qu'est-ce que tu fais ?
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 :
On arrête les maths, on reviens au VB :
Si ça, ça marche. on garde ce qui est commun (en rouge), on regarde ce qui ne l'ai pas (en bleu).
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
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 :
f(x) = 23x + 15
x : [0, 1, 2, 3] -> N
x : [0, 1, 2, 3] -> N
On arrête les maths, on reviens au VB :
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
En fait je cherche a supprimer le contenu des cellules toutes les 2 colonnes (O13
37, Q13:Q37, ..., W13:W37 (1ere zone) puis AL13:AL37, ..., AT13:AT37 (2eme zone) puis 3e, 4e zone)
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 ?
37, Q13:Q37, ..., W13:W37 (1ere zone) puis AL13:AL37, ..., AT13:AT37 (2eme zone) puis 3e, 4e zone)Citation :
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 ?
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
For i = 14 To 23 Step 2
MsgBox i
Next
Façon universelle
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
Bon, le titre me semble plus explicite que le baratin !
Tu connais la directive Union ?
Viens jouer aux échecs avec moi
Bon, ben maintenant, on fait une double boucle !
Tu connais la directive Union ?
Viens jouer aux échecs avec moi
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 !
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
Ah Zeb!
oui c'est vrai que je me suis affranchi de certaines règles basiques ..
Donc après une première reflexion je suis arrivé à
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.
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..
Citation :
ILLEGAL !!!!
oui c'est vrai que je me suis affranchi de certaines règles basiques ..
Donc après une première reflexion je suis arrivé à
qui marche pil poil comme il faut;
'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
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.
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
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..
Ça marche ?
Alors tant mieux !
Maintenant on peut pinailler.
Ben oui, quoi. On va la définir cette zone multiple :
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 :
Autre version :
Beurk.
Voici donc la fonction Union, revue et corrigéé par votre serviteur :
Et voilà le code pour Popeye :
Alors tant mieux !
Maintenant on peut pinailler.
Ben oui, quoi. On va la définir cette zone multiple :
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 :
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 :
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 :
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
Et voilà le code pour Popeye :
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
Lassé par la pub ? Créez un compte
- Contenus similaires :