Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/12/2011, 22h14   #1
Futur Membre du Club
 
Inscription : décembre 2008
Messages : 114
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 114
Points : 15
Points : 15
Par défaut Petite macro simple

Bonjour,
Je débute en macro et j'aimerai créer un tableau en fonction de valeurs d'un autre tableau.

Par exemple, j'ai mon tableau:
2011 | 3 | A
2012 | 5 | A
2013 | 1 | A

Et j'aimerai avoir:
2011 | A
2011 | A
2011 | A
2012 | A
2012 | A
2012 | A
2012 | A
2012 | A
2013 | A

Donc 3 fois 2011, 5 fois 2012 et 1 fois 2013. Sachant que les 3, 5 et 1 ne sont pas statique mais aléatoire.
(Et A étant la même formule du type ALEA().)

Voici mon code pour l'instant. Avec lequel j'obtiens un resultat pas super:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
Sub essai()
 
Dim temp As Integer, i As Integer, j As Integer
 
temp = 1
 
    For i = 2 To 1002
        For j = temp To Cells(i, 6)
            Cells(j + 1, 14) = Cells(i, 5)
            Cells(j + 1, 15) = Cells(2, 7)
        Next j
        temp = j
    Next i
 
Cells(2, 4) = j
 
End Sub
ziad91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 22h30   #2
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Par exemple
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dim LastLig As Long, i As Long
Dim n As Integer
 
Application.ScreenUpdating = False
With Worksheets("Feuil1")                        'A adapter
    LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
    For i = LastLig To 2 Step -1
        n = Int(Val(.Range("B" & i).Value))
        If n > 1 Then
            .Rows(i).Copy
            .Rows(i & ":" & i + n - 2).Insert
            Application.CutCopyMode = False
        End If
    Next i
    .Columns(2).Delete
End With
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/12/2011, 23h02   #3
Futur Membre du Club
 
Inscription : décembre 2008
Messages : 114
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 114
Points : 15
Points : 15
Merci pour votre réponse.
Cependant j'ai du mal à comprendre ce code, surtout les lignes 6 et 8.
Pouvez vous me l'expliquer svp.
ziad91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 23h10   #4
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Dim LastLig As Long, i As Long
Dim n As Integer
 
Application.ScreenUpdating = False
With Worksheets("Feuil1")                        'A adapter
    'N° de ligne de la dernière cellule remplie de la colonne A
    LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
    'on parcour les cellules de la colonne A du bas vers le haut
    For i = LastLig To 2 Step -1
        'n est la valeur de la cellule B (nombre de lignes à ajouter pour chaque année)
        'j'ai mis Val pour qu'il n'y aurait pas d'erreur si B n'est pas numérqiue, et Int pour prndre la partie entière
        'si tu es sûr et certain que tu as en colonne B un entier tu pourra te contenter de:
        'n = .Range("B" & i).Value
        n = Int(Val(.Range("B" & i).Value))
        'si le nombre en B est >1...
        If n > 1 Then
            .Rows(i).Copy
            .Rows(i & ":" & i + n - 2).Insert
            Application.CutCopyMode = False
        End If
    Next i
    .Columns(2).Delete
End With
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/12/2011, 00h05   #5
Futur Membre du Club
 
Inscription : décembre 2008
Messages : 114
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 114
Points : 15
Points : 15
Cool merci pour ton code. Il me reste quelques dernière questions avant de tout bien comprendre

- Tu modifie directement le tableau c'est bien ça? Si je voudrai garder mon tableau original et créer un tableau avec les années et le nombres d'occurrences, je devrais modifier la ligne 18?
- La ligne 2 sers à vider la colonne "B"?
- Et dans mon cas n peut être compris entre 0 et 16 compris. Donc dois-je enlever le If de la ligne 16 ou j'ai mal compris cette condition?
- Pour .Rows, il est indispensable de mettre le . avant le nom de la fonction?
ziad91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2011, 10h07   #6
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Tu peux copier le tableau initial vers une autre feuille et d'y appliquer le code. Si c'est dans la même feuille, on pourra proposer autrement.
Oui, la ligne 22 sert à supprimer la colonne B (C devient après suppression en B)
Non le If de la ligne 16 doit rester, car cette condition permet de savoir dans quel cas on doit ajouter des lignes identiques. (c'est dans le cas ou n > 1)
Si n=1, on a déjà une ligne, on a rien à insérer
Si n=2, on a déjà une ligne on doit ajouter une autre ligne
...etc

Rows n'est pas une fonction, fais un F1 tu sauras
Citation:
Worksheet.Rows, propriété
Cette propriété renvoie un objet Range qui représente toutes les lignes contenues dans la feuille de calcul spécifiée. Objet Range en lecture seule. Syntaxe
expression.Rows
expression Variable qui représente un objet Worksheet.
Regarde cette exemple qui utilise
Code :
1
2
3
With Worksheets("Feuil1")
'...
End With
Exemple
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub aaa()
 
With Worksheets("Feuil1")
    .Rows(1).Insert
    .Columns(2).Delete
    .Range("A1") = "TOTO"
End With
End Sub
 
Sub bbb()
 
Worksheets("Feuil1").Rows(1).Insert
Worksheets("Feuil1").Columns(2).Delete
Worksheets("Feuil1").Range("A1") = "TOTO"
End Sub
Ces 2 codes font la même chose mais le premier est plus optimisé.
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h57.


 
 
 
 
Partenaires

Hébergement Web