Lancement automatique d'une macro en VBA
Le
meta

Bonjour,
Je sais programmer en VBA, mais un tout petit peu et les recherches sur le
net sont comme trouver une aiguille dans une botte de foin tellement il y
a - trop - d'informations.
Donc j'ai deux questions:
- Comment définit-on une variable qui me permettra de ne plus trainer comme
un boulet Sheet("Feuille") pour la moindre instruction ?
Je voudrais aussi mettre "Feuille" dans une variable.
- Plus compliqué, j'ai écrit une macro qui effectue des modifications sur
une colonne, avec le nombre de lignes de mon tableau qui est calculé par la
macro. Ca marche très bien mais je dois la lancer à la main et je voudrais
le faire automatiquement à chaque modification d'une des cellules de la
colonne. Les exemples d'actions sur changement de valeurs que j'ai trouvés
sur le net ne fonctionnent pas, j'ai du me louper quelque part. Alors si
quelqu'un pouvait me donner le bout de code qui va bien
Merci d'avance
Je sais programmer en VBA, mais un tout petit peu et les recherches sur le
net sont comme trouver une aiguille dans une botte de foin tellement il y
a - trop - d'informations.
Donc j'ai deux questions:
- Comment définit-on une variable qui me permettra de ne plus trainer comme
un boulet Sheet("Feuille") pour la moindre instruction ?
Je voudrais aussi mettre "Feuille" dans une variable.
- Plus compliqué, j'ai écrit une macro qui effectue des modifications sur
une colonne, avec le nombre de lignes de mon tableau qui est calculé par la
macro. Ca marche très bien mais je dois la lancer à la main et je voudrais
le faire automatiquement à chaque modification d'une des cellules de la
colonne. Les exemples d'actions sur changement de valeurs que j'ai trouvés
sur le net ne fonctionnent pas, j'ai du me louper quelque part. Alors si
quelqu'un pouvait me donner le bout de code qui va bien
Merci d'avance
Dim WS As Excel.Worksheet
Set WS = Sheet("Feuille")
Dim NomFeuille As String
ou bien : Dim NomFeuille$ ( $ signifie String )
NomFeuille = "Feuille"
Set WS = Sheet(NomFeuille)
La il vous faudra un module de classe, celui lié à la feuille en
question, et programmer la macro correspondant à l'événement OnChange
(à chaque modification d'une cellule de la feuille, cette macro sera
automatiquement déclenchée).
Mais c'est assez lourdingue, vu notamment la lenteur pathologique
d'exécution de VBA.
Sinon vous pouvez insérer un bouton pression (sans rapport avec la St
Patrick) qui déclenche une macro dans un module standard. A charge de
cliquer le bouton pour lancer la macro.
Si tu veux remplacer dans une procédure ceci : Sheet("Feuille")
Tu peux déclarer une variable comme ceci :
'---------------------------------
Sub Test()
Dim Sh As Worksheet
Set Sh = Sheet("Feuil1")
Msgbox Sh.name
End Sub
'---------------------------------
Si tu veux utiliser la variable Sh dans tout ton projet VBA,
Tu déclares ta variable dans le haut d'un module standard comme ceci :
Dim Sh As Worksheet
Attention, si tu choisis cette avenue, tu ne dois plus déclarer la variable
au
niveau de la procédure.
Évidemment pour que la variable soit utilisable, il faut que tu la
définisses.
Pour ce faire, tu peux utiliser cet événement dans le ThisWiorkbook qui
s'exécute à l'ouverture du classeur
'---------------------------------
Private Sub Workbook_Open()
Set Sh = Worksheets("feuil1")
End Sub
'---------------------------------
Dans l'exemple qui suit, à chaque fois que tu modifieras le contenu d'une
cellule de la colonne A, la procédure, Worksheet_Change s'exécutera.
Tu copies cette procédure dans le module de la feuille où l'action se
déroule. Il ne te reste plus qu'à modifier Range("A:A") pour la colonne
de ton application.
'-------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rg As Range, Col As Range
Set Rg = Intersect(Range("A:A"), Target)
If Not Rg Is Nothing Then
For Each Col In Rg.Columns
Call MaMacro(Col)
Next
End If
End Sub
'-------------------------------------------------
Sub MaMacro(Plage As Range)
'Exemple pour modifier la colonne de la colonne
'Diminue la largeur de la colonne par 2
Plage.ColumnWidth = Plage.ColumnWidth / 2
End Sub
'-------------------------------------------------