Question Les bases de l'exécution d'une procédure VBA dans Excel lorsqu'une cellule est modifiée


J'essaie d'afficher certaines données de mon serveur SQL dans Excel. Parce que j'ai une requête qui frappe 3 tables et utilise un paramètre, je vais devoir utiliser VBA.

Je ne suis pas sûr de savoir comment faire fonctionner le VBA "automatiquement". Faire une requête normale dans Excel vous offre des options telles que l'exécution lorsque la feuille est ouverte ou l'actualisation automatique. Comme j'ajoute un paramètre, je voudrais le Sub pour exécuter lorsque je change la valeur de la cellule dans laquelle se trouve le paramètre

Des idées?


2
2017-10-11 17:17


origine




Réponses:


Cliquez avec le bouton droit sur l'onglet de la feuille et choisissez Afficher le code. Mettez le code comme ceci dans le module de la feuille

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Address = "$A$1" Then 'only run if the correct cell is changed
        MySub 'this is the name of your vba procedure
    End If

End Sub

Ce sous-programme sera exécuté chaque fois qu'une cellule de cette feuille sera modifiée. Si la cellule qui a été modifiée est A1 (change en fonction de vos données), une procédure dans un module standard nommé MySub (modification en conséquence) sera exécutée.

Je ne sais pas pourquoi vous devez utiliser VBA. Il semble que vous puissiez écrire du code SQL pour tirer autant de tables que vous le souhaitez et inclure un paramètre.


3
2017-10-11 18:57



Les requêtes complexes ne peuvent pas utiliser les paramètres dans Excel. Juste une de ces choses que Microsoft ne pensait pas vouloir faire. - Vaccano


Mettre:

application.volatile

dans votre code.


1
2017-10-11 18:20





Par souci de clarté, je vais dire que le paramètre est dans CELL A1 et que le résultat du code VBA est répertorié dans CELL A2.

En VBA module

Function Test1(strText as string) as string
   Test1 = strText & "15"
End Function

Dans la cellule A2, placez l'équation "= Test1 (A1)
Dans la cellule A1, placez le paramètre à modifier

Je vérifierais que cela fonctionne, puis placez votre autre code VBA pour que le code soit exécuté chaque fois que A1 change.


0
2017-10-11 18:53





la réponse de dkusleika semble la meilleure; Les choses deviennent un peu plus délicates si vous voulez faire la même chose pour une gamme. Le code suivant apparaîtra chaque fois qu'une cellule de la zone spécifiée est modifiée.

Private Sub Worksheet_Change(ByVal Target As Range)

Dim woArea As Range, isect As Range
Set woArea = Sheet1.Range("A1:A500")
Set isect = Application.Intersect(Target, woArea)

If isect Is Nothing Then
    ' Nothing happens
Else
    ' Stuff you want to happen goes here
End If

End Sub

0
2017-10-11 19:03