Ciclo For...Next in una Sottomaschera da Maschera Principale

Anonimo
2013-12-19T15:23:55+00:00

Buongiorno a tutti,

Ho una Maschera principale (Visualizzazione Maschera singola) contenente una Sottomaschera 1 (Visualizzazione Foglio dati) all'interno di questa c'è un'altra Sottomaschera 2 (Visualizzazione Foglio dati). Avrei la necessità di creare all'interno della Maschera principale una casella di testo (dove inserire un numero) e un Bottone che dovrebbe eseguire il seguente codice:

Private Sub ComandoX_Click()

Dim t As Integer

For t = Forms![Mascera_Principale]![SM_1].CurrentRecord To Forms![Maschera_Principale]![SM_1].RecordsetClone.RecordCount

           Forms![Maschera_Principale]![SM_1].dati = Forms![Maschera_Principale]![SM_1].dati + NomeCasellaDiTesto

           DoCmd.GoToRecord , , acNext

Next

End Sub

dove [dati] è un campo numerico contenuto nella Sottomaschera_1. Mi dà un errore (Errore di run-time '438' Proprietà o metodo non supportati dall'oggetto). Segnando nel Debug la riga For t..........

In sostanza dovrei poter eseguire un ciclo For...Next nella Maschera Principale ma i dati sono all'interno della Sottomaschera 1.

Come posso risolvere questo errore?

Grazie a tutti

Microsoft 365 e Office | Access | 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
2013-12-21T17:18:45+00:00

Ciao Michael,

esplicitando la gerarchia di tutti gli oggetti, il codice seguente sembra fare quanto chiedi:


Private Sub Comando12_Click()

    Dim t As Integer

    For t = Me.Controls("SM_SC_Funzioni_Fasi").Form.CurrentRecord To _

        Me.Controls("SM_SC_Funzioni_Fasi").Form.RecordsetClone.RecordCount

        Me.Controls("SM_SC_Funzioni_Fasi").Controls("Tempo_min").Value = _

            Me.Controls("SM_SC_Funzioni_Fasi").Controls("Tempo_min").Value _

            + Me.Controls("incremento").Value

        Me.Controls("SM_SC_Funzioni_Fasi").Form.Recordset.MoveNext

    Next

End Sub


che volendo si potrebbe abbreviare così:


Private Sub Comando12_Click()

    Dim t As Integer

    For t = Me!SM_SC_Funzioni_Fasi.Form.CurrentRecord To _

        Me!SM_SC_Funzioni_Fasi.Form.RecordsetClone.RecordCount

        Me!SM_SC_Funzioni_Fasi!Tempo_min.Value = _

            Me!SM_SC_Funzioni_Fasi!Tempo_min.Value + Me!incremento.Value

        Me!SM_SC_Funzioni_Fasi.Form.Recordset.MoveNext

    Next

End Sub

Fai attenzione inoltre al fatto che il controllo che tu chiami "Tempo_min" contenuto nella sottomaschera "SM_SC_Funzioni_Fasi" in realtà si chiama "dati" (almeno nel db che hai condiviso). Per evitare confusioni e per facilitare l'associazione del controllo al campo sottostante che rappresenta ti consiglierei di cambiare il suo nome in "Tempo_min".

David

La risposta è stata utile?

0 commenti Nessun commento

8 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2013-12-20T16:35:57+00:00

    Ciao Michael,

    vorrei aiutarti ma temo di non aver compreso correttamente la tua situazione.

    Nel primo post hai detto:

    "In sostanza dovrei poter eseguire un ciclo For...Next nella Maschera Principale ma i dati sono all'interno della Sottomaschera 1"

    Ora invece parli di 2 sottomaschere (una dentro l'altra).

    A questo punto o spieghi meglio cosa hai e cosa vuoi ottenere oppure, meglio ancora, condividi un db di esempio che rappresenti il tuo problema.

    Sarà più facile per me e per chiunque altro vorrà aiutarti, provare a fornirti una soluzione.

    David

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2013-12-20T15:23:25+00:00

    Ciao David,

    il pulsante e la casella di testo sono contenuti nella Maschera Principale, fuori dalle 2 Sottomaschere, avrei potuto mettere i 2 oggetti nella Sottomaschera 1 senza problemi. Ma visto che ho 2 Sottomaschere (una dentro l'altra) non me lo lascia fare. Il codice che mi hai proposto non riesco ad adattarlo. Mi dai una mano? Grazie

    Michael

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2013-12-19T16:36:21+00:00

    Ciao,

    ricevi l'errore perché CurrentRecord e Recordsetclone solo funzionano per un oggetto form non per il controllo sottomaschera. Cioè la sintassi sarebbe:

    For t = Forms![Mascera_Principale]![SM_1].Form.CurrentRecord To Forms![Maschera_Principale]![SM_1].Form.RecordsetClone.RecordCount

    ...

    Non è chiaro dove si trovano il pulsante/codice e "NomeCasellaDiTesto".

    Se il pulsante si trova nella maschera principale, basta anche:

    For t = Me!SM_1.Form.CurrentRecord To Me!SM_1.Form.RecordsetClone.RecordCount

    Però in genere non è una buona idea di ciclare attraverso i record delle maschere e sottomaschere in questo modo. Invece si usa delle query e/o recordset per prendere, calcolare e scrivere valori multipli.

    Cioè prova di creare una query che ti somma i valori del campo [dati] nella quale filtri i record con un criterio come: Forms!Maschera_Principale!Id

    Dove Id sarebbe il campo che usi per collegare/filtrare la sottomaschera.

    Poi basta p.e. un'espressione o una riga di codice con DLookUp per prendere il risultato dalla query e usarlo dovunque lo vuoi.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2013-12-19T16:29:17+00:00

    Ciao Michael\_L\_1

    il codice seguente è lanciato da un pulsante contenuto in una sottomaschera  e compie un ciclo sulla maschera principale sommando al contenuto della casella di testo "NomeCasellaDiTesto" contenuto nella maschera principale il contenuto del controllo "Dati" contenuto nella sottomaschera. 

    Private Sub cmdCiclo_Click()

        Dim lRecord As Long

        For lRecord = Me.Parent.CurrentRecord To Me.Parent.RecordsetClone.RecordCount

            Me!Dati.Value = Me!Dati.Value + Me.Parent.Controls("NomeCasellaDiTesto").Value

            DoCmd.GoToRecord acDataForm, Me.Parent.Name, , acNext

        Next lRecord

    End Sub

    Nel caso in cui "NomeCasellaDiTesto" non fosse nella maschera principale ma nella sottomaschera allora modifica la riga seguente in questo modo

    Me!Dati.Value = Me!Dati.Value + Me!NomeCasellaDiTesto.Value

    David

    La risposta è stata utile?

    0 commenti Nessun commento