2016-11-01 5 views
0

私はVBAにはかなり新しいですが、私は学んでいます。私はワークシート "モデル"が18のテーブルを持っている。私は 'start'と 'end'で範囲を定義しました。下のVBAで見られるように、最初のテーブルはC3:E13に、最後のテーブルはC224:E234にあります。 これをコピーして、Sheet1に1つずつ貼り付けたいと思います。3つの変数を持つVBA forループ

セルB5、B21、B38、...、B166に貼り付ける必要があります。したがって、最初のテーブルはB5に貼り付けられ、B21には2番目のテーブルが貼り付けられます。

私のfor-loopには、この変数 'output'(出力rownumberを定義します)をどのように作成できますか?

Dim start As Long 
Dim eind As Long 
Dim output As Long 

For start = 3 To 224 Step 13 
    end = start + 10 

      'output = --->>> this should be 5, 21, 38, ..., 166. 
      'So something like output = 5 To 166 Step 16 

Sheets("Model").Select 
Range("C" & start & ":E" & end).Select 
Selection.Copy 
Sheets("Sheet1").Select 
Range("B" & output).Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 
Next start 

事前に感謝します。

+0

は、これらの実際*表*(例えば、挿入>表リボンから)はありますか? –

+0

(なお、['.Select' /' .Activate']を使わないことをお勧めします(http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros )) – BruceWayne

答えて

4

21 + 1637であり、ご意見には38ではありません。それがタイプミスかどうかはわかりません。 99%が不要であるavoid Selectに改訂され、ある範囲から別の範囲に値を直接移すことに有利な比較的高価なものを避けることができる。

Dim start As Long 
Dim end As Long 
Dim output As Long 
Dim tbl as Range 
Dim dest as Range 

output = 5 
For start = 3 To 224 Step 13 
    end = start + 10 
    Set tbl = Sheets("Model").Range("C" & start & ":E" & end) 
    Set dest = Sheets("Sheet1").Range("B" & output).Resize(tbl.Rows.Count, tbl.Columns.Count) 
    dest.Value = tbl.Value 
    output = output + 16 

Next 

あなたのテーブルが挿入>表から作成された適切なテーブルである場合、あなたのような何かを行うことができます:あなたはこのような何かを試みることができる

Dim tbl as ListObject 
Dim t as Long 
Dim dest as Range 
For t = 1 to Sheets("Model").ListObjects.Count 
    Set tbl = Sheets("Model").ListObjects(t) 
    Set dest = Sheets("Sheet1").Range("B" & (5 + ((t - 1) * 16))) 
    dest.Resize(tbl.Rows.Count, tbl.Columns.Count).Value = tbl.Value 
Next 
+0

良い答え - forループを開始する前に 'output'を5に設定してから、' IIF() 'を取り除くこともできます –

+0

@ JohnBus​​tosはい、そうです。私はそれがより好きです。改訂されました。 –

+0

これは良い方法ですが、ありがとうございます。あなたはちょうど私の人生を楽にしました;) – Z117

0

私は事柄を全く違ったものにすることをお勧めしますが、あなたの実際の質問に答えることはできますが、まだ有効であり、依然として完全に有効なプログラミング問題です。これを行うには

の方法は、実際には別の「カウンタ」変数を持つことです(私は通常私の古いC++の大学のコースからiそれを呼び出す)、その後、ループ文におけるつつstartendoutputをインクリメントします。

Dim i As Integer 

Dim start As Long 
Dim end_ As Long 
Dim output As Long 

i = 0 
Do 

    start = 3 + i * 13 
    end_ = start + 10 
    output = 5 + i * 16 

    ' ... your code.... 

    i = i + 1 
Loop While start <= 224 

基本的には、必要に応じてすべての変数を設定し、必要に応じて終了基準を設定することができます。

私はそれが意味を成してあなたのために働くことを望みます!

+0

ありがとう!この意味で意味があります:) – Z117

+0

嬉しいことに、あなたが探していたものが得られてうれしいです。あなたが正しい解決策を受け入れたと私は信じています。@DavidZemensソリューションはこれを行う最善の方法です。これは同じ結果を得るための別の方法であり、より明示的な変数設定が可能です。 –

0

を。範囲と目標とする高さ/幅の間隔を取得するには、増分(ループステップ値、j + 10i + 10、およびj = j + 11など)を使用して周りを再生します。

Public Sub copyTables() 

Dim i As Integer, j As Integer 
Dim ws1 As Worksheet, ws2 As Worksheet 

Set ws1 = ThisWorkbook.Sheets("Sheet1") 
Set ws2 = ThisWorkbook.Sheets("Sheet2") 

j = 5 

For i = 3 To 224 Step 11 
    ws2.Range("B" & j, "D" & j + 10).Value = ws1.Range("C" & i, "E" & i + 10).Value 
    j = j + 11 
Next i 

Set ws1 = Nothing 
Set ws2 = Nothing 

End Sub 
0

あなたはこれを試みることができる:

Sub main() 
    Dim iTab As Long 

    With Worksheets("Model").Range("C3:E13") 
     For iTab = 1 To 18 
      Worksheets("Sheet1").Range("B5:D15").Offset((iTab - 1) * 16).Value = .Offset((iTab - 1) * 13).Value 
     Next iTab 
    End With 
End Sub 
関連する問題