2009-09-25 5 views
1

Dans une application Windows VB.Net, je crée un objet Excel par liaison anticipée et remplit la feuille de calcul avec des lignes renvoyées par SQL.Vb.Net Excel sélection d'une ligne d'automatisation

L'intention est de permettre à l'utilisateur de sélectionner 1 ou plusieurs lignes de la feuille de calcul, de capturer l'événement de sélection, puis de récupérer toutes les données des lignes sélectionnées pour un traitement ultérieur. Je sais que ce serait simple si j'ai peuplé un datagridview avec les données SQL, mais les utilisateurs insistent sur Excel.

Bien que je l'ai cherché, je n'ai pas été en mesure de découvrir si la capture de l'événement select dans .Net est possible.

Si c'est possible, s'il vous plaît montrez-moi comment ou donnez-moi un lien vers un bon article sur ce sujet. Si non, s'il vous plaît faites le moi savoir aussi.

Merci!


Merci pour le délabré, Mike. Je vais faire d'autres recherches, maintenant que j'ai une bonne base pour commencer. Mes utilisateurs vont faire une variété de choses dans la feuille de calcul: 1) sélectionner des lignes pour un traitement ultérieur (opérations routées); peut être non contigu 2) ajouter des lignes si l'opération n'apparaît pas dans l'entrée (opérations non routées) et les sélectionner ensuite. 3) éventuellement ajouter des données de colonne (je voudrais restreindre cette fonction mais l'utilisateur est patron ....)

Je vais expérimenter mais pouvez-vous me dire comment faire la distinction entre une sélection de ligne et une sélection de colonne; c'est-à-dire les changements de sélection auxquels je veux répondre et ceux que je ne réponds pas?

Répondre

3

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. :-)

+0

Où était-ce quand j'ai eu ce problème en Juillet;) Une bonne réponse n'en reste pas moins! –

+0

@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! –

Questions connexes