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

  1. 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