Condividi tramite

Proprietà Name, Evento Click, Funzione Find(What:=ProprietàName)

Anonimo
2018-01-23T17:08:41+00:00

Buongiorno a tutti,

su: https://www.ozgrid.com/forum/forum/help-forums/excel-general/48810-label-click-event ho trovato questo codice:

Private m_colLabels As Collection

Public ThisLabelName As String

Private Sub UserForm_Initialize()

    Dim clsLab As Class1

    Dim lngIndex As Long

    Set m_colLabels = New Collection

    For lngIndex = 1 To 4

        Set clsLab = New Class1

        Set clsLab.MyLabel = Me.Controls("Label" & lngIndex)

        m_colLabels.Add clsLab, CStr(m_colLabels.Count + 1)

    Next

End Sub 

Public WithEvents MyLabel As MSForms.Label

Private Sub MyLabel_Click()

    Me.MyLabel.Parent.ThisLabelName = Me.MyLabel.Name

' only needed for demonstration

    Me.MyLabel.Parent.Caption = "Clicked " & Me.MyLabel.Name

End Sub

Volevo modificarlo per utilizzarlo in modo diverso, ma non ci sono riuscito.

Il problema e che in un Frame ho 20 Label es: lblPippo, lblGiacomo, ecc..

In alcuni fogli ho il nome lblPippo, in altri lblGiacomo ecc.

Potete aiutarmi a capire come effettuare la ricerca (con l'uso della funzione Find), nei vari fogli

del nome lblPippo o lblGiacomo, ecc  nomi che corrispondono alla proprietà Name delle Label?

Grazie per l'aiuto.

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2018-01-23T23:17:24+00:00

Ciao Danilo,

Ma come fai!, ma!., comunque grazie mille perché ogni altro commento è inutile(ok:-)).

L'ultima, se vuoi, un piccolo commento è possibile? vorrei capire di più.

Mi hai reso per l'ennesima volta una persona felice. BRAVO.

In verità si potrebbe scrivere  un intero libro sui i moduli Classe e un altro su gli eventi di applicazione!

Tuttavia, tenendo sempre conto del mio esecrabile italiano, ci proverò a spiegare l'implementazione in questo caso.

Abbiamo creato um modulo classe e abbiamo dichiarato, al livello del modulo, un oggetto MyLabel come un controllo Label:

 

Cliccando sulla casella a discesa sinistra, possiamo selezionare la voce MyLabel

          

 A questo punto se vedrà un elenco di tutti gli eventi disponibile al nuovo oggetto MyLabel

Selezionando l'opzione Click, se crea automaticamente una procedura vuota per l'evento click del nostro nuovo oggetto MyLabel:

Volendo utilizzare l'evento click per ricercare il nome di un oggetto Label nei fogli del workbook, aggiugiamo il necessario codice:

'--------->>

Private Sub MyLabel_Click()

    Dim WB As Workbook

    Dim SH As Worksheet

    Dim Rng As Range

    Dim sStr As String

    Dim bTrovato As Boolean

    sStr = MyLabel.Name

    Set WB = ThisWorkbook

    For Each SH In WB.Sheets(Array("Foglio1", "Foglio2", "Foglio3"))

        With SH.Cells

            .Interior.ColorIndex = xlNone

            Set Rng = .Find(What:=sStr, _

                            LookIn:=xlValues, _

                            LookAt:=xlWhole, _

                            SearchOrder:=xlByRows, _

                            SearchDirection:=xlNext, _

                            MatchCase:=False)

            If Not Rng Is Nothing Then

                bTrovato = True

                Exit For

            End If

        End With

    Next SH

    If bTrovato Then

        Rng.Interior.Color = RGB(255, 0, 0)

        Call MsgBox( _

             Prompt:="Il testo " & sStr _

                     & " è stato trovato sul foglio " _

                     & SH.Name & " nella cella " _

                     & Rng.Address(0, 0), _

             Buttons:=vbInformation, _

             Title:="REPORT")

        Application.Goto Rng

    End If

End Sub

'<<=========

A questo punto abbiamo creato un oggetto MyLabel e abbiamo creato un evento click legato a questo oggetto. Tuttavia, finora, le 15 label sulla nostra Userform non sanno nulla del modulo classe, l'oggetto MyLabel o l'evento click che abbiamo appena creato. 

Quindi, torniamo ora al modulo di codice della Userform per completare il compito!

Nella procedura modulo di codice della Userform, utilizziamo la procedura UserForm_Initialize per effettuare il lovoro pendente. Pertanto, credo che sia opportuno considerare il suo codice con commenti in linea:

'=========>>

Option Explicit

Dim m_colLabels As Collection

'--------->>

Private Sub UserForm_Initialize()

    Dim clsLab As Class1

    Dim Ctrl As msforms.Control

    Set m_colLabels = New Collection

    For Each Ctrl In Me.Controls

\ Cicliamo tra tutti i controlli sulla Userform  e utilizziamo

\ la funzione TypeNameper individuare i controlli Label:

        If TypeName(Ctrl) = "Label" Then

\ Avendo individuato un controllo Label , creamouna nuova

**** \instanza del nostroClass1*:*

            Set clsLab = New Class1

\ Ora, assegniamo il controllo label che abbiamo appena

\  individuata  a questa nuova istanza del nostroClass1e,

\ quindi all’oggetto MyLabelche abbiamo creato li dentro

            Set clsLab.MyLabel = Ctrl

    \ Adesso aggiungiamo la nuova istanza delClass1 alla

\ collectionm_colLabels

            m_colLabels.Add clsLab, CStr(m_colLabels.Count + 1)

        End If

    Next Ctrl

End Sub

'<<=========

Nota che abbiamo dichiarato la collection m_colLabels al livello del modulo della Userform in modo che sia sempre accessibile alla Userform.

Sperando di non essere stato del tutto incomprensibile e di averti stuzzicato l'appetito per gli event dell'applicatione e i moduli class, per una discussione più approfondita della materia, ti consiglio la lettura dei due articoli (in inglese) Application Events  e **Introduction To Classe**s di Chip Pearson.

===

Regards,

Norman

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2018-01-23T20:15:37+00:00

Ciao Danilo,

Ciao Norman,

certo cercherò di essere più preciso. Ho un Form con un Frame e 20 Label. Ogni Label ha un nome (nella proprietà Name della Label, la Caption non mi serve poiché porta una descrizione di altro tipo) diverso. Quando clicco su una di queste Label quest'ultima deve restituirmi il nome, poiché questo nome corrisponde ad una stringa\testo che si trova in una cella del Foglio1, del Foglio2, del Foglio3 o altro foglio. Come hai ben detto mi servirebbe sfruttare l'avviso che l'oggetto Label fornisce ed effettuare una ricerca nella cartella.

Purtroppo il codice che o trovato è l'unico esempio che mi sembrava più vicino alla mia esigenza. Non ho idea di come procedere in altri modi.

Spero di essere stato più chiaro. Grazie. 

Sono a tua disposizione per altri dettagli.

Crea una Userform con 15 oggetti Label - un oggetto frame è falcoltativo.

Nel modulo di codice della Userform, incolla il seguente codice:

'=========>>

Option Explicit

Dim m_colLabels As Collection

Private Sub UserForm_Initialize()

    Dim clsLab As Class1

    Dim Ctrl As msforms.Control

    Dim lngIndex As Long

    Set m_colLabels = New Collection

    For Each Ctrl In Me.Controls

        If TypeName(Ctrl) = "Label" Then

            Set clsLab = New Class1

            Set clsLab.MyLabel = Ctrl

            m_colLabels.Add clsLab, CStr(m_colLabels.Count + 1)

        End If

    Next Ctrl

End Sub

'<<=========

Alt + IC per creare un nuovo modulo classe e nominarlo Class1

Nel modulo classe, incolla il seguente codice:

'=========>>

Option Explicit

Public WithEvents MyLabel As msforms.Label

'--------->>

Private Sub MyLabel_Click()

    Dim WB As Workbook

    Dim SH As Worksheet

    Dim Rng As Range

    Dim sStr As String

    Dim bTrovato As Boolean

    sStr = MyLabel.Name

    Set WB = ThisWorkbook

    For Each SH In WB.Sheets(Array("Foglio1", "Foglio2", "Foglio3"))

        With SH.Cells

            .Interior.ColorIndex = xlNone

            Set Rng = .Find(What:=sStr, _

                            LookIn:=xlValues, _

                            LookAt:=xlWhole, _

                            SearchOrder:=xlByRows, _

                            SearchDirection:=xlNext, _

                            MatchCase:=False)

            If Not Rng Is Nothing Then

                bTrovato = True

                Exit For

            End If

        End With

    Next SH

    If bTrovato Then

        Rng.Interior.Color = RGB(255, 0, 0)

        Call MsgBox( _

             Prompt:="Il testo " & sStr _

                     & " è stato trovato sul foglio " _

                     & SH.Name & " nella cella " _

                     & Rng.Address(0, 0), _

             Buttons:=vbInformation, _

             Title:="REPORT")

        Application.Goto Rng

    End If

End Sub

'<<=========

In un modulo standard, incolla:

'=========>>

Option Explicit

'--------->>

Public Sub Tester()

    UserForm1.Show vbModeless

End Sub

'<<=========

Potresti scaricare il mio file di prova Danilo20180123.xlsm

Per testare il codice, premi il pulsante rosa sul Foglio1.

===

Regards,

Norman

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2018-01-23T20:58:51+00:00

Ciao Danilo,

Avrei dovuto spiegare il funzionamento del codice!

Facendo clic sul pulsante rosa sul Foglio1, vedrai una semplice Userform con 15 controlli Label dentro un controllo Frame.

Facendo clic su un qualsiasi controllo label,  il codice esegui una ricerca, foglio per foglio, cercando il testo che corrisponde al nome assegnato al controllo. Trovando questo testo, si vedrà un avviso indicando il foglio su cui è stato trovato il testo e l'indirizzo della cella|:

Inoltre,  come è scritto il codice, la cella viene selezionato e il suo sfondo diventa rosso  

===

Regards,

Norman

La risposta è stata utile?

0 commenti Nessun commento

5 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2018-01-23T18:50:58+00:00

    Ciao Norman,

    certo cercherò di essere più preciso. Ho un Form con un Frame e 20 Label. Ogni Label ha un nome (nella proprietà Name della Label, la Caption non mi serve poiché porta una descrizione di altro tipo) diverso. Quando clicco su una di queste Label quest'ultima deve restituirmi il nome, poiché questo nome corrisponde ad una stringa\testo che si trova in una cella del Foglio1, del Foglio2, del Foglio3 o altro foglio. Come hai ben detto mi servirebbe sfruttare l'avviso che l'oggetto Label fornisce ed effettuare una ricerca nella cartella.

    Purtroppo il codice che o trovato è l'unico esempio che mi sembrava più vicino alla mia esigenza. Non ho idea di come procedere in altri modi.

    Spero di essere stato più chiaro. Grazie. 

    Sono a tua disposizione per altri dettagli.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2018-01-23T17:47:47+00:00

    Ciao Danilo,

    su: https://www.ozgrid.com/forum/forum/help-forums/excel-general/48810-label-click-event ho trovato questo codice:

    Private m_colLabels As Collection

    Public ThisLabelName As String

    Private Sub UserForm_Initialize()

        Dim clsLab As Class1

        Dim lngIndex As Long

        

        Set m_colLabels = New Collection

        

        For lngIndex = 1 To 4

            Set clsLab = New Class1

            Set clsLab.MyLabel = Me.Controls("Label" & lngIndex)

            m_colLabels.Add clsLab, CStr(m_colLabels.Count + 1)

        Next

        

    End Sub 

    Public WithEvents MyLabel As MSForms.Label

    Private Sub MyLabel_Click()

        Me.MyLabel.Parent.ThisLabelName = Me.MyLabel.Name

    ' only needed for demonstration

        Me.MyLabel.Parent.Caption = "Clicked " & Me.MyLabel.Name

    End Sub

    Volevo modificarlo per utilizzarlo in modo diverso, ma non ci sono riuscito.

    Il problema e che in un Frame ho 20 Label es: lblPippo, lblGiacomo, ecc..

    In alcuni fogli ho il nome lblPippo, in altri lblGiacomo ecc.

    Potete aiutarmi a capire come effettuare la ricerca (con l'uso della funzione Find), nei vari fogli

    del nome lblPippo o lblGiacomo, ecc  nomi che corrispondono alla proprietà Name delle Label?

    Hai citato l'uso di'un modulo classe per creare un evento click, al livello della applicazione, per un gruppo di oggetti label. Nell'esempio banale, facendo clic su qualunque degli oggetti label di interesse si scattena un avviso indicando il nome di quel oggetto.

    Prima di procedere, credo sia opportuno che tu spiegassi più dettagliamente l'azione prevista da te in risposta ad un clic e, magari, il suo scopo.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento