VBA créer une boucle ???

Résolu/Fermé
bocman - 6 mars 2012 à 19:55
 titi - 7 mars 2012 à 15:46
Bonjour,
Je ne sais pas créer une boucle si quelqu'un pourrai m'aider.
En faite ce que je voudrais c'est :
la cellule Ai = la cellule Bi
si Bi = quelque chose alors Ai = bi
Sinon
"on répéate le programme"
si Bi+1 = quelque alors Ai= bi +1
...............

voici le début de mon programme

Function boucle()
If Sheets("feuil2").Range("a1").Value <> "" Then
boucle = Sheets("feuil2").Range("a1").Value
Else
If Sheets("feuil2").Range("a2").Value <> "" Then
boucle = Sheets("feuil2").Range("a2").Value
Else
If Sheets("feuil2").Range("a3").Value <> "" Then
boucle = Sheets("feuil2").Range("a3").Value
Else
If Sheets("feuil2").Range("a4").Value <> "" Then
boucle = Sheets("feuil2").Range("a4").Value
Else
If Sheets("feuil2").Range("a4").Value <> "" Then
boucle = Sheets("feuil2").Range("a4").Value
End If
End If
End If
End If
End If
End Function

Merci de m'aider


A voir également:

8 réponses

Utilisateur anonyme
6 mars 2012 à 20:55
Bonjour,

Exemple de boucle :

Sub Boucle()


    Dim Limite As Long, Boucle As Long
    
    ' Trouve la fin de la boucle
    Limite = ActiveSheet.Range("B65535").End(xlUp).Row
    
    Range("B1").Select
    
    For Boucle = 0 To Limite
        ' Si la cellule Bi est non vide (où i est représenté ici par Boucle)
        If (ActiveCell.Offset(Boucle, 0).Value <> "") Then
            ' Alors dans la cellule de gauche (Ai) affecte la valeur courante de Bi
            ActiveCell.Offset(Boucle, -1).Value = _
                ActiveCell.Offset(Boucle, 0).Value
        End If
    Next Boucle
    

End Sub


Cdt

Lupin
0
ça ne marche toujours pas
, je ne comprends pas le tiret a la fin de " ActiveCell.Offset(Boucle, -1).Value = _"
0
Utilisateur anonyme
6 mars 2012 à 21:18
re:

Le tiret veut dire [ continue avec la ligne suivante ]

l'équivalent serait :

ActiveCell.Offset(Boucle, -1).Value = ActiveCell.Offset(Boucle, 0).Value

Cdt

Lupin
0
Bonjour,

une autre solution qui copie les valeur de la colonne B dans la colonne A sans laisser de cellules vides:

Dim Derlig As Long, i As Long, j as Long      
Derlig = Range("B" & Rows.Count).End(xlUp).Row   
j=1
With  Sheets("feuil2")
For i= 1 To Derlig         
    If .Cells(i,2).Value <> " Then
         .Cells(j,1).Value= .Cells(i,2).Value
         j=j+1
    End If
Next i


Bonne suite
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
Modifié par pijaku le 7/03/2012 à 10:17
Bonjour tout le monde,

Une version qui, en cas de moultes lignes, permettra d'accélerer le timing en utilisant des variables tableaux :

Sub RegroupeEnA() 
Dim TablColB, TablColA(), i As Long, Lig As Long 

TablColB = Range("B1", Range("B" & Rows.Count).End(xlUp)) 
'ici commence le travail en mémoire... 
For i = LBound(TablColB) To UBound(TablColB) 
    If TablColB(i, 1) <> "" Then 
        ReDim Preserve TablColA(Lig) 
        TablColA(Lig) = TablColB(i, 1) 
        Lig = Lig + 1 
    End If 
Next 
'restitution
Range("A1").Resize(UBound(TablColA), 1) = Application.Transpose(TablColA) 
End Sub

Cordialement,
Franck P
0
Merci Pijaku ça marche mais serai t'il possible plutot d'avoir
Function RegroupeEnA(..................
End Function
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
7 mars 2012 à 11:44
ça marche mais serai t'il possible plutot d'avoir
Function RegroupeEnA(..................
End Function


J'ai envie de dire "Why Not?"...

Après tout dépends de ce que tu veux mettre en paramètre de cette fonction...

par exemple avec en paramètres :
- TablB : variable tableau contenant les données de ta colonne "à trous" (ici Colonne B)
- ColRestit : variable String contenant la lettre de la colonne de restitution des donénes (ici colonne A)

Sub Appel_Fonction_RegroupeEnA()
Dim TablB, ColRestit As String
'ici tu remplis la variable tableau avec les données de la colonne B
TablB = Range("B1", Range("B" & Rows.Count).End(xlUp))
'tu choisis ta colonne de restitution
ColRestit = "A"
'et tu appelles ta fonction
RegroupeEnA TablB, ColRestit
End Sub

Function RegroupeEnA(TablColB, Col As String)
Dim TablColA(), i As Long, Lig As Long

'ici commence le travail en mémoire...
For i = LBound(TablColB) To UBound(TablColB)
    If TablColB(i, 1) <> "" Then
        ReDim Preserve TablColA(Lig)
        TablColA(Lig) = TablColB(i, 1)
        Lig = Lig + 1
    End If
Next
'restitution
Range(Col & "1").Resize(UBound(TablColA), 1) = Application.Transpose(TablColA)
End Function


What else?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
7 mars 2012 à 15:13
Peut être souhaites tu réaliser une fonction personnalisée qui fonctionne dans ta feuille, sans appel par VBA.
Alors :
Function RegroupeEnA(Plage As Range, Ligne As Long)
Dim Tabl(), i As Long, Lig As Long
Dim PremLig As Long, DrLig As Long, Col As String

Col = Split(Plage.Address, "$")(1)
PremLig = Left(Split(Plage.Address, "$")(2), 1)
DrLig = Split(Plage.Address, "$")(4)
ReDim Tabl(DrLig - 1)
Lig = 0
For i = PremLig To DrLig
    If Range(Col & i).Value <> "" Then
        Tabl(Lig) = Range(Col & i).Value
        Lig = Lig + 1
    End If
Next
For i = LBound(Tabl) To UBound(Tabl)
    Debug.Print Tabl(i)
Next
RegroupeEnA = Tabl(Ligne)
End Function


Et donc dans ta feuille, il suffit de saisir en A1 :

=RegroupeEnA(B$1:B$100;LIGNE(A1)-1)

et étirer cette formule vers le bas.
Dès que tu vois un 0 tu as fini...
0
Chris 94 Messages postés 50978 Date d'inscription mardi 8 janvier 2008 Statut Modérateur Dernière intervention 17 février 2023 7 323
7 mars 2012 à 15:23
Salut,

Faut le rendre quand ?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
7 mars 2012 à 15:27
Salut Chris,

Merci de ta visite.

J'ai initialement pensé à effacer mes réponses, mais bon, ça peux toujours servir à quelqu'un, ne serait ce qu'à son prof...

A+
0
Chris 94 Messages postés 50978 Date d'inscription mardi 8 janvier 2008 Statut Modérateur Dernière intervention 17 février 2023 7 323
7 mars 2012 à 15:27
;-)
0
Merci de ta visite tu n'as que ça a faire de ta journée, ce n'est pas a rendre, c'est pour améliorer mon travail au sein de mon entreprise

Cordialement
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
7 mars 2012 à 15:39
c'est pour améliorer mon travail au sein de mon entreprise
C'est pour cela que tu créées des sujets multiples lorsque tu as une réponse???
C'est pour cela que tu ne dis mas merci lorsque le boulot t'arrives tout cuit dans le bec???

Ma question : tu n'as que ça a faire de ta journée???
0
Chris 94 Messages postés 50978 Date d'inscription mardi 8 janvier 2008 Statut Modérateur Dernière intervention 17 février 2023 7 323
Modifié par Chris 94 le 7/03/2012 à 15:40
Il n'y pas de quoi... Et vous êtes nombreux à améliorer votre travail au sein de l'entreprise ?
0
dsl pijaku le message n'était pas pour toi
0