› Sviluppare funzionalita su Microsoft Office con VBA › Problema userform multipagina
-
AutoreArticoli
-
Buongiorno a tutti, allego un file di un configuratore con userform (pulito dalle cose non di interesse per questo topic) con cui ho un problema che non riesco a spiegarmi. Praticamente all'avvio si apre un form che chiede di inserire il numero di elementi. Nel secondo form questi elementi si possono configurare tramite un multischeda (le schede si possono cambiare con la combobox posta appena sopra). Gli elementi sono ordinati in ordine decrescente; il primo (ovvero il numero n) ha una scheda diversa dagli altri. Se in un secondo momento si riduce il numero di elementi tramite la textbox posta in cima al form, le schede vengono aggiornate di conseguenza: le ultime vengono nascoste e disabilitate, quelle ancora visibili vengono rinominate in funzione del nuovo numero di elementi, e se ci si trovava in una scheda che non c'è più si ritorna automaticamente alla prima.
Ora, provate la seguente combinazione: 1)Nel primo form inserite 13 elementi 2)Nel secondo form switchate alla scheda dell'elemento 6 tramite la combobox, 3) Cambiate il numero massimo di elementi a 3 con la textbox, 4)Per scatenare l'evento after_Update della txtN cliccate ora su un controllo del multischeda (QUESTO è FONDAMENTALE, SE PER ESEMPIO CLICCATE INVIO PER CONFERMARE IL NUOVO NUMERO DI ELEMENTI IL PROBLEMA NON SI VERIFICA). Vedrete che è comparso un secondo multischeda sotto ed è come se la pagina corrente fosse "freezata" in primo piano (Alcune volte invece esce proprio un runTime error).
Ho anche isolato quali sono le righe di comando che generano il problema: sono entrambe nell'evento after_update del txtN del secondo form, ed in particolare sono la riga "if cmbBraccio.Listindex>n-1 then cmbBraccio.ListIndex=0" (che sposta alla prima pagina se la pagina corrente non è più attiva) e la riga "call pagOff" che nasconde le pagine non più attive. SE ANCHE SOLO UNA di queste due righe non è commentata, il problema si verifica.
Qualcuno saprebbe capire cosa succede e perchè si verifica questa cosa stranissima, SOLO se la modifica del txtN avviene cliccando dentro un controllo del multischeda?
Grazie a chiunque vorrà aiutarmi
Giulio
Allegati:
You must be logged in to view attached files.Ciao@Giulio
Il problema che tu riscontri(se si puo chiamare problema) sta nel fatto che la scheda numero 20, che è quella che tu dici che rimane""freezata", ha una struttura diversa dalle altre 19 , quindi quando tu vai a variare il numero di "page" del controllo "Multipage", queste è come se fossero messe una sull'altra, prova ha variare le dimensioni della page20 vedrai che non la vedi piu ""freezata".
Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )Ciao Albatros, grazie per il riscontro, capisco quello che intendi ma il controllo multipage è uno solo, quindi tu cambiando pagina non dovresti vedere due pagine sovrapposte, dovrebbe semplicemente cambiare pagina. Poi in realtà la scheda "freezata" non è quella in secondo piano che sarebbe appunto la 20, ma quella in primo piano. Infatti se provi a compilare i parametri della scheda visibile e a cambiare pagina, noterai che la pagina in primo piano non cambia e rimane sempre quella, col risultato che le varie pagine non sono - di fatto - compilabili.
Ciao
Credo che il problema stia nel "capire" il tuo elaborato.
Per esempio a me è successo che ho scaricato il file, l'ho aperto (anche se mi dice che ci sono collegamenti che non possono essere aggiornati) ed ho cliccato sulla X in alto a destra della Form. Bene. Mi ha chiuso il Form. Non mi consente, però, di cestinare il file in quanto "risulta aperto. Chiuderlo e poi proseguire".
Nella videata della Form con il mio visore non riesco a vedere se in basso c'è qualche pulsante per chiudere correttamente il file.
Fra l'altro non è facile "vedere" il codice sottostante.
Ciao,
Mario
Per esempio a me è successo che ho scaricato il file, l'ho aperto (anche se mi dice che ci sono collegamenti che non possono essere aggiornati) ed ho cliccato sulla X in alto a destra della Form. Bene. Mi ha chiuso il Form. Non mi consente, però, di cestinare il file in quanto "risulta aperto. Chiuderlo e poi proseguire".
Nella videata della Form con il mio visore non riesco a vedere se in basso c'è qualche pulsante per chiudere correttamente il file.
Colpa mia, non ho ancora implementato la modalità di chiusura corretta; x evitare questo problema consiglio di aprire il file col blocco macro (il classico trucchetto con lo Shift premuto) ed avviare il programma direttamente da codice facendo run sul form "frm1_Title". Così il codice dovrebbe essere fruibile senza problemi. Aperto il form1, seguite i passaggi che ho elencato in cima ed il problema dovrebbe essere chiaro.
Nessuno vuole aiutarmi a capire questo problema??
Ciao@Giulio
il problema che si presenta è causato dalla chiamata a questa " Sub pagOff(ByRef pagina As Object)", difatti , se tu commenti nel codie la chiamata questa sub , il tutto funziona.
Per risolvere il problema, se ho capito, bisognerebbe memorizzare in una variabile il nome del braccio attivo,e dirgli di non eseguire la sun pagoff su quella pagina.
Domanda: ma perche vuoi rendere nascoste le pagine?
Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )Ciao Albatros, mi serve un metodo che disabiliti i controlli delle pagine inattive perchè poi questa sarà la scrematura per salvare i dati che realmente mi serviranno in caso di revisione (funzione che sarà prevista). Inoltre, nascondere le pagine lo avevo mantenuto perchè il metodo PagOff dovrebbe servirmi anche successivamente per altri multipage che invece vengono gestiti da tab. In ogni caso ti segnalo che anche togliendo la sub PagOff (o la riga interna alla sub .Visible=false, che è quella che dà i problemi) il problema persiste, perchè deve necessariamente essere eliminata (o commentata) anche la riga: "if cmbBraccio.Listindex>n-1 then cmbBraccio.ListIndex=0". Infatti se questa riga di codice rimane, noterai che l'errore si genera anche se elimini "Pagoff".
A seguito dell'obiezione di Marius comunque rinoltro il file corretto anche per apertura e chiusura.
Grazie per il riscontro
Allegati:
You must be logged in to view attached files.mi chiarisci perchè il "NAME" delle varie pagine della "multipage" sono nominate tutte con "pagBR00,pagBR01,...." mentre le pagine 6 e 5 hanno per "NAME" "cmdCopia14,cmdCopia15"?
Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )mi chiarisci perchè il "NAME" delle varie pagine della "multipage" sono nominate tutte con "pagBR00,pagBR01,...." mentre le pagine 6 e 5 hanno per "NAME" "cmdCopia14,cmdCopia15"?
Un errore di cui non mi ero accorto. La nomenclatura giusta sarebbe "PagBrXX", il "cmd" dovrebbero essere i pulsanti interni alle pagine. In realtà però non sfrutto da nessuna parte l'attributo Name delle pagine, quindi credo sia un peccato veniale.
Un errore di cui non mi ero accorto
Allora,cerchiamo di mettere ordine, vai nelle schede o pagine, 6 e 5,
se selezioni il pulsante copia, vedi che questi portano il NAME "CommandButton" rinominali con"cmdcopia13 e cmdcopia14" mentre nel "NAME" della pagina rinominali con "pagBR14 e pagBR15",i numeri non hanno importanza , perche quando si "Initialize" la userform "frm1_title" ci pensa il codice a numerarli.
Chiarimento: perchè hai rinominato la txtbox della "Frm1_title" con lo stesso "NAME" della Textbox delle varie "pagine"?
Poi vorrei capire la logica del codice, tu dalla "Frm1_title" inserendo il numero dici di creare delle "page" del controllo"Multipage" uguale al numero inserito.
Una volta inserito il numero(nell'esempio che hai postato 13), nella combobox in alto a DX mi ritrovo le pagine create rinominate"Braccio...", con lo stesso valore (13)nella textbox in alto a SX , che porta lo stesso "NAME" della Textbox della Frm1_title.
Ora selezionado dalla combobox un braccio( nel nostro caso Braccio6) e seleziono la pagina, se non cambio il valore della textbox il tutto funziona.
Punto critico: appena cambio il valore della textbox, e faccio click in qualsiasi punto della pagina, il sistema si"blocca", da notare che nella combobox si seleziona il "braccio3" e non il "braccio6" che avevo seleziona.
Non riesco a venine a capo.
Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )Allora, le due txt del form 1 e 2 hanno lo stesso nome perchè fondamentalmente fanno la stessa cosa. Il sistema è pensato perchè all'inizio l'utente inserisca il numero di elementi, da cui vengono comandate le pagine del form successivo; però in funzione dei parametri inseriti l'utente potrebbe rendersi conto anche in un secondo momento di volere aumentare o ridurre il numero di elementi quindi ho permesso anche posteriormente la modifica del numero. Siccome la numerazione degli elementi va da n a 1 e non viceversa, se n viene cambiato i valori associati ai listIndex della combo per la scelta del braccio vengono cambiati di conseguenza, ma fondamentalmente le pagine (come oggetti) rimangono sempre le stesse, solo che nella combo hanno un numero diverso. Quindi può succedere che cambiando la txt la pagina corrente assuma un valore diverso (in realtà la pagina è sempre quella perchè il ListIndex della combo non è cambiato).
Il problema nasce quando vengono ridotti gli elementi abbassando il numero della textbox, nel caso in cui ci si trovi in una pagina che dovrà essere disabilitata (ricordo che l'attributo Value del Multipage va da 0 a n-1, non da n a 1 come per i nomi assegnati agli elementi). In questo caso il codice dovrebbe spostare innanzitutto il listindex della combo di scelta degli elementi a 0, puntando quindi alla prima pagina (e questa è la prima riga di codice critica), dopodichè disattivare le pagine non più presenti (e questa è la seconda riga critica).
-
AutoreArticoli
