2016-12-15 6 views
2

ループとして次のコードを書くにはどうすればいいですか?私は範囲(:17:B L17" )からの行にシート4のテーブルから値をコピーします。ループでそれを行うには、より効率的な方法があるVisual BasicのExcelでループを書く

ActiveSheet.Range("B17").Value = Sheets(4).Range("G8") 

ActiveSheet.Range("C17").Value = Sheets(4).Range("G9") 

ActiveSheet.Range("D17").Value = Sheets(4).Range("G10") 

ActiveSheet.Range("E17").Value = Sheets(4).Range("G11") 
ActiveSheet.Range("F17").Value = Sheets(4).Range("G12") 
ActiveSheet.Range("G17").Value = Sheets(4).Range("G13") 
ActiveSheet.Range("H17").Value = Sheets(4).Range("G14") 

ActiveSheet.Range("I17").Value = Sheets(4).Range("G15") 

ActiveSheet.Range("J17").Value = Sheets(4).Range("G16") 


ActiveSheet.Range("K17").Value = Sheets(4).Range("G17") 

ActiveSheet.Range("L17").Value = Sheets(4).Range("G18") 
+1

参照[フロー制御構造](http://stackoverflow.com/documentation/ vba/1873/flow-control-structures#t = 201612151953105925624)を参照してください。 –

+0

この質問はどのようにしてアップボートになりましたか? – vacip

答えて

8

はい、あります:?

ActiveSheet.Range("B17:L17").Value = Application.Transpose(Sheets(4).Range("G8:G18").Value) 
+3

..............とても素敵! –

+2

@ Gary'sStudentありがとう、しかし、私はちょうどOPが "より効率的な方法ループ"を望んでいたことに気付いた、これはおそらく期待を超えている。 –

+2

Excelにはこの機能が含まれているので、これはより効率的です。間違いなく、これは最適なソリューションです。 – Sgdva

1

あなたはすることができ、このような何か使用して(VB.Netを、しかし、VBAに簡単にコピーする場合があります):

Dim cell as Integer, c as Integer 
cell = 8 
For c = 66 To 76 
    ActiveSheet.Range(Chr(c) & "17").Value = Sheets(4).Range("G" & cell) 
    cell = cell + 1 
Next 

はChr()関数は、文字コードに対応する文字を取得します(66から76 )、この値を文字列 "17"と連結してセル名( "B17"、 "C17"、...)

また、Gのセル番号も同時にインクリメントしています。


使用このあなたが本当にループを使用したい場合は - しかし、そこanswer given by @A.S.H

+0

@ YowE3Kありがとうございます - 強調表示にはあまりにも積極的です。 – vbnet3d

+2

注:これはZまで行えます。それを超えて... –

+1

@ Mat'sMug絶対に正しい...これはもっと多くの可能な値を含むように拡張することができますが、 ASHの答えのように。 – vbnet3d

1

ソリューションの説明のように、より良い方法を、次のようになります。
あなたのルールを確立します!アクティブなシートの範囲で何が変化していますか? for/toサイクルのように、カラムが成長します!それで、それを合計してください。増加する別のものは何ですか? '='の反対側の範囲は、アルゴリズムを設定することによって、行がActivesheet範囲のconstであり、列が反対側のon変数であると言うことができます。
ソリューション:

Sub Test() 
Const TotalInteractions As Long = 11 
Dim CounterInteractions As Long 
    For CounterInteractions = 1 To TotalInteractions 
    'where 1 is column A so when it starts the cycle would be B,C and so on 
    'where 7 is the row to start so when it begins it would became 8,9 and so on for column G 
    ActiveSheet.Cells(17, 1 + CounterInteractions).Value = Sheets(4).Cells(7 + CounterInteractions, 7) 
    Next CounterInteractions 
End Sub 
+0

@ YowE3Kあなたは正しいです、私はそれを更新しました – Sgdva

0

これはおそらく声明とであなたの最も効率的なソリューションです:

Sub LoopExample() 
    Sheets("Sheet4").Range("G8:G18").Copy 
    Sheets("Sheet2").Range("B17").PasteSpecial xlPasteValues, Transpose:=True 
End Sub 
+1

それは単に '.Value's以上をコピーします。それはまた、間違ったシート( 'Sheets(4)')にコピーされ、G8:G18ではなくG8:Q8のセルにもコピーされます。ソースと目的地が間違った方向です。 – YowE3K

+0

@ YowE3Kあなたは印象的です! :D –

+0

上の編集を参照してください。ありがとう! – user1