2012-02-22 74 views
6

Il codice seguente sta tentando di incollare l'intervallo selezionato (passato come rng) alla fine del foglio di lavoro. Funziona se sono già presenti 2 file (A1, A2).Excel vba - xlDown

Sub copyRow(rng As Range, ws As Worksheet) 
    Dim newRange As Range 
    Set newRange = ws.Range("A1").End(xlDown).Offset(1, 0) 
    rng.Copy 
    newRange.PasteSpecial (xlPasteAll) 
End Sub 

Quindi, se A1 e A2 presente e se si chiama questo metodo 100 volte, inserisce 100 righe dopo di loro. Ma, se nessuna riga è presente o solo A1, sovrascrive semplicemente A2. Ho potuto vedere excel scrivere sulla stessa riga (sovrascrivere)

Appare che, qualcosa a che fare con come xlDown calcola se ci sono meno di 2 righe, non è sicuro.

Qualsiasi aiuto sarebbe apprezzato.

risposta

29

Scusa ma non sono d'accordo con la risposta di Michael.

End (xlDown) è l'equivalente VBA di fare clic su Ctrl + Down.

Prova Ctrl + Down con

  • una colonna vuota
  • una colonna con un valore nella riga 1 ma non altre
  • valori nelle righe 1 e 2
  • valori nelle righe 1, 2 , 3, 7, 8, 9, 13, 14 e 15

Questo vi darà un'idea di tutte le diverse righe, Ctrl + Down potrebbe portarti a.

Set newRange = ws.Range("A1").End(xlDown).End(xlDown).End(xlUp).Offset(1, 0) non necessariamente si prende l'ultima riga utilizzato più 1.

Sono sorpreso Set newRange = ws.Range("A1").End(xlDown).Offset(1, 0) lavorato con una colonna vuota. Range("A1").End(xlDown) ti condurrebbe alla riga inferiore del foglio, quindi .Offset(1, 0) proverà a toglierti dal foglio.

consideri:

Dim RowLast As Long 

RowLast = ws.Cells(Rows.Count, "A").End(xlUp).Row 
  • Se colonna A è vuota, RowLast sarà impostato a 1.
  • Se A1 ha un valore ma non altre cellule hanno valori, RowLast sarà impostato a 1.
  • Se un numero di celle nella colonna A ha valori, RowLast verrà impostato sulla riga inferiore con un valore.
  • Se si dispone di un valore nella riga finale, verrà ignorato.
  • Se si dispone di un valore nelle ultime due righe, RowLast verrà impostato su Rows.Count - 1.

Presumo che non ci siano valori nelle righe di borrom. Se non importa se la riga 1 viene lasciato vuoto con una colonna vuota, allora:

RowLast = ws.Cells(Rows.Count, "A").End(xlUp).Row 
Set NewRange = ws.Cells(RowLast + 1, "A") 

dovrebbe dare il risultato desiderato indipendentemente dalle contenuto corrente del ws foglio.

Se si preoccupano riga 1 viene lasciato vuoto, la sperimentazione di Ctrl + Down e Ctrl + Up vi darà una comprensione degli effetti di diverse combinazioni di valori.

+5

+1 per spiegarlo bene. Così com'è, non sono mai stato favorevole all'uso di "ws.Range (" A1 "). End (xlDown)" per impostare un intervallo. Essendo la ragione, non fornisce (abbastanza comprensibilmente) l'intervallo corretto se c'è una cella vuota in mezzo. :) –

+0

Tony, grazie per il tuo aiuto. Ha funzionato per me. Riguardo la prima parte, perché l'ho fatto in quel modo, stavo seguendo l'articolo 18 http://support.microsoft.com/kb/291308. Sorpreso di non vedere un modo semplice per farlo. grazie – bsr

+0

@SiddharthRout .. o peggio l'ultima cella se la riga è vuota. La ricerca è molto meglio, ma è comunque necessario un test per garantire che l'intervallo di dati di interesse non sia vuoto. ['Trova' può essere più semplice] (http://stackoverflow.com/q/4872512/641067) a seconda di cosa è necessario – brettdj

1

Il problema è che la riga Offset punta a una riga che non fa parte dell'intervallo. Ma senza l'offset, si finisce sull'ultima riga effettiva del valore. Quindi, piuttosto che cercare di scendere dall'alto, saliamo dal basso.

Go End (Giù) due volte: una volta per la fine di questo intervallo, Ancora una volta per uscire da questo intervallo. Quindi vai End (Up) una volta e quindi offset di 1:

Sub copyRow(rng As Range, ws As Worksheet) 
    Dim newRange As Range 
    Set newRange = ws.Range("A1").End(xlDown).End(xlDown).End(xlUp).Offset(1, 0) 
    rng.Copy 
    newRange.PasteSpecial (xlPasteAll) 
End Sub 
+0

non sembra funzionare per me, basta creare voci per A2, A3 (e A3 per scrivere resto del tempo). Farò un file di prova e allego questa domanda. Grazie per l'aiuto. – bsr