2016-05-10 6 views
1

J'ai selected une phrase.Faites défiler pour voir les boutons où il y a un nombre variable de boutons

1) La phrase peut varier. 2) J'ai split chaque mot de la phrase.

Le code ci-dessous crée une liste de Word array à partir de Selection.

Sub Seperate_Words() 

    Dim WrdArray() As String 

    WrdArray() = Split(Selection) 

    For i = LBound(WrdArray) To UBound(WrdArray) 
     strg = strg & vbNewLine & WrdArray(i) 
    Next i 

    MsgBox strg 

End Sub 

Maintenant, je veux ajouter un Search button devant chaque mot.

Dans chaque situation, la longueur d'une phrase change et les Userforms sont pré-spécifiés, c'est pourquoi je ne peux pas les utiliser.

l'image suivante montre comment la sortie doit être

Maintenant, problème que je suis face est l'ajout d'une barre de défilement dans le cadre qui change de manière dynamique si nécessaire.

+0

Vous pouvez utiliser UserForms. Pourquoi avez-vous besoin de créer un bouton pour chaque mot? Y a-t-il une raison spécifique? –

+0

Vous pouvez également utiliser des contrôles tels que Vue Liste. – MNS

+0

@MaciejLos avec l'aide du bouton 'search' Je vais pouvoir trouver le ticker d'un autre fichier' MS- excel'. –

Répondre

2

J'ai trouvé une solution très intéressante à ceci:

Créer un formulaire (je moi ai nommé "frmSearchForm")

Créer un cadre sur elle (le mien est "framTest")

Créer un Classmodule et nommez-le "clsUserFormEvents"

Ajouter ce code à ce:

Public WithEvents mButtonGroup As msforms.CommandButton 

Private Sub mButtonGroup_Click() 
'This is where you add your routine to do something when the button is pressed 
MsgBox mButtonGroup.Caption & " has been pressed" 'Just Example Code 
End Sub 

ensuite dans le module ThisDocument, ajoutez ce code:

Dim mcolEvents As New Collection 

Sub createButtonsOnForm() 

Dim Cmd As msforms.CommandButton 

'create instance of class 
Dim cBtnEvents As clsUserFormEvents 

'array for selection 
Dim wordArr() As String 

'get selection into array 
wordArr = Split(Selection, " ") 

Dim i As Integer 

'counter for the top position of buttons 
Dim topcounter As Integer 

topcounter = 10 

'loop through array 
For i = LBound(wordArr) To UBound(wordArr) Step 1 

    'create button 
    Set Cmd = frmSearchForm.framTest.Controls.Add("Forms.CommandButton.1", "Test") 

    'Adjust properties of it 
    With Cmd 
     .Caption = wordArr(i) 
     .Left = 100 
     .Top = topcounter 
     .Width = 50 
     .Height = 20 
    End With 

    'Instantiate Class 
    Set cBtnEvents = New clsUserFormEvents 

    'Add cmd to event in class 
    Set cBtnEvents.mButtonGroup = Cmd 

    'Add buttonevent to collection so it won't get deleted in next iteration of the loop 
    mcolEvents.Add cBtnEvents 

    'increase the top position 
    topcounter = topcounter + 25 
Next i 

'show userform 
frmSearchForm.Show 
End Sub 

Ensuite, si vous exécutez cette sous, la sélection se découpé en tableau, est créé un bouton pour chaque élément (partie de sélection comme légende) et si vous appuyez sur le bouton, la méthode à l'intérieur de la classe est appelée, où vous pouvez utiliser la propriété mButtonGroup.Caption pour obtenir la valeur du bouton.

Exemple:

J'ai choisi les mots "Test1" et "Test2", maintenant, quand je lance le sous, le formulaire s'ouvre avec 2 boutons (Test1 et Test2): ExampleImg

+0

Je vais essayer votre code et plus tôt arriver à vous si j'ai besoin d'aide –

+0

votre réponse est parfaite, mais je travaille avec des phrases comme vous le savez longue phrase résultats «bouton» qui sont hors du cadre. Comment puis-je modifier dynamiquement la 'taille' de l'image ou ajouter une barre de défilement qui peut changer dynamiquement en utilisant votre code –

+1

Une option serait de modifier le.Propriété gauche pour augmenter après environ 10 boutons et réinitialiser le topcounter, puis il crée les boutons dans une nouvelle colonne. Ensuite, vous devez ajouter la largeur d'un bouton à la dernière colonne et définir cette valeur comme largeur pour le cadre et la forme. – gizlmo