2012-02-22 3 views
6

以下のコードは、選択した範囲(rngとして渡された)をワークシートの末尾に貼り付けようとしています。 すでに2行(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 

したがって、A1とA2が存在し、このメソッドを100回呼び出すと、100個の行が挿入されます。しかし、行が存在しない場合、またはA1のみが存在する場合は、単にA2を上書きします。私は同じ行(上書き)に書き込みをExcelを見ることができました

それは、xlDownが2行未満かどうかを計算する方法とは関係ありません。

ご協力いただければ幸いです。

答えて

29

申し訳ありませんが、私はマイケルの答えに同意しません。

End(xlDown)は、Ctrl + DownのVBAに相当します。

  • Ctrl + Down空欄
  • 行1の値を持つ列が、行1と行1、2 2つの
  • 値でない他の
  • 値を試します、3,7,8,9,13,14および15

これは、すべての異なる行のアイデアを提供します。Ctrl + Downが表示されます。

Set newRange = ws.Range("A1").End(xlDown).End(xlDown).End(xlUp).Offset(1, 0)

は必ずしも最後に使用された行にあなたを取ることはありませんプラス1

私はSet newRange = ws.Range("A1").End(xlDown).Offset(1, 0)は空の列で働いていた驚いています。 Range("A1").End(xlDown)はシートの一番下の行に移動し、.Offset(1, 0)はシートを外します。

は検討:

Dim RowLast As Long 

RowLast = ws.Cells(Rows.Count, "A").End(xlUp).Row 
  • をカラムAが空の場合、RowLast 1.
  • に設定されA1が値を有するが、他のセルに値を持たない場合、RowLastが1に設定されます。
  • 列Aのセル数に値がある場合、RowLastは値を持つ一番下の行に設定されます。
  • 最終行に値がある場合は無視されます。
  • 最後の2行に値がある場合、RowLastはRows.Count - 1に設定されます。

ボロンの行に値がないと仮定します。行1は、その後、空の列で空白になっている場合は、あなたが気にしない場合:

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

は関係なく、シートWSの現在の内容の望ましい結果を与える必要があります。

あなたは、行1があなたに値の異なる組み合わせの効果の理解を得られますCtrl + DownCtrl + Upを試して、空白のままにしている気にしない場合。

+5

+1をきちんと説明してください。つまり、私は "ws.Range(" A1 ")End(xlDown)"を使用して範囲を設定することに決して賛成していません。理由は、間に空白のセルがある場合、(かなりわかりやすく)正しい範囲を与えません。 :) –

+0

トニー、ウルの助けをありがとう。それは私のために働いた。最初の部分について、なぜ私はそれをやったのですか、私は項目18 http://support.microsoft.com/kb/291308に従っていました。これを行う簡単な方法を見て驚いた。ありがとうございました。 – bsr

+0

@SiddharthRout ..または行が空白の場合は最後のセルが悪くなります。ルックアップははるかに優れていますが、関心のあるデータ範囲が空白でないことを確認するためにはまだテストが必要です。何が必要なのかに応じて[Findは簡単にできる](http://stackoverflow.com/q/4872512/641067) – brettdj

1

オフセットの行が範囲の一部ではない行を指しているという問題があります。しかし、オフセットがなければ、値の実際の最後の行になります。だから上から降りようとするのではなく、下から上に上がってみましょう。

Go End(Down)2回:この範囲の最後に1回、この範囲からもう一度出ます。そして、一度終了(最大)を移動して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

それは私のために働くように見えません、それはA2、A3のためのエントリを作成します(そしてA3は残りの時間を書きます)。私はテストファイルを作成し、この質問に添付します。ご協力いただきありがとうございます。 – bsr

関連する問題