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 21/09/2011, 14h41   #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 Conditionner l'utilisation d'une Sub

Bonjour à tous,

Je voudrais savoir si il est possible de faire quelque chose du type :

Code :
1
2
3
4
5
6
Sub 1
'instructions
Si Sub 2 est vraie
'instructions
fin de si[/INDENT]'instructions
End Sub
Code :
1
2
3
4
5
Sub 2
 
'instructions
 
End Sub 2
Si on peut le faire, pouvez-vous me dire quelle est la syntaxe pour la partie :

Code :
1
2
3
Si Sub 2 est vraie
'Instructions
fin de si
J'ai essayé plusieurs syntaxes et ça ne fonctionne jamais !

Merci d'avance.

Alfred
Alfred23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 14h44   #2
Membre éprouvé
 
Avatar de Runsh63
 
Homme Duc
Nihiliste
Inscription : mars 2011
Messages : 395
Détails du profil
Informations personnelles :
Nom : Homme Duc
Âge : 31
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Nihiliste
Secteur : Industrie

Informations forums :
Inscription : mars 2011
Messages : 395
Points : 419
Points : 419
Bonjour Alfred23,

Le mieux à mon avis est encore de passer par l'appel de fonctions.
__________________
Cordialement,

Runsh
Runsh63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 14h51   #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 Runsh,

Merci pour ta réponse.

Est-ce que tu peux m'en dire un peu plus sur l'appel de fonction ?

Mon code est déjà écrit et j'ai mes deux procédures ; la seconde est un BoutonClic, et je voudrais remettre une variable à zéro dans la première procédure SI la seconde procédure est exécutée.

Cordialement,
Alfred
Alfred23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 14h55   #4
Membre confirmé
 
Inscription : juillet 2007
Messages : 209
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 209
Points : 219
Points : 219
Bonjour Alfred,

Pour completer ce que dis très justement Runsh63 :
En terme d'analyse, la proposition 'Si Sub 2 est vraie' est incohérente car par nature une procédure ne renvoit rien , elle permet d'exécuter un traitement . A la limite la procédure peut mettre à jour une variable globale ( booleen dans ton cas ) .

La fonction renvoit quelquechose , elle peut renvoyer par exemple un boolean donnant la valeur d'un test.
CodeFacile est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/09/2011, 15h17   #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 pour ces explications CodeFacile !

Je vais essayer d'être plus précis dans ma demande parce que je ne sais pas si ce que je veux faire est faisable.

Voici 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
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
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
 
        'Si il y a plus de 6 lignes de modifiées
        If I = 6 Then
 
            If MsgBox("Vous avez modifié 6 lignes. Veuillez recopier ces données sinon elles seront perdues.", vbOKOnly, vbinfo) = vbOK Then
                'On met les données de la dernière ligne modifiée dans le tableau
                Tableau(I, 1) = Range("A" & ligneModif).Value
                Tableau(I, 2) = Range("C" & ligneModif).Value
 
                I = 0
                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 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)
 
Next I
 
Erase Tableau()
 
I = 0
 
 
End Sub
Et voici mon problème :
Si je modifie 6 lignes d'un coup, I est réinitialisé à zéro : tout va bien !
Mais si je modifie seulement 2 lignes et que j'envoie les données par l'intermédiaire de la procédure BoutonClic, I ne se réinitialise pas ! De fait, lorsque je modifie à nouveau des lignes, mon message apparait non pas au bout de 6 lignes modifiées, mais dès la 4ème ligne modifiée (2+4=6).
Je voudrais que mon I s'initialise à zéro chaque fois que les données sont envoyées par la procédure BoutonClic.

Cordialement,
Alfred
Alfred23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 09h37   #6
Invité régulier
 
Inscription : mai 2004
Messages : 61
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 61
Points : 7
Points : 7
Bonjour à tous !

Souhaitez-vous que je reformule ma question ou que j'apporte des précisions ? N'hésitez pas à me dire si je ne suis pas clair !

Bonne journée.

Cordialement,
Alfred
Alfred23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 10h15   #7
Expert Confirmé
 
Avatar de Godzestla
 
Homme
Chercheur de bonheur
Inscription : août 2007
Messages : 2 255
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de bonheur
Secteur : Industrie

Informations forums :
Inscription : août 2007
Messages : 2 255
Points : 2 979
Points : 2 979
Bonjour,

je ne comprend personnellement pas l'évolution de tes explications et de ta demande qui part d'une Sub avec valeur de retour à vrai pour arriver avec une variable I à remettre à 0 en cas d'appel par Bouton_clic , alors qu'à mon sens à chaque exécution de Worksheet_Change, I est remis à zéro puisqu'il est défini localement dans cette procédure.

Je t'invite à t'interroger d'abord sur ton objectif, formulable en Français sans nécessairement du code, et à répondre par une formulation aussi claire que possible de ton besoin.

Un problème mal défini où une analyse inaboutie ne conduit jamais à une solution viable.

pour ton info une appel de fonction est qqchose du type :

Code :
Function tafonction( param_1 as type_param_1, param_2 as Type_param_2, ....) as Type_fonction
et au cas où tu voudrais le tenter, Worksheet_Change est un Sub prédéfinie et ne peut pas être convertie en Fonction.

Mais .... la ruse est l'arme du persévérant...
__________________
(\ _ /) Cordialement G@dz
(='.'=)

(")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.
Godzestla est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 10h20   #8
Expert Confirmé
 
Inscription : décembre 2007
Messages : 1 908
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 1 908
Points : 3 709
Points : 3 709
C'est un problème de chevauchement : tu utilises I à la fois comme variable globale(définie pour tout ton module, en haut), et comme variable locale de bouton_clic(définie au début de bouton_clic).

Ca ne peut pas marcher. Tu dois renommer ta variable globale, par exemple I2, et utiliser I2 partout ou tu t'en sert. Un truc du genre :

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
Dim Tableau(1 To 10, 1 To 2)
Dim I2 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
 
        I2 = I2 + 1
 
        'Si il y a plus de 6 lignes de modifiées
        If I2 = 6 Then
 
            If MsgBox("Vous avez modifié 6 lignes. Veuillez recopier ces données sinon elles seront perdues.", vbOKOnly, vbinfo) = vbOK Then
                'On met les données de la dernière ligne modifiée dans le tableau
                Tableau(I2, 1) = Range("A" & ligneModif).Value
                Tableau(I2, 2) = Range("C" & ligneModif).Value
 
                I2 = 0
                Exit Sub
            End If
 
        End If
 
        'On met les données de la ligne modifiée dans le tableau
        Tableau(I2, 1) = Range("A" & ligneModif).Value
        Tableau(I2, 2) = Range("C" & ligneModif).Value
 
 
    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)
 
Next I
 
Erase Tableau()
 
I2 = 0
 
 
End Sub
non testé, il y a probablement des améliorations à faire.....


EDIT : grillé. Globalement d'accord de toutes façons, l'important est de savoir ce que l'on veut faire exactement. Et puis I et I2, c'est pas propre, mieux vaut des noms parlants, comme LigneTableau et LigneActuelle.....
__________________
Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
3)le temps de comprendre toutes les exigences, le projet est terminé
4)le temps de terminer le projet, les exigences ont changé
Et le serment de non-allégiance :
Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.
el_slapper est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h05.


 
 
 
 
Partenaires

Hébergement Web