Vous recherchez l'événement "SelectionChange". Il y a trois événements connexes pour cela: Worksheet.SelectionChange
, Workbook.SheetSelectionChange
et Application.SheetSelectionChange
.
Je pense que pour vos besoins, en utilisant Worksheet.SelectionChange
est probablement ce que vous voulez, puisque vous savez déjà quelle feuille de calcul dans laquelle vous êtes intéressé, mais voici un exemple en utilisant tous les trois comme exemple:
Public Class ExcelEventHandlingClass
Dim WithEvents xlApp As Excel.Application
Dim WithEvents myWorkbook As Excel.Workbook
Dim WithEvents myWorksheet As Excel.Worksheet
Sub New()
xlApp = New Excel.Application
xlApp.Visible = True
myWorkbook = xlApp.Workbooks.Add
myWorksheet = CType(myWorkbook.Worksheets.Add, Excel.Worksheet)
End Sub
Private Sub xlApp_SheetSelectionChange(_
ByVal Sh As Object, _
ByVal Target As Excel.Range) _
Handles xlApp.SheetSelectionChange
MessageBox.Show(_
"xlApp_SheetSelectionChange: " & _
Target.Address(External:=True) & " was selected")
End Sub
Private Sub myWorkbook_SheetSelectionChange(_
ByVal Sh As Object, _
ByVal Target As Excel.Range) _
Handles myWorkbook.SheetSelectionChange
MessageBox.Show(_
"myWorkbook_SheetSelectionChange: " & _
Target.Address(External:=True) & " was selected")
End Sub
Private Sub myWorksheet_SelectionChange(_
ByVal Target As Excel.Range) _
Handles myWorksheet.SelectionChange
MessageBox.Show(_
"myWorksheet_SelectionChange: " & _
Target.Address(External:=True) & " was selected")
End Sub
End Class
vous pouvez exécuter ci-dessus comme suit:
Dim o As ExcelEventHandlingClass
Private Sub StartExample()
o = New ExcelEventHandlingClass
End Sub
Dans cet exemple, si vous modifiez la sélection sur la feuille de calcul active, les trois gestionnaires d'événements incendie et vous obtenez 3 boîtes de message. C'est un peu agaçant, lol, mais ça prouve le point.
Bien entendu, vous ne devez pas utiliser WithEvents
pour accrocher vos gestionnaire d'événements, vous pouvez utiliser à la place AddHandler:
AddHandler xlApp.SheetSelectionChange, AddressOf xlApp_SheetSelectionChange
AddHandler myWorkbook.SheetSelectionChange, AddressOf myWorkbook_SheetSelectionChange
AddHandler myWorksheet.SelectionChange, AddressOf myWorksheet_SelectionChange
Une fois que votre gestionnaire a appelé, il peut extraire des valeurs grâce à l'automatisation. Vous pouvez utiliser la propriété Range.Value
pour obtenir les valeurs d'une seule cellule ou renvoyer une plage de valeurs bidimensionnelle à partir d'une plage à plusieurs cellules. Bien sûr, vous pouvez simplement exécuter SQL à nouveau, une fois que vous savez quelle (s) ligne (s) vous voulez, en fonction de la sélection, mais je pensais juste que je ferais remarquer que vous pouvez extraire les valeurs de cellules directement.
Espérons que cela aide!
Mike
Edit: Mise à jour à la réponse de Melody
"! Merci beaucoup pour aider, Mike"
Aucun problème. :-)
« Je dois entrer dans la débrouille du Target.Address (externe: = True) bit Je suppose la cible contient des informations sur ce qui a été sélectionné peut vous fournir .? plus d'info? est-il encapsule une ligne ou les numéros des lignes séletionnées? est-il contient un index ou propriété d'élément qui peut être utilisé pour obtenir aux valeurs de la colonne? est-ce que l' externe = argument de vrai dire que ce provient d'un code non géré, ou est mon hypothèse incorrecte? "
C'était juste un exemple pour montrer comment signaler l'adresse de la plage qui a été sélectionnée. Regardons la signature de méthode pour le gestionnaire d'événements Worksheet.SelectionChange:
Private Sub myWorksheet_SelectionChange(_
ByVal Target As Excel.Range) _
Handles myWorksheet.SelectionChange
' Your code goes here...
End Sub
L'événement a un argument, qui est l'argument Target As Excel.Range
. (Les événements Application.SheetSelectionChange
et Workbook.SheetSelectionChange
ont un second argument indiquant sur lequel la feuille de travail le changement de sélection a eu lieu, mais dans le cas de l'événement Worksheet.Selection
de changement que nous savons déjà sur lequel la feuille de travail le changement de sélection a eu lieu, de sorte que le paramètre est omis.)
La clé est que vous pouvez utiliser l'argument Target As Excel.Range
pour déterminer ce que vous voulez. Pour obtenir l'adresse locale, qui comprend l'adresse Range, mais pas l'adresse de feuille de calcul (par exemple « A1: C3 »):
Dim localAddress As String = Target.Address
Pour obtenir l'adresse de chemin complet (par exemple, « [Book1.xls] Sheet1 A1 : C3"):
Dim localAddress As String = Target.Address(External:=True)
pour obtenir le nombre de lignes sélectionnées:
Dim numRows As Integer = Target.Rows.Count
pour obtenir l'index de ligne sur la feuille de calcul (souvenez-vous: Excel workshets utiliser la base 1 d'adressage) pour la rangée supérieure! de la gamme:
Dim topRowIndex As Integer = Target.Row
Pour obtenir l'index de ligne pour la dernière ligne:
Dim lastRowIndex As Integer = Target.Rows(Target.Rows.Count).Row
Ce ne sont que quelques exemples. Vous devrez utiliser les fichiers d'aide Excel VBA (ou Google) pour obtenir plus d'informations sur les membres de la classe Range.
En raison du congé, je ne peux pas être en mesure de vous répondre tout de suite, mais je suis reconnaissant pour l'aide.
Slacker. Je plaisante, passez un bon week-end. :-)
Où était-ce quand j'ai eu ce problème en Juillet;) Une bonne réponse n'en reste pas moins! –
@Chris: LOL, cette question était trop mois trop tard, je suppose. Vous avez eu du mal avec ça depuis juillet? Vous devriez avoir posté la question vous-même! –