Una famiglia di software per fogli di calcolo Microsoft con strumenti per l'analisi, la creazione di grafici e la comunicazione dei dati.
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