Condividi:        

[Excel] Indicare un range composto da variabili

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

[Excel] Indicare un range composto da variabili

Postdi luca2002for » 28/11/08 13:07

Ciao a tutti.

Il mio problema non credo sia particolarmente difficile, ma non mi permette di andare avanti, anche perchè non trovo nulla di così specifico sui motori di ricerca.

All'interno di un ciclo for....next ho chiamato una variabile "t".

Codice: Seleziona tutto
For t = 3 To 10000
If Range("F" & t) > Range("G" & t) Then (...)


Il problema è quello che c'è dopo il then. Infatti vorrei dire alla macro che se quella condizione si verifica, deve prendere il contenuto della cella ("F" & t) e incollarlo come collegamento nelle celle che vanno dalla "H" & t, scendendo, fino alla "H" & t + 200, ossia, fino alla 200esima cella a partire dalla "H" & t.

Ma indicando questo range come

Codice: Seleziona tutto
range("H" & t : "H" & t + 200)
, cioè come mi sembrerebbe logico, mi appaiono errori di codice o di run time.

Ho provato a modificare cambiando le virgolette, togliendone, aggiungendone. Ma il risultato non cambia.

Qualcuno potrebbe indicarmi come spiegare alla macro quel range composto da variabili?

Grazie in anticipo per la risposta.

Luca
luca2002for
Utente Senior
 
Post: 116
Iscritto il: 07/05/06 09:32

Sponsor
 

Re: [Excel] Indicare un range composto da variabili

Postdi Anthony47 » 28/11/08 16:12

Non range("H" & t : "H" & t + 200) ma
Codice: Seleziona tutto
range("H" & t  ":H" & t + 200)

Oppure
Codice: Seleziona tutto
Range("H" & t).Range("A1:A200")


Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19215
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] Indicare un range composto da variabili

Postdi luca2002for » 28/11/08 20:29

Caro Anthony, innanzitutto grazie per la risposta :)

Ho provato ad inserire il codice da te postato (il primo)

cioè
Codice: Seleziona tutto
range("H" & t  ":H" & t + 200)


(che è più adatto alle mie esigenze, in quanto il secondo perde, se ho capito bene, il riferimento alla variabile);

però, facendo partire la macro, mi arriva un messaggio di errore:

( "Errore di compilazione: previsto separatore di elenco oppure)" )

Osservando con attenzione la parte di codice da te inviata mi è parso di cogliere un'asimmetria (la prima acca è contornata da graffette, mentre la seconda no). Ho provato quindi allora mettendo le graffette anche prima della seconda acca, cioè:

Codice: Seleziona tutto
range("H" & t  ":"H" & t + 200)


ma....ancora messaggio di errore.

Ho fatto altri tentativi, togliendo e aggiungendo graffette (seguendo non le mie scarse conoscenze di VBA, ma solo una vaga idea di simmetria - la stessa per cui mi sembra strano che nella prima parte, cioè

Codice: Seleziona tutto
range("H" & t  ":


ci sia una "chiusura" di graffetta non aperte), ma mi arrivano errori di sintassi o run time.

Sbaglio qualcosa? :oops:

Grazie ancora dell'attenzione :-)

Luca
luca2002for
Utente Senior
 
Post: 116
Iscritto il: 07/05/06 09:32

Re: [Excel] Indicare un range composto da variabili

Postdi Anthony47 » 28/11/08 20:40

Gli apici sono attorno a ":H" per poter ottenere qualcosa tipo H5:H205
Dammi tutta l' istruzione che va in errore; adesso mi devo scollegare, magari piu' tardi potro' guardarla.

ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19215
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] Indicare un range composto da variabili

Postdi luca2002for » 28/11/08 21:06

Grazie ancora della risposta.

Dunque, il codice completo è il seguente:

Codice: Seleziona tutto
Sub prova()
Sheets("prova").Select
For t = 3 To 10000
If Range("F" & t) > Range("G" & t) Then Range("E" & t).Copy
Range("H" & t  ":H" & t + 200).select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Next
End Sub


La parte

Codice: Seleziona tutto
Range("H" & t  ":H" & t + 200)


è quella che mi dà errore (messa così mi dà errore di sintassi).

Grazie ancora :-)

Luca
luca2002for
Utente Senior
 
Post: 116
Iscritto il: 07/05/06 09:32

Risolto!

Postdi luca2002for » 28/11/08 23:13

Come non detto! Risolto!

Ho trovato qui http://support.microsoft.com/kb/291308

un modo alternativo per selezionare un intervallo, cioè del tipo:

Codice: Seleziona tutto
ActiveSheet.Range("C2", "D10").Select


e...non so come, modificandolo (cioè inserendo
Codice: Seleziona tutto
Range("I" & t, "I" & (t + 100)).Select
funziona.

Grazie ancora Anthony :) sbattendoci la testa ho capito :lol:

A presto

Luca
luca2002for
Utente Senior
 
Post: 116
Iscritto il: 07/05/06 09:32

Re: [Excel] Indicare un range composto da variabili

Postdi Anthony47 » 29/11/08 01:34

Come vedi la necessita' aguzza l' ingegno... Bravo.
Non so come, ma nella mia formula mancava un piccolissimo "&"; piccolo ma fondamentale:
Codice: Seleziona tutto
Range("H" & t  & ":H" & t + 200).SELECT


Mentre il secondo [Range("H" & t).Range("A1:A200").SELECT] avrebbe funzionato; partendo dall' origine (H&t) individua un' area larga 1 colonna e alta 200 righe.

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19215
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] Indicare un range composto da variabili

Postdi luca2002for » 29/11/08 06:46

Grazie, perfetto!!

Sei davvero mitico, come sempre (ho visto l'ora in cui hai postato il messaggio.... ;-) ), come sempre del resto.

Solo una piccola cosa. Il codice (con la tua perfetta modifica) mi sembra che funzioni bene ma che compia le istruzioni anche se la condizione if non si verifica.

Cioè:

Codice: Seleziona tutto
Sub prova2()
Sheets("prova").Select
For t = 3 To 9900
If Range("F" & t) > Range("G" & t) Then Range("I" & t & ":I" & t + 200).Select
Range("E" & t).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

Next
End Sub


In pratica la selezione del range ("E"&t) e tutto quello che c'è dopo mi pare venga eseguito comunque dal computer. Infatti quando lancio la macro appare la clessidra e se premo "esc" per uscire dall'esecuzione, vedo che seleziona celle anche se la condizione non si è verificata.

Io vorrei invece che se il range ("F"&t) non è maggiore del range ("G"&t), excel passasse direttamente al ciclo successivo.

Sbaglio qualcosa?....scusa per tutte queste domande :oops: ma secondo me sono ancora a un pelo dalla soluzione definitiva.

Buona giornata e ancora grazie, Anthony

Luca
luca2002for
Utente Senior
 
Post: 116
Iscritto il: 07/05/06 09:32

Re: [Excel] Indicare un range composto da variabili

Postdi Anthony47 » 29/11/08 13:28

Il problema della tua macro e' invece che seleziona sempre e solo E&t, con l' istruzione che segue quella con la If.

Probabilmente dovresti usare una struttura If the else, del tipo
Codice: Seleziona tutto
If Range("F" & T) > Range("G" & T) Then
Range("I" & T & ":I" & T + 200).Select
Else: Range("E" & T).Select
End If

Se vuoi seguire l' esecuzione di una macro, dal vba, selezioni una istruzione della macro (1 solo click) e poi con F8 esegui una istruzione alla volta, verificando sul foglio che cosa succede; per eseguire tutto: F5.
Puoi mettere un break su una istruzione: 1 click sull' istruzione, F9 (idem per togliere il break).

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19215
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: [Excel] Indicare un range composto da variabili

Postdi mpsinf » 31/12/12 16:52

Riprendo questo vecchissimo post perchè mi sono trovato in una situazione analoga, ossia il seguente codice copia selezionando ciclicamente D10:H10 ...D9:H9 in K1:O1 abassando il dati presenti in basso, e gira"va" senza problemi, anche se secondo me era brutto da vedere :undecided:

Codice: Seleziona tutto
nfg = 0 'azzera contatore fogli
Do Until Sheets(nfg + 1).Name = "Home"
 nfg = nfg + 1

  For a = 9 To 1 Step -1
   If Range("E1").Offset(a, 0).Value <> "" And Range("E1").Offset(a, 0).Value > Range("L1").Value Then
     Range("D" & a + 1 & ":H" & a + 1).Select 'brutto codice a vedersi
     Selection.Copy
     Range("K1:O1").Select
     Selection.Insert Shift:=xlDown
   End If
  Next a
Loop


ora per necessità ho dovuto includerlo in un With wsa --> end with, inserendo i punti davanti ai vari Range

Codice: Seleziona tutto
nfg = 0 'azzera contatore fogli
Do Until Sheets(nfg + 1).Name = "Home"
 nfg = nfg + 1
  Set wsa = Worksheets(Sheets(nfg).Name)
 
 For a = 9 To 1 Step -1
  If .Range("E1").Offset(a, 0).Value <> "" And .Range("E1").Offset(a, 0).Value > .Range("L1").Value Then
     .Range("D" & a + 1 & ":H" & a + 1).Select
     Selection.Copy
     .Range("K1:O1").Select
     Selection.Insert Shift:=xlDown
   End If
  Next a
End With
 Set wsa = Nothing
Loop


Se ora non sono sul relativo foglio corrisponente sul quale sta lavorando (a allora il with end with a che mi serve?) mi dà l'errore
Codice: Seleziona tutto
 .Range("D" & a + 1 & ":H" & a + 1).Select 
---> Errore nel metodo Select per la Classe Range
[/code]

sapete darmi una spiegazione tecnica del fatto ? un errore in Set wsa = Worksheets(Sheets(nfg).Name) ?
inoltre il Set wsa = Nothing se lo elimino mi tiene sempre lo stesso foglio
XP + Excel 2003 Ita
W7 + Excel 2007 Ita
mpsinf
Utente Senior
 
Post: 168
Iscritto il: 03/09/03 18:33

Re: [Excel] Indicare un range composto da variabili

Postdi Anthony47 » 31/12/12 20:10

Nel tuo codice non si vede dove comincia il blocco With, quindi presumo che cominci prima di quanto hai pubblicato.
Se e' cosi', allora il tuo codice contiene alcuni errori fatali:
-modifichi l' oggetto usato da With all' interno del ciclo, pensando cosi' di variare il riferimento alle istruzioni che ereditano il With; ma l' help on-line chiarisce bene che "Dopo aver immesso un blocco With, non sarà possibile modificare oggetto. Ne risulta che non è possibile utilizzare una sola istruzione With per più oggetti diversi". Questo spiega perche' qualsiasi variazione fatta a "wsa" sia inefficace.
-usi Select facendo riferimento a un foglio che non e' attivo, cosa che Select non puo' fare. Fortunatamente puoi usare direttamente .Range("D" & a + 1 & ":H" & a + 1).Copy e .Range("K1:O1").Insert Shift:=xlDown
-hai una struttura del tipo With /Do Until /End With /Loop; ovviamente il rientro al ciclo Do Until avendo rimosso il riferimento impostato da With "impallerà" tutte le istruzioni che invece un riferimento se lo aspettavano. Nel tuo caso credo che la sequenza corretta sia Do Until / With /End With /Loop.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19215
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "[Excel] Indicare un range composto da variabili":


Chi c’è in linea

Visitano il forum: Nessuno e 18 ospiti