Discussione:
VBA - Sub turnazione con Array, va a ciclo continuo.
(troppo vecchio per rispondere)
Bruno
2015-08-29 20:07:42 UTC
Permalink
Excel 2010.

Ciao a Tutti, spero possiate aiutarmi.
Ho cercato di adattare la sub sotto riportata inserita nel foglio,
definendo il nome in turni = "'Agosto (2)'!$B$5:$AF$5,'Agosto
(2)'!$B$11:$AF$11,'Agosto (2)'!$B$17:$AF$17"
al fine di poter inserire ciclicamente in un foglio con 31 celle
riferite al mese per ogni turnista (in totale 6 turnisti).
nel richiamare la routine con un pulsante inizia si avvia il codice,
apparentemente senza che il codice si fermi, ed Excel non risponde più,
bloccandosi. Non essendo molto ferrato in VBA chiedo il vostro aiuto per
risolvere il problema.
Grazie, Bruno

=====================
Option Explicit
---
Sub turnazione()
Dim cell As Variant
Dim turni As Range
'turni = "'Agosto (2)'!$B$5:$AF$5,'Agosto (2)'!$B$11:$AF$11,'Agosto
(2)'!$B$17:$AF$17"
Dim Turno(), t As Variant
Turno = Array("MA", "PA", "MD", "PD", "PA", "MD", "RS")
t = InputBox("Turno di partenza?" & vbCr & vbCr & "0 - MA" & vbCr &
"1 - PA" & vbCr & "2 - MD" & vbCr & "3 - PD" & vbCr & "4 - PA" & vbCr &
"5 - MD" & vbCr & "6 - RS", "Seleziona il turno", "Inserisci il numero
del turno")
For Each cell In Range("turni")
If t = 5 Then t = 0
cell.Value = Turno(t)
t = t + 1
Next cell
End Sub
-----
Private Sub CommandButton1_Click()
Call turnazione
End Sub
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
Nando
2015-08-29 23:06:49 UTC
Permalink
"Bruno" ha scritto nel messaggio news:mrt3fn$tek$***@speranza.aioe.org...
<bloccandosi. Non essendo molto ferrato in VBA chiedo il vostro aiuto per
<risolvere il problema.

modificando il loop in tal modo , a me funziona il programma (uso excel
2007) :

For Each cell In turni.Cells
If t = 5 Then t = 0
cell.Value = Turno(t)
t = t + 1
Next cell
Bruno
2015-08-30 11:12:40 UTC
Permalink
Post by Nando
<bloccandosi. Non essendo molto ferrato in VBA chiedo il vostro aiuto per
<risolvere il problema.
modificando il loop in tal modo , a me funziona il programma (uso excel
For Each cell In turni.Cells
If t = 5 Then t = 0
cell.Value = Turno(t)
t = t + 1
Next cell
^^^^^^^

Ciao Nando, Grazie per il tuo aiuto. Io uso Office 2010; non dovrebbe
esserci differenza con il 2007, ma........

Ho provato a variare il codice come da te indicato ma restituisce un
errore di run-time 91: variabile oggetto o variabile del blocco With non
impostata.

Ho cercato di seguire l'Help, provando e riprovando senza riuscire a
risolvere. Pensi di riuscire a trovare la soluzione?
Restando sempre nel tema, anche se questo problema si risolvesse,
resterebbe il problema che esistono 12 fogli nominati da gennaio a
dicembre, pertanto mi chiedo come poter far funzionare il codice su ogni
foglio attivo, chiedendo conferma se procedere o meno con il codice di
inserimento turni, questo per evitare di sovrascrivere erroneamente i
turni definiti nei fogli dei mesi precedenti, nel caso si chiccasse per
errore sul pulsante.

Grazie, Bruno

---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
Nando
2015-08-30 11:49:28 UTC
Permalink
"Bruno" ha scritto nel messaggio news:mruofb$79a$***@speranza.aioe.org...

<Ho provato a variare il codice come da te indicato ma restituisce un
<errore di run-time 91: variabile oggetto o variabile del blocco With non
<impostata.

probabilmente hai cambiato anche altro?
La variabile TURNI ( di tipo range) ce l'hai ? posta il codice completo.

<resterebbe il problema che esistono 12 fogli nominati da gennaio a
<dicembre, pertanto mi chiedo come poter far funzionare il codice su ogni
<foglio attivo,

fai un loop che scansiona tutti i fogli ,e all'interno del ciclo ci metti
tutto il codice che hai scritto, affinchè venga ripetuto 12 volte in 12
fogli diversi, esempio:



Dim NumeroFogli As Integer
Dim I As Integer

NumeroFogli = ActiveWorkbook.Worksheets.Count
For I = 1 To NumeroFogli

turni = "ActiveWorkbook.Worksheets(I)'!$B$5:$AF$5 ...........etc"
......................

Next I
Bruno
2015-08-30 12:08:26 UTC
Permalink
Il 30/08/2015 13:49, Nando ha scritto:
[CUT]

Ciao Nando, questo è il codice che ho postato all'inizio, senza la tua
correzione.
con definisci nome, ho definito il range di celle >>> 'turni = 'Agosto
(2)'!$B$5:$AF$5,'Agosto (2)'!$B$11:$AF$11,'Agosto (2)'!$B$17:$AF$17

Chiaramente solo per il foglio "Agosto (2)", giusto per fare la prova,
fallitta con successo.

Grazie per l'aiuto che mi stai dando, queste due righe di codice mi
stanno tormentando.

^^^^^^^^^

Option Explicit

--------------------------------
Sub turnazione()

Dim cell As Variant
Dim turni As Range
Dim Turno(), t As Variant

Turno = Array("MA", "PA", "MD", "PD", "PA", "MD", "RS")

t = InputBox("Turno di partenza?" & vbCr & vbCr & "0 - MA" & vbCr & "1 -
PA" & vbCr & "2 - MD" & vbCr & "3 - PD" & vbCr & "4 - PA" & vbCr & "5 -
MD" & vbCr & "6 - RS", "Seleziona il turno", "Inserisci il numero del
turno")

' Ho variato il codice come indicato da te ma restituisce l'errore di
cui ho fatto cenno nel post precedente

For Each cell In Range("turni")
If t = 5 Then t = 0
cell.Value = Turno(t)
t = t + 1
Next cell

End Sub


----- Pulsante che richiama la routine -------
Private Sub CommandButton1_Click()
Call turnazione
End Sub


---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
Nando
2015-08-30 12:40:55 UTC
Permalink
<"Bruno" ha scritto nel messaggio news:mrurpn$f9q$***@speranza.aioe.org...
<con definisci nome, ho definito il range di celle >>> 'turni = 'Agosto
......

perchè davanti a turni c'è un apostrofo? che non ci deve essere(è il
carattere di commento) :

Questo è il codice che a me funziona (foglio1 è il nome del mio foglio):


Sub turnazione()

Dim cell As Variant

Dim turni As Range

Set turni = Foglio1.Range("$B$5:$AF$5,$B$11:$AF$11, $B$17:$AF$17")



Dim Turno(), t As Variant

Turno = Array("MA", "PA", "MD", "PD", "PA", "MD", "RS")

t = InputBox("Turno di partenza?" & vbCr & vbCr & "0 - MA" & vbCr & "1 -
PA" & vbCr & "2 - MD" & vbCr & "3 - PD" & vbCr & "4 - PA" & vbCr & _
"5 - MD" & vbCr & "6 - RS", "Seleziona il turno", "Inserisci il numero del
turno")

For Each cell In turni.Cells
If t = 5 Then t = 0
cell.Value = Turno(t)
t = t + 1
Next cell


End Sub
Bruno
2015-08-30 14:24:23 UTC
Permalink
Post by Nando
<con definisci nome, ho definito il range di celle >>> 'turni = 'Agosto
......
perchè davanti a turni c'è un apostrofo? che non ci deve essere(è il
Sub turnazione()
Dim cell As Variant
Dim turni As Range
Set turni = Foglio1.Range("$B$5:$AF$5,$B$11:$AF$11, $B$17:$AF$17")
Dim Turno(), t As Variant
Turno = Array("MA", "PA", "MD", "PD", "PA", "MD", "RS")
t = InputBox("Turno di partenza?" & vbCr & vbCr & "0 - MA" & vbCr & "1
- PA" & vbCr & "2 - MD" & vbCr & "3 - PD" & vbCr & "4 - PA" & vbCr & _
"5 - MD" & vbCr & "6 - RS", "Seleziona il turno", "Inserisci il numero
del turno")
For Each cell In turni.Cells
If t = 5 Then t = 0
cell.Value = Turno(t)
t = t + 1
Next cell
End Sub
^^^^^^

Ciao Nando, ho terminato ora con le varie prove; ho trovato l'inghippo.
Il tuo codice funziona alla perfezione su un foglio pulito senza
formattazioni condizionali, quindi verificato ciò per eventuali miei
errori, ho copiato il codice in un foglio nominato Agosto1, pieno di
formattazioni condizionali per colorare le celle, tipo festivi,
festività particolari, ecc.. In questa situazione il codice oarte ma fa
la prima cella e basta (sabato 1° agosto che non è festivo, poi si
blocca e devo forzare la chiusura del foglio con ctrl+ Canc).
Ho provato ad eliminare la formattazione condizionale e tutto funziona
alla grande. Mentre ti scrivo mi son reso conto che se lasciato lavorare
funziona anche con le formattazioni condizionali, ma con una lentezza
che si spacca. Si vede che calcola, calcola, calcola e ancora calcola,
Ora scoppia il PC.
Ti è mai capitato? Pensi che ci sia una soluzione, da cosa può dipendere?
Visto che ora funziona ti posso chiedere un aiuto per far funzionare il
codice su ogni foglio senza dover ripettere sempre il codice. Io ci
provo seguendo le indicazioni che mi hai dato, sperando di riuscire.
Grazie, Bruno

---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
Bruno62
2015-08-30 16:00:39 UTC
Permalink
[CUT]

Ciao Nando, ho provato a giocare con l'ultimo codice che mi hai postato;
ho creato un modulo "Public Function turnazione()" ed cambiato il Set
turni da te impostato con ActiveSheet.Range(...........
poi ho creato un pulsante in ogni foglio ed ho fatto richiamare la
funzione con "Call turnazione()". Funziona bene su tre fogli puliti
senza formattazione, mentre nei fogli con diverse formattazioni esegue
la procedura con una lentenza impressionante. Mi chiedo come ragiona
Excel e cosa calcola per impiegare così tanto tempo.
Se hai idea su come risolvere ti prego di farmi sapere.
Mille grazie, Bruno
Option Explicit
Public Function turnazione()
Dim cell As Variant
Dim turni As Range
Set turni = ActiveSheet.Range("$B$5:$AF$5,$B$11:$AF$11,$B$17:$AF$17")
Dim Turno(), t As Variant
Turno = Array("MA", "PA", "MD", "PD", "M", "P", "RS")
t = InputBox("Turno di partenza?" & vbCr & vbCr & "0 - MA" & vbCr & "1 - PA" & vbCr & "2 - MD" & vbCr & "3 - PD" & vbCr & "4 - P" & vbCr & _
"5 - M" & vbCr & "6 - RS", "Seleziona il turno", "Inserisci il numero del turno")
For Each cell In turni.Cells
If t = 5 Then t = 0
cell.Value = Turno(t)
t = t + 1
Next cell
End Function
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
Nando
2015-08-30 16:15:36 UTC
Permalink
"Bruno62" ha scritto nel messaggio news:mrv9cc$gf4$***@speranza.aioe.org...
<senza formattazione, mentre nei fogli con diverse formattazioni esegue
<la procedura con una lentenza impressionante. Mi chiedo come ragiona

Prova ad aggiungere all'inizio della Sub l'istruzione :

Application.ScreenUpdating = FALSE

e alla fine come ultima istruzione

Application.ScreenUpdating = TRUE
Bruno62
2015-08-30 16:37:02 UTC
Permalink
fogli con diverse formattazioni esegue <la procedura con una lentenza
impressionante. Mi chiedo come ragiona
Application.ScreenUpdating = FALSE
e alla fine come ultima istruzione
Application.ScreenUpdating = TRUE
^^^^^^^^^^^^^^^

va meglio, ma sempre lento, forse ci sono troppe formattazioni
condizionali che da sole non creano problemi, ma li creano
nell'esecuzione del codice, nei fogli puliti il codice è un fulmine.
Bho!

---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus

Loading...