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 08/09/2011, 22h12   #1
Invité régulier
 
Inscription : mai 2004
Messages : 61
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 61
Points : 7
Points : 7
Par défaut Syntaxe de répétition sur évènementiel de feuille

Bonsoir,

J'avance un peu... Voici un code qui fonctionne, mais qui ne donne pas encore tout à fait ce que je souhaite...

Pouvez-vous m'aider une fois de plus ?

Merci d'avance !!

En fait, je voudrais qu'à chaque fois que je fais une modif dans la colonne 3 les données soient mises en mémoire dans le tableau... Pour l'instant, je n'arrive qu'à mettre la dernière modif dans le tableau.

J'ai essayé de faire une boucle For Each, mais je ne m'en sort pas... Il y a peut-être une autre méthode ?

Alfred


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Private Tableau(10, 2)
Private resul, resul2 As String
 
 
Sub Worksheet_change(ByVal Target As Range)
 
'On déclare les variables ligneLong et ligneCourt
Dim ligneLong, ligneCourt
 
'Si on modifie une cellule de la colonne 3
If Target.Column = 3 Then
    'On récupère l'adresse de la cellule modifiée
    ligneLong = Target.Address
    'On coupe l'adresse pour ne garder que le numéro de la ligne
    ligneCourt = Mid(ligneLong, 4)
 
   'On met les données de la ligne modifiée dans le tableau
    i = 1
    For i = 1 To 5
        resul = "A" & ligneCourt
        resul2 = "C" & ligneCourt
        Tableau(i, 1) = Range(resul).Value
        Tableau(i, 2) = Range(resul2).Value
    Next
 
End If
 
End Sub
 
Sub BoutonClic()
 
Dim i
Dim ialpha As String
 
    'On ouvre le fichier dans lequel on veut coller les données copiées
    Workbooks.Open ThisWorkbook.Path & "\Fichier1.xls"
 
    'On restitue les données dans la feuille excel
    i = 1
    For i = 1 To 5
        ialpha = i + 40
        resul = "F" + ialpha
        resul2 = "C" + ialpha
        ActiveSheet.Range(resul).Value = Tableau(i, 1)
        ActiveSheet.Range(resul2).Value = Tableau(i, 2)
    Next
 
    Erase Tableau()
 
End Sub
Alfred23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 09h19   #2
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 685
Points : 4 685
Bonjour,

peux-tu préciser ce que tu veux ?

Cumuler les données ou... ???

sinon pour le N° de ligne, ceci suffit :

cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 09/09/2011, 14h06   #3
Invité régulier
 
Inscription : mai 2004
Messages : 61
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 61
Points : 7
Points : 7
Bonjour Ormonth,

Merci pour le Target.Row... Je m'étais bien compliqué la vie....

Désolé de ne pas avoir été clair dans ma première demande, je vais essayer de reformuler de façon plus précise.

Voici une partie de mon code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Private Tableau(10, 2)
Private resul, resul2 As String
 
 
Sub Worksheet_change(ByVal Target As Range)
 
'On déclare la variable ligneModif
Dim ligneModif
 
'Si on modifie une cellule de la colonne 'C' (N° 3)
If Target.Column = 3 Then
 
    'On récupère le numéro de ligne de la cellule modifiée
    ligneModif = Target.Row
 
   'On met les données de la ligne modifiée dans le tableau
    i = 1
'    For i = 1 To 5
        resul = "A" & ligneModif
        resul2 = "C" & ligneligneModif
        Tableau(i, 1) = Range(resul).Value
        Tableau(i, 2) = Range(resul2).Value
'    Next
 
End If
 
End Sub
Ce que fait ce bout de code :
Si une cellule de la colonne 'C' est modifiée, on récupère le n° de la ligne modifiée, et, les données des colonnes A et C de cette même ligne, sont mises en mémoire dans un tableau.

Ce que je voudrais faire :
Si on modifie plusieurs cellules de la colonne 'C', à chaque fois qu'on modifie une cellule, on ajoute les données correspondantes dans le tableau.

J'espère avoir été plus explicite...

Merci d'avance pour votre aide.

Cordialement,
Alfred
Alfred23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 16h33   #4
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Bonjour,

Peut être de cette façon ?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
Dim Tableau(1 To 10, 1 To 2)
Dim I As Integer
 
Sub Worksheet_change(ByVal Target As Range)
 
    'On déclare la variable ligneModif
    Dim ligneModif As Long
 
    'Si on modifie une cellule de la colonne 'C' (N° 3)
    If Target.Column = 3 Then
 
        'On récupère le numéro de ligne de la cellule modifiée
        ligneModif = Target.Row
 
        I = I + 1
 
        If I > 10 Then
 
            If MsgBox("La limite du tableau a été atteinte, écraser les valeurs les plus anciennes ?", vbYesNo) = vbYes Then
 
                I = 1
            Else
 
                Exit Sub
 
           End If
 
        End If
 
        'On met les données de la ligne modifiée dans le tableau
        Tableau(I, 1) = Range("A" & ligneModif).Value
        Tableau(I, 2) = Range("C" & ligneModif).Value
 
    End If
 
 
End Sub
 
Sub Test()
 
    Dim J As Integer
 
    For J = 1 To 10
        'dans la fenêtre d'exécution Ctrl+G
        Debug.Print Tableau(J, 1)
        Debug.Print Tableau(J, 2)
 
    Next J
 
End Sub
Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/09/2011, 16h51   #5
Invité régulier
 
Inscription : mai 2004
Messages : 61
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 61
Points : 7
Points : 7
Merci beaucoup Hervé, je vais essayer !

Sinon, je vais à nouveau essayer d'être plus clair parce que je ne pense pas l'avoir été dans le post précédent...

Un exemple en Français" :

Si je modifie le contenu de la cellule C15, je mets les valeurs des cellules C15 et F15 dans la ligne 1 du tableau.

Si ensuite je modifie la cellule C32, je voudrais mettre les valeurs des cellules C32 et F32 dans la ligne 2 du tableau.

Et ainsi de suite jusqu'à ce que je clique sur un bouton qui envoie toutes les valeurs mises dans le tableau vers une autre feuille excel. (cette procédure existe déjà)

Merci d'avance pour votre aide !

Alfred
Alfred23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 17h20   #6
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Re bonjour Alfred,

Tu parle des cellules en colonne C et F et dans ton code tu as les colonnes A et C ? Bon, j'ai modifié et le code que je t'ai donné fait ce que tu demande. Il y a juste un contrôle quand on arrive à 10 pour ne pas avoir l'erreur de la dimension qui n'existe pas.
Attention, Dim Tableau(1 To 10, 1 To 2) est différent de Dim Tableau( 10, 2) car dans le premier cas tu as 20 "cellules" dans le second cas tu as 30 "cellules" dans ton tableau car en VB si on ne défini pas explicitement la base du tableau, il commence à 0 :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Dim Tableau(1 To 10, 1 To 2)
Dim I As Integer
 
Sub Worksheet_change(ByVal Target As Range)
 
    'On déclare la variable ligneModif
    Dim ligneModif As Long
 
    'Si on modifie une cellule de la colonne 'C' (N° 3)
    If Target.Column = 3 Then
 
        'On récupère le numéro de ligne de la cellule modifiée
        ligneModif = Target.Row
 
        I = I + 1
 
        If I > 10 Then
 
            If MsgBox("La limite du tableau a été atteinte, écraser les valeurs les plus anciennes ?", vbYesNo) = vbYes Then
 
                I = 1
            Else
 
                Exit Sub
 
           End If
 
        End If
 
        'On met les données de la ligne modifiée dans le tableau
        Tableau(I, 1) = Range("C" & ligneModif).Value
        Tableau(I, 2) = Range("F" & ligneModif).Value
 
    End If
 
End Sub
Hervé.

Pour la récup un simple :
Code :
Worksheets("Feuil2").Range("A" & UBound(Tableau, 2) & ":B" & UBound(Tableau, 1)) = Tableau
Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 12/09/2011, 16h18   #7
Invité régulier
 
Inscription : mai 2004
Messages : 61
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 61
Points : 7
Points : 7
Merci beaucoup pour ton aide Hervé !!
Tu n'imagines pas depuis combien de temps je galère là-dessus !

J'ai encore une question : je ne trouve pas comment faire en sorte qu'une fois que les données du tableau sont envoyées vers l'autre fichier le tableau se vide.

J'ai essayé de mettre Erase Tableau() a la fin de ma deuxième sub, mais ça ne fonctionne pas.

Peux-tu me dire si il existe une instruction à mettre en début de code ? Je n'en trouve pas d'autre qu'Erase...

Merci d'avance !
Alfred

Voici le code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Dim Tableau(1 To 10, 1 To 2)
Dim I As Integer
 
 
 
Sub Worksheet_change(ByVal Target As Range)
 
    'On déclare la variable ligneModif
    Dim ligneModif As Long
 
 
    'Si on modifie une cellule de la colonne 'C' (N° 3)
    If Target.Column = 3 Then
 
        'On récupère le numéro de ligne de la cellule modifiée
        ligneModif = Target.Row
 
        I = I + 1
 
        If I > 3 Then
 
            If MsgBox("La limite du tableau a été atteinte, écraser les valeurs les plus anciennes ?", vbYesNo) = vbYes Then
 
                I = 1
            Else
 
                Exit Sub
 
            End If
 
        End If
 
        'On met les données de la ligne modifiée dans le tableau
        Tableau(I, 1) = Range("A" & ligneModif).Value
        Tableau(I, 2) = Range("C" & ligneModif).Value
 
        I = I + 1
 
    End If
 
 
 
End Sub
 
Sub BoutonClic()
 
Dim I As Integer
 
'On ouvre le fichier dans lequel on veut coller les données copiées
Workbooks.Open ThisWorkbook.Path & "\Fichier1.xls"
 
'On restitue les données dans la feuille excel
For I = 1 To UBound(Tableau, 1)
 
    With Sheets("Feuil1").UsedRange: NoDeLaDernLig = .Cells(.Rows.Count, .Columns.Count).Row: End With
 
 
    Sheets("Feuil1").Cells(NoDeLaDernLig + 1, 4).Value = Tableau(I, 1)
    Sheets("Feuil1").Cells(NoDeLaDernLig + 1, 2).Value = Tableau(I, 2)
 
    I = I + 1
 
Next I
 
Erase Tableau()
 
End Sub
Alfred23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 20h17   #8
Membre Expert
 
Homme Hervé Silve
Inscription : août 2010
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme Hervé Silve
Localisation : France

Informations forums :
Inscription : août 2010
Messages : 773
Points : 2 093
Points : 2 093
Bonsoir Alfred,

Erase vide le tableau mais ne modifie pas les dimensions donc, "Erase Tableau()" doit vider ton tableau. Une fois que tu as transférer tes données avec la proc "BoutonClic", exécute la proc ci-dessous et tu verras que dans la fenêtre d'exécution (Ctrl+G) tu n'aura que des <-> (10 fois) sans valeurs de parts et d'autres. Attention tout ton code doit être dans le module de la feuille ou alors, dans le cas contraire ton tableau doit être déclaré "Public" dans un module standard.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
Sub Test()
 
    Dim I As Integer
 
    For I = 1 To 10
 
        Debug.Print Tableau(I, 1); "<->"; Tableau(I, 2)
 
    Next I
 
End Sub
Hervé.
Theze est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h12.


 
 
 
 
Partenaires

Hébergement Web