2016-06-16 19 views
2

インデックス番号で行全体をコピーし、特定の条件が満たされたときに異なるインデックス番号を持つ別の行に貼り付けようとしています(問題は条件付きロジック)。私は次のようなことを考えています:Excelのマクロでインデックス番号で行をコピーして貼り付け

Sub Makro1() 

Dim i As Integer 

With ActiveSheet 
    'for looping 
    totalRows = .Cells(.Rows.Count, "A").End(xlUp).Row 

    'index of last row even after rows have been added 
    lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 

    'data starts at row #3 
    For i = 3 To totalRows 
     If .Cells(i, 19).Value > 0 Then 
      Number = .Cells(i, 19).Value 
      Do While Number > 0 
       lastRow = lasRow + 1 
       'Next line doesnt do anything 
       .Rows(lastRow) = .Rows(i).Value 
       Number = Number - 1 
      Loop 
     End If 
    Next i 
End With 
End Sub 

ロジックは、そのように動作しますが、行は貼り付けられません。私は一歩一歩を踏み出しましたが、問題は論理ではないと確信しています。

+0

'TotalRows'変数と' LastRow'変数は、あなたが期待している値を与えますか? – RGA

+1

また、 'Lastrow = lastRow + 1'行にタイプミスがあるようです。それがあなたのコードでエラーを引き起こしているのかどうかわかりません(モジュールの先頭に 'Option Explicit'を使わないと表示されません) – RGA

+0

それはtotalrowsのように見え、lastrowは同じ行になるでしょうか? –

答えて

2

Rows(i)をコピーして、値としてRows(lastRow)に貼り付けるとします。あなたがRows(lastRow)をコピーしてRows(i)の値として、それを貼り付けたい場合は

.Rows(i).Copy 
.Rows(lastRow).PasteSpecial xlPasteValues 

それとも

.Rows(lastRow).Copy 
.Rows(i).PasteSpecial xlPasteValues 

:だから、あなたは、次の2行で

.Rows(lastRow) = .Rows(i).Value 

この行を交換する必要があります。

編集:

xlPasteAllとしてペーストタイプを使用して、すべてのもの(式+値+フォーマット)を貼り付けます。

参考:私は

これだけでブレークポイントを追加するためにmsdn

2

範囲をコピーし、コピー[先]

角括弧は、宛先オプションのパラメータであることを示す)

構文

範囲(貼り付け。宛先範囲を指定しないと、選択範囲がクリップボードにコピーされます。それ以外の場合は、最初の範囲を直接新しい場所にコピーします。

変更この行:

.Rows(LASTROW)= .Rows(I).Valueの

へ:

.Rows(LASTROW).copy .Rows (i)

.Rows(LASTROW).copy .Cells(I、1)

も動作します。 Excelは新しいデータに合わせて宛先範囲のサイズを変更します。

+0

ここで 'Destination:='呼び出しは不要ですか? – RGA

+1

@RGA 'Destination:='呼び出しはオプションです。両方とも '.Rows(1).Copy目的地:=。行(2) 'と' .Rows(1).Copy .Rows(2) 'と同じことをします –

+1

@Orionsはこれを知らなかった。 – RGA

2

あなたのコードが動作します。Rows(lastRow) = .Rows(i).Value声明などイミディエイトウィンドウで、クエリ、関連するすべての変数の値、:一方で

?lastRow 
?.Rows(lastRow).Address 
?i 
?.Rows(i).Address 

あなたは

  • は、あなたのコードモジュールの最上部にOption Explicit文を追加することができ

    これにより、すべての変数を宣言して余分な作業が必要になりますが、変数の使用方法やスペルミスをより詳細に制御できるので、デバッグ時間を節約できます。

  • 個の
  • DIM変数は32767

  • 次いで、行インデックスより高い処理

がはるかに好きな範囲オブジェクトのResize()方法を使用して、内側ループを回避するために、Longタイプのように、行インデックスを保持するために次の

Option Explicit 

Sub Makro1() 

    Dim i As Long, totalRows As Long, lastRow As Long, Number As Long 

    With ActiveSheet 
     'for looping 
     totalRows = .Cells(.Rows.Count, "A").End(xlUp).Row 

     'index of row to add from 
     lastRow = totalRows + 1 '<--| start pasting values one row below the last non empty one in column "A" 

     'data starts at row #3 
     For i = 3 To totalRows 
      If .Cells(i, 19).Value > 0 Then 
       Number = .Cells(i, 19).Value 
       .Rows(lastRow).Resize(Number).Value = .Rows(i).Value 
       lastRow = lastRow + Number 
      End If 
     Next i 
    End With 
End Sub 
関連する問題