BOUCLE

BOUCLE - VB/VBA/VBS - Programmation

Marsh Posté le 21-04-2005 à 10:17:54    

J ai un petit souci... j aimerais pouvoir selectionner les cellules B3, C3, D3, ... , Y3 avec une boucle en faisant varier donc la lettre correspondant à la colonne
 
le programme suivant conviendrait si la variable était une ligne (A6, A7, A8,..., A24)
Dim i As Long
For i = 6 To 24
Dim X as Variant
VarX = Range("A" & i)
 
mais là je voudrais une astuce similaire Range(i & 3) en quelque sorte encore faudrait il bien definir i.
 
Merci par avance.

Reply

Marsh Posté le 21-04-2005 à 10:17:54   

Reply

Marsh Posté le 21-04-2005 à 10:46:07    

En VBA je pourrais pas te dire la syntaxe ni la faisabilité, mais a priori avec une variable de type caractère, à laquelle tu ajoutes une valeur comprise entre 1 et 24, ça donnera ce que tu cherches.
 
En effet, en raisonnant selon le code ASCII, A + 1 = B, A + 2 = C, etc.
 
 
Exemple :

Soit L un caractère, défini comme "A"
Soit I un entier, défini comme 1
 
Pour tout I compris entre 1 et 24
| Changer la valeur de la colonne ((L + I)3)
FinPour


Message édité par Elmoricq le 21-04-2005 à 10:46:33
Reply

Marsh Posté le 21-04-2005 à 10:51:28    

Salut
J'avais fait un truc comme ca l'année dernière, voici le code. ( c'était fait en speed, et je ne l'ai pas regardé depuis, donc ca doit etre bien crade. C'est du VB ).
 
Function incr_col(ByVal chaine As String) As String
'fonction qui fait avancer d'une collone pour excel ( AZ -> BA )
Dim col As String
Dim texte As String
 
If col = "IV" Then
    Call MsgBox("On a atteint le bout du tableau excel", vbCritical)
    Exit Function
End If
 
If Len(chaine) = 1 Then
    If chaine = "Z" Then
        incr_col = "AA"
    Else
        incr_col = Chr(Asc(chaine) + 1)
    End If
Else
Dim premier_passage As Boolean
premier_passage = True
    For i = Len(chaine) To 1 Step -1
        c = Mid(chaine, i, 1)      
        If premier_passage = True Then
            premier_passage = False
            If c = "Z" Then
                texte = "A"
                retenue = True
            Else
                texte = Chr(Asc(c) + 1)
            End If
        Else
            If c = "Z" Then
                texte = texte & "A"
                retenu = True
            Else
                If retenue = True Then
                    texte = texte & Chr(Asc(c) + 1)
                    retenue = False
                Else
                    texte = texte & c
                End If
            End If
        End If
    Next i
    If retenu = True Then
        texte = texte & "A"
    End If    
    col = ""
    For i = Len(texte) To 1 Step -1
           col = col + Mid(texte, i, 1)
    Next i
    incr_col = col
 End If
End Function

Reply

Marsh Posté le 21-04-2005 à 11:14:39    

euh utilise putot la fonction cells
 
for I ..
  for J ...
     cells(I,J)
 
 
 
tu peux parfaitement le combiner avec range
 
range(cells(I1,J1),cells(I2,J2)).select
 

Reply

Marsh Posté le 21-04-2005 à 11:18:02    

Ca m'apprendra à répondre à un topic d'un langage que je ne connais pas. :)
La solution de Fusion_sadam est de loin la plus élégante.

Reply

Marsh Posté le 21-04-2005 à 11:28:33    

merci pour ces reponses... je n ai jamais fais de double boucle.
Comment fais tu pour selectionner par exemple les cellules B3, C3, D3,... jusqu'à la cellule Y3 de cette ligne

Reply

Marsh Posté le 27-04-2005 à 14:46:49    

pas besoin d'une double boucle :
 
 
 
for i=1 to 25
 
cells( 3,i) = .....
 
next i
 
*****
tu fais un pour de i = 1 a 25 ( ou 25 = Y dans les lettres de l'aplhabet )
 
tu change la valeur de la cellule de la ligne 3, de la colonne i ) ( ou i vaut ton nom de colonne en fait ...A,B,C,D,... )
 
tu termine le pour ...C'est un parcours dans un sens d'un vecteur en gros.

Reply

Marsh Posté le 19-05-2005 à 17:00:25    

Bjr,
J'essai de faire ceci.
Voila, le premier colonne les noms, la 2ieme colonnes les prenoms et 3 ieme colonne l'etat de candidature(Admis ou pas admis). Donc j'essai de faire un macro qui copie tous les gens qui sont admis.
Voilà ce que j'ai fait et ça plante.
For Each Cll In Sheets("Feuil1" ).Range("D2:D30" )
   If Cll.Value = "Admis" Then
         
        For i = 2 To 25
            For j = 1 To 2
             
                    Range(Cells(j, i), Cells(j + 1, i)).Select
                    Range(Cells(j + 1, i)).Activate
                    Selection.Copy
                    Range("A39" ).Select
                    ActiveSheet.Paste
                    ActiveSheet.Paste
                    Application.CutCopyMode = False
             Next j
         Next i
               
     End If
Next Cll
End Sub
 
Quelqu'un peut m'aider? mes remerciements

Reply

Marsh Posté le 19-05-2005 à 17:35:48    

Voilà une macro qui fait ça sur les colonnes A,B,C
J'ai pas bien compris à quoi sert le "range("D2:D30" ) dans ta macro.*
 
Sub Test()
For Each o In Range("C2:C30" )
If o.Value = "Admis" Then
i = o.Row
Cells(39 + k, 1).Value = Cells(i, 1) & " " & Cells(i, 2)
k = k + 1
End If
Next
End Sub
 
Les admis sont reportés à partir de la cellules A39...
A+

Reply

Marsh Posté le 24-05-2005 à 13:27:59    

do while feuil1.cells(1,i) <>""
if feuil1.cells(3.i).value="admis" then
   feuil2.cells(1,k)=feuil1.cells(1,i)
   feuil2.cells(2,k)=feuil1.cells(2,i)
   feuil2.cells(3,k)=feuil1.cells(3,i)
   k=k+1
endif
i=i+1
loop
 
tu peux faire ça aussi ( ou un truc du meme genre)


Message édité par rours le 24-05-2005 à 13:28:23
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed