質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

2回答

1702閲覧

エクセルで複数シートの一部分を一つにまとめたいのですが、どの部分がおかしいのかわかりません。

退会済みユーザー

退会済みユーザー

総合スコア0

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2021/01/21 04:29

エクセルで複数シートの一部分を一つにまとめたいのですが、どの部分がおかしいのかわかりません。
VB歴が浅いためひらめきません。よろしくお願いします。

Sub まとめ() '変数を宣言 Dim i Dim j Dim k Dim n 'セルに値が存在する数を変数nに代入 n = Cells(Rows.Count, "A").End(xlUp).Row 'シート1から31までを繰り返す処理 For j = 1 To 31 '5からセルの値が空になるまでループする処理 For k = 5 To n '5行目から順に入力される処理 For i = 5 To Sheets("まとめ").Range("A10000").End(xlUp).Row + 1 '["A" & i]が空白のときに実行される If Sheets("まとめ").Range("B" & i).Value = "" Then '入力されているセルを「まとめ」シートに移動する Sheets("まとめ").Range("A" & i).Value = j Sheets("まとめ").Range("B" & i).Value = Sheets(j).Range("A" & k).Value Sheets("まとめ").Range("D" & i).Value = Sheets(j).Range("C" & k).Value Sheets("まとめ").Range("F" & i).Value = Sheets(j).Range("E" & k).Value Sheets("まとめ").Range("H" & i).Value = Sheets(j).Range("G" & k).Value Sheets("まとめ").Range("I" & i).Value = Sheets(j).Range("H" & k).Value Sheets("まとめ").Range("J" & i).Value = Sheets(j).Range("I" & k).Value Sheets("まとめ").Range("K" & i).Value = Sheets(j).Range("J" & k).Value End If Next Next Next End Sub コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2021/01/21 05:03

> エクセルで複数シートの一部分を一つにまとめたいのですが、どの部分がおかしいのかわかりません。 現状の課題は何でしょうか?質問のコードを実行するとどのような結果となるのでしょうか?
退会済みユーザー

退会済みユーザー

2021/01/21 05:24

コードを実行すると空白のままで実行前と結果が変わらない状況です。 まずは実行結果が表示されるところまでできればいいと思っています。
guest

回答2

0

ExcelVBA

1Sub test() 2 Dim wshResult As Worksheet 3 Dim rngCopyFrom As Range 4 Dim ixRow As Long 5 Dim i As Long, j As Long 6 7 Set wshResult = Worksheets("まとめ") 8 ixRow = 2 9 10 For i = 1 To 3 11 '各シート転記元のセル範囲の取得 12 With Worksheets(i).UsedRange 13 Set rngCopyFrom = Application.Range(.Range("A5"), .Cells(.Cells.Count)) 14 End With 15 'コピー元の行数を数える 16 j = rngCopyFrom.Rows.Count 17 18 '列毎の転記 19 With wshResult.Cells(ixRow, 1).Resize(j) 20 .Columns("A").Value = Worksheets(i).Name 21 .Columns("B").Value = rngCopyFrom.Columns("A").Value 22 .Columns("D").Value = rngCopyFrom.Columns("C").Value 23 .Columns("F").Value = rngCopyFrom.Columns("E").Value 24 .Columns("H").Value = rngCopyFrom.Columns("G").Value 25 .Columns("I:K").Value = rngCopyFrom.Columns("H:J").Value 26 End With 27 28 '次の転記先行番号の用意 29 ixRow = ixRow + j 30 Next 31End Sub

For ~ Nextを入れ子にしてインデックス番号をごねごね作って、
ぐるぐるループするとわけわかんなくなりますよね。

一括でできるところは一括でまとめて、
セルの読み書きの回数をできるだけ少なくすることで、
読みやすくなるし、処理の高速化も見込めます。

そのためには、セル範囲の表現方法を学ぶとともに、
「オブジェクト変数」を上手く使えるようになるとよいかと思います。

あと、複数シートを扱う場合は、
どのシートの話かも明示する必要があります。

投稿2021/01/21 07:13

mattuwan

総合スコア2163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

少し触ってみましたが気になる点を複数点

'セルに値が存在する数を変数nに代入 n = Cells(Rows.Count, "A").End(xlUp).Row

このタイミングでworksheetの指定がありません。
そのためactivesheetでの参照になっていると思われます。
また、値を取得するタイミングがforループの中に組み込まれていないため、この値は初回に取得すると更新されません。

'シート1から31までを繰り返す処理 For j = 1 To 31

と書いていますがWorksheets(j)といった記述が一切ないためsheet1からsheet31を参照していません。
この下にn = worksheets(j).Cells(Rows.Count, "A").End(xlUp).Rowと書けば動きはしますが、この場合はシートの順番で指定になるのでfor Eachで全シート巡回した方が想定外の動きになりません。
(一番左端にまとめがあったり勝手にシートを動かされたりするとバグる)

'5からセルの値が空になるまでループする処理 For k = 5 To n

最初の点に記載があるようにアクティブシートのA列を一回だけ参照しているため、例えばnの値が1であればループの中に入らずそのまま終了します。

'5行目から順に入力される処理 For i = 5 To Sheets("まとめ").Range("A10000").End(xlUp).Row + 1

Range("A10000")と書いてあるので末尾を取得したいのだと思いますが、Rows.Countなら正確な末尾を取得します。(一行目で使用しています)
2007以降なら1048576、2003なら65536になります。

[追記]
セルの指定はRange("A"&i)みたいなA1形式よりもCells(1,i)みたいなR1C1形式の方が使いやすいので慣れた方がいいです。
Range(cells(1,1),Cells(3,1))で複数範囲も指定できます。

投稿2021/01/21 05:47

編集2021/01/21 06:02
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問