Condividi tramite

Visibilità dei dati e gerarchie

Anonimo
2015-06-13T11:02:19+00:00

Ciao. Come già detto più volte sto cercando di imparare a programmare Excel. Forse, anzi sicuramente, ho scelto un problema un poco complesso, ma tant'è.

Cerco di spiegare; Per necessità di inizializzazione della gestione e per una gestione dello stesso avrei necessità di poter vedere, e gestire, una serie di dati (variabili e tabelle) in tutti Fogli.

Credo di aver capito che la struttura naturale di Excel è Padre (ThisWorkbook) e Figlio(i) (WorkSheet(s)). Ora, a me, viene naturale pensare che tutto quello che io definisco nella parte (generale) di ThisWorkbook debba essere visibile e disponibile per i suoi figli (WorkSheet(s)), ora le domande:

  1. E' corretto quanto sopra?, perché per tutte le prove fatte non riesco ad ottenere il risultato divisibilità e operatività.
  2. E' possibile ottenere quanto sperato?, se si come?.

grazie, 

Claudio

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

14 risposte

Ordina per: Più utili
  1. Anonimo
    2015-06-14T16:21:07+00:00

    ... e aggiungo:

    Una precisazione, però, andrebbe fatta riguardo gli eventuali moduli di classe del Progetto VBA creati da noi: devono essere esplicitamente istanziati in variabili oggetto con visibilità globale, esattamente come succede con gli oggetti Workbook e Worksheet dell'esempio, che però sono istanziati implicitamente all'avvio.

    Spero di non aggiungere confusione con il seguente esempio, perché lo scopo sarebbe esattamente il contrario. Sperém...

    __________________________________________

    ' Standard Module : modGlobal

    '

    Option Explicit

    Public mySample As clsSample

    Public Pippo    As String

    __________________________________________

    ' Class Module : clsSample

    '

    Option Explicit

    Public Pippo As String

    __________________________________________

    ' Class Module : ThisWorkbook - Workbook

    '

    Option Explicit

    Public Pippo As String

    Private Sub Workbook_BeforeClose(ByRef Cancel As Boolean)

          Set mySample = Nothing

    End Sub

    Private Sub Workbook_Open()

          modGlobal.Pippo = "Ciao 1!" ' (il nome del modulo qui è necessario

                                    ' perché dal punto di vista di

                                    ' Workbook prima viene il "suo" Pippo, poi

                                    ' quello globale. 

          If mySample Is Nothing Then Set mySample = New clsSample

          mySample.Pippo = "Ciao 2!"

          Me.Pippo = "Ciao 3!"

          Me.Worksheets("Foglio1").Pippo = "Ciao 4!"

    End Sub

    __________________________________________

    ' Class Module : Foglio1 - Worksheet

    '

    Option Explicit

    Public Pippo As String

    Private Sub Worksheet_Activate()

          MsgBox modGlobal.Pippo, , TypeName(modGlobal.Pippo)

          MsgBox mySample.Pippo, , TypeName(mySample)

          MsgBox Me.Pippo, , TypeName(Me)

          MsgBox Me.Parent.Pippo, , TypeName(Me.Parent)

    End Sub

    __________________________________________

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2015-06-13T19:52:32+00:00

    Ciao Claudio,

    già te l'hanno detto ma repetita iuvant:

    1. No

    :-)

    Scherzi a parte, qualsiasi variabile dichiarata Public in qualsiasi modulo è visibile da tutto il progetto VBA (e pure esternamente, ve ne fosse bisogno).

    Quello che cambia è il modo di... raggiungerla. E i casi sono solo due:

    1. Variabile dichiarata Public in un Modulo standard:

    basta chiamarla col nome, da qualsiasi modulo del progetto. 2. Variabile dichiarata Public in un Modulo di classe (e ThisWorkbook, Worksheet, ecc sono moduli di classe)

    ci si riferisce a essa premettendo il qualificatore dell'oggetto in cui è dichiarata.

    Prendi, per esempio, la Cella A1 del Foglio di lavoro Foglio1 della Cartella di lavoro Pippo.xlsx... Se vuoi riferirti a essa, da qualsiasi modulo del Progetto VBA scrivi:

    Excel.Application.Workbooks("Pippo.xlsx").Worksheets("Foglio1").Range("A1")

    perché Range è una proprietà dichiarata Public nel Modulo di classe dell'oggetto Worksheet che appartiene all'insieme Worksheets del''oggetto Workbook che appartiene all'insieme Worksheets... E mi fermo.

    Se anche tu dichiari Public una variabile nel modulo di classe di un Foglio di lavoro dovrai usare lo stesso metodo per riferirti a essa:

    ' Module : Foglio1 - Worksheet

    '

    Option Explicit

    Public Pippo As String

    Come assegnarle un valore all'avvio del progetto? Per esempio così:

    ' Module : ThisWorkbook - Workbook

    '

    Option Explicit

    Private Sub Workbook_Open()

        Me.Worksheets("Foglio1").Pippo = "Ciao!"

    End Sub

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2015-06-13T14:59:18+00:00

    Ora, a me, viene naturale pensare che tutto quello che io definisco nella parte (generale) di ThisWorkbook debba essere visibile e disponibile per i suoi figli (WorkSheet(s)), ora le domande:

    E' corretto quanto sopra?,

    No, non lo è.

    ThisWorkbook è un oggetto.

    Ciascun Worksheet è un oggetto.

    Ogni cosa metodi(Sub), funzioni(Function), eventi(Sub), variabili, costanti, ecc. presenti nei vari oggetti, se definiti come Privatesono visibili (ed utilizzabili), solo all'interno dell'oggetto stesso.

    Anche i M oduli di codice standard non sono che oggetti particolari (assimilabili alle classi Static di alcuni linguaggi) nei quali mettere codice che se dichiarato Public può essere utilizzato da tutti gli altri oggetti della soluzione, se dichiarato Private rimane visibile ed utilizzabile solo all'interno delle stesso modulo.

    Quindi, se ho variabili/costanti/routine(Sub e Function) che devo utilizzare in tutta la soluzione, le metterò in Moduli standard dichiarandoli Public.

    In ThisWorkbook metterò solo il codice che verrà utilizzato ad esempio dagli eventi all'avvio o alla chiusura del file e/o utilizzerò gli eventi dell'insieme degli oggetti Sheets che ne fanno parte.

    In ciascun Worksheet metterò il codice relativo agli eventi che riguardano il singolo Worksheet.

    Dai un'occhiata a Public e Private nella guida del vb di Excel.

    Molto importante è capire cosa si intende per programmazione ad oggettiin Excel. Qui una breve introduzione:

    Ovviamente tutto ciò a grandi linee, se spieghi bene cosa vorresti ottenere forse possiamo essere più chiari.

    Grazie per l'attenzione.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2015-06-13T13:47:33+00:00

    Ciao claudiomauri,

    Ciao. Come già detto più volte sto cercando di imparare a programmare Excel. Forse, anzi sicuramente, ho scelto un problema un poco complesso, ma tant'è.

    Cerco di spiegare; Per necessità di inizializzazione della gestione e per una gestione dello stesso avrei necessità di poter vedere, e gestire, una serie di dati (variabili e tabelle) in tutti Fogli.

    Senza utilizzare gli eventi di Excel, forse stai cercando qualcosa del genere:

    In un modulo standard

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

    Option Explicit

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

    Public Sub Tester()

        Dim WB As Workbook

        Dim SH As Worksheet, aSH As Worksheet

        Dim srcRng As Range, destRng As Range

        Dim iRow As Long, jRow As Long

        Dim sIntestazioni As Variant

        Const sSheetName As String = "Riepilogo"

        Const sHeadings As String = "Nome,Nazionalità,Data di Nascita,Città"

        Const myColumns As String = "A:D"

        Set WB = ThisWorkbook

        On Error Resume Next

        Set aSH = WB.Sheets(sSheetName)

        On Error GoTo 0

        With WB

            If Not aSH Is Nothing Then

                aSH.UsedRange.Offset(1).ClearContents

            Else

                Set aSH = .Sheets.Add(Before:=.Sheets(1))

                aSH.Name = sSheetName

                sIntestazioni = Split(sHeadings, ",")

                aSH.Range("A1:D1").Value = sIntestazioni

            End If

            For Each SH In .Worksheets

                With SH

                    If Not .Name = sSheetName Then

                        iRow = LastRow(SH, .Columns("A:A"))

                        If CBool(iRow) Then

                            Set srcRng = .Range(myColumns).Rows(2).Resize(iRow - 1)

                            jRow = LastRow(aSH, aSH.Columns("A:A"))

                            Set destRng = aSH.Range("A" & jRow + 1)

                            srcRng.Copy Destination:=destRng

                        End If

                    End If

                End With

            Next SH

        End With

    XIT:

    End Sub

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

    Public Function LastRow(SH As Worksheet, _

                            Optional Rng As Range)

        If Rng Is Nothing Then

            Set Rng = SH.Cells

        End If

        On Error Resume Next

        LastRow = Rng.Find(What:="*", _

                           after:=Rng.Cells(1), _

                           Lookat:=xlPart, _

                           LookIn:=xlFormulas, _

                           SearchOrder:=xlByRows, _

                           SearchDirection:=xlPrevious, _

                           MatchCase:=False).Row

        On Error GoTo 0

    End Function

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

    Questo codice crea un foglio riepilogativo (se non è già presente) e popola questo foglio con i dati trovati nelle colonne A: D di tutti gli altri fogli.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2015-06-13T11:48:55+00:00

    Ciao claudiomauri ,

    Penso che sarebbe utile se tu dovessi fornire un esempio specifico di ciò che vuoi ottenere.

    Tuttavia, a titolo di esempio, incolla il seguente codice nel modulo di codice dell'oggetto ThisWorkbook:

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

    Option Explicit

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

    Private Sub Workbook_Open()

        Call MsgBox(Prompt:="Benvenuto " _

                          & Application.UserName _

                          & " al workbook " & Me.Name, _

                    Buttons:=vbInformation, _

                    Title:="Nome del Workbook")

    End Sub

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

    Private Sub Workbook_SheetActivate(ByVal Sh As Object)

        Call MsgBox(Prompt:="Benvenuto al foglio " & Sh.Name, _

                    Buttons:=vbInformation, _

                    Title:="Nome di Foglio!")

    End Sub

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

    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

        Call MsgBox(Prompt:="Hai selezionato la cella " _

                          & Target.Address(0, 0) _

                          & " sul foglio " _

                          & Sh.Name & " del workbook " _

                          & Me.Name, _

                    Buttons:=vbInformation, _

                    Title:="Indirizzo")

    End Sub

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

    Salva, chiudi e riapri  il file. Poi seleziona qualsiasi foglio e quindi seleziona una cella del foglio.

    Questi esempi banali sono intesi a dimostrare che il codice evento nel modulo di codice del ThisWorkbook può operare su tutti i fogli. Se si volesse operare su un singolo foglio in modo analogo, si potrebbe usare il l'evento corrispondente nel modulo di codice del foglio di interesse. 

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento