Condividi tramite

nome combobox selezionata su foglio

Anonimo
2017-08-16T17:49:39+00:00

Ciao a tutti

tramite le seguenti istruzioni:

Private Sub ComboBox1_Click()

xx = ComboBox1.TopLeftCell.Address

ottengo l'indirizzo di riferimento della combobox1 (ActiveX) posta sul mio foglio di lavoro.

Vorrei sapere se (senza ricorrere alle classi) è possibile ottenere tale indirizzo senza indicare il nome della combobox, per esempio:

me.activecontrol.topleftcell.address

che naturalmente non funziona.

Grazie in anticipo

saluti

domenico

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
2017-08-18T02:26:41+00:00

Ciao Domenico,

Comunque, non capisco la tua riluttanza ad abbracciare le classi con entusiasmo! A mio modesto parere, l'uso di classi aumenta drasticamente il potere e l'utilità di VBA.

Tanto per aiutare altri che avessero la stessa esigenza, ma che non avessero la tua aversione alle classe, e per dimostrare quanto è facile ottenere i risultati voluti, vorrei suggerire qualcosa del genere:

  • Alt+F11 per aprire l'editor di VBA
  • Alt+ICper inserire un nuovo modulo di classe
  • Nel nuovo modulo vuoto, incolla il seguente codice:

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

Option Explicit

Public WithEvents ComboBoxGroup As MSForms.ComboBox

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

Option Explicit

Public WithEvents ComboBoxGroup As MSForms.ComboBox

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

Private Sub ComboBoxGroup_Change()

    Call ReturnNameAndAddress

End Sub

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

Private Sub ReturnNameAndAddress()

    With ComboBoxGroup

        Call MsgBox( _

             Prompt:="Nome della ComboBox: " _

                     & .Name _

                     & vbNewLine & vbNewLine _

                     & "Indirizzo della ComboBox: " & ": " _

                     & .TopLeftCell.Address(0, 0, , 1), _

             Buttons:=vbInformation, _

             Title:="NOME E INDIRIZZO")

    End With

End Sub

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

  • Premi F4 per aprire la finestra proprietà del modulo classe
  • Sostituisci il valore della proprietà  Name dal valore default (tipicamente qualcosa del genere Class1) a clsComboBoxes
  • Alt+IMper inserire un nuovo modulo di codice standard
  • Nel nuovo modulo vuoto, incolla il seguente codice:

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

Option Explicit

Dim ComboBoxes() As New clsComboBoxes

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

Public Sub Tester()

    Dim WB As Workbook

    Dim SH As Worksheet

    Dim Rng As Range

    Dim oOleObj As OLEObject

    Dim oComboBox As MSForms.ComboBox

    Dim iCtr As Long

    Const sFoglio As String = "Foglio1"                '<<=== Modifica

    Set WB = ThisWorkbook

    Set SH = WB.Sheets(sFoglio)

    For Each oOleObj In SH.OLEObjects

        With oOleObj

            If TypeName(.Object) = "ComboBox" Then

                iCtr = iCtr + 1

                ReDim Preserve ComboBoxes(iCtr)

                Set oComboBox = .Object

                Set ComboBoxes(iCtr).ComboBoxGroup = oComboBox

            End If

        End With

    Next oOleObj

End Sub

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

  • Ctrl+R per accedere alla finestra Project Explorer ('Gestione progetti')
  • Fai doppio clic sul modulo ThisWorkbook (Questa_cartella_di_Lavoro) del file e incolla il seguente codice:

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

Option Explicit

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

Private Sub Workbook_Open()

    Call Tester

End Sub

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

  • Alt+Q per chiudere l'editor di VBA e tornare a Excel
  • Salva il file con l’estensione xlsm
  • Chiudi e riapri il file

Supponiamo che sul foglio  di interesse si trovino più oggetti Combox del tipo ActiveX.  Modificando il valore di qualsiasi delle ComboBox, si incontrerebbe un messaggio del genere:

Ai fini di questa dimostrazione, ho sfruttato l'evento ComboBoxGroup_Change per restituire le informazioni richieste. Tuttavia, è possibile utilizzare qualsiasi altro evento adatto, Ad esempio, per utilizzare uno o più degli eventi Click, DropButtonClick, o MouseDown, nel modulo classe, sostituisci la procedura dell'evento ComboBoxGroup_Change con una o più delle procedure evento successive:

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

Private Sub ComboBoxGroup_Click()

    Call ReturnNameAndAddress

End Sub

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

Private Sub ComboBoxGroup_DropButtonClick()

Call ReturnNameAndAddress

End Sub

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

Private Sub ComboBoxGroup_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

Call ReturnNameAndAddress

End Sub

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

Si può  scaricare il mio file di prova  Domenico20170818.xlsm

===

Regards,

Norman

La risposta è stata utile?

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

5 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2017-08-18T14:49:07+00:00

    Ciao Domenico,

    non sono contrario alle classi, anzi spesso le uso per sviluppi di programmi.

    Benissimo!

    Il fatto è che in alcuni casi certi utenti non vogliono usare il vba perché non lo conoscono o lo conoscono molto poco e comunque vogliono essere in grado di gestire in autonomia alcune modifiche.

    Se fornissi a tali utenti un lavoro nel quale intervenire non è proprio facile, mi troverei a dover intervenire continuamente perché loro non sono capaci.

    Questo il perché, in certi casi, cerco di sviluppare un codice molto semplice e, le classi, non lo sono.

     Mi rendo fin troppo conto di quanto sia forte la tentazione di evitare gli eventuali 

    problemi che hai descritto e sento il tuo dolore! Comunque penso che, almeno in questo caso, lo sfruttamento delle classe non dovrebbe essere troppo preoccupante in quanto l'unica modifica richiesta dall'utente si trova nella routine Tester del modulo standard. Più precisamente, si tratta dell'istruzione:

        Const sFoglio As String = "Foglio1"                '<<=== Modifica

    Quindi, non dovrebbe essere necessario che l'utente toccasse il modulo classe o se ne preoccupasse.  

    Per analogia, un autista che lo ritenga opportuno potrebbe forse cambiare l'olio; il fatto che non comprende nulla sul servosterzo non dovrebbe impedirgli di godere dei suoi benefici. :-)

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2017-08-18T10:32:59+00:00

    Ciao Norman

    non sono contrario alle classi, anzi spesso le uso per sviluppi di programmi.

    Il fatto è che in alcuni casi certi utenti non vogliono usare il vba perché non lo conoscono o lo conoscono molto poco e comunque vogliono essere in grado di gestire in autonomia alcune modifiche.

    Se fornissi a tali utenti un lavoro nel quale intervenire non è proprio facile, mi troverei a dover intervenire continuamente perché loro non sono capaci.

    Questo il perché, in certi casi, cerco di sviluppare un codice molto semplice e, le classi, non lo sono.

    Grazie di tutto e cari saluti

    domenico

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2017-08-17T22:55:06+00:00

    Ciao Domenico,

    tramite le seguenti istruzioni:

    Private Sub ComboBox1_Click()

    xx = ComboBox1.TopLeftCell.Address

    ottengo l'indirizzo di riferimento della combobox1 (ActiveX) posta sul mio foglio di lavoro.

    Vorrei sapere se (senza ricorrere alle classi) è possibile ottenere tale indirizzo senza indicare il nome della combobox, per esempio:

    me.activecontrol.topleftcell.address

    che naturalmente non funziona.

    Non credo che sia possible senza ricorre ad una classe,

    Comunque, non capisco la tua riluttanza ad abbracciare le classi con entusiasmo! A mio modesto parere, l'uso di classi aumenta drasticamente il potere e l'utilità di VBA.

    Postscriptum:

    Nota che ho cancellato una risposta precedente perché mi sono reso conto che avevo letto male la tua domanda!

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Eliminata

    Questa risposta è stata eliminata a causa di una violazione del codice di comportamento. La risposta è stata segnalata manualmente o identificata tramite il rilevamento automatizzato prima dell'esecuzione dell'azione. Per ulteriori informazioni, fai riferimento al codice di comportamento.


    I commenti sono stati disattivati. Ulteriori informazioni