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

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

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

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

マクロ

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

Q&A

解決済

2回答

248閲覧

VBAで複数シートの情報を一つのシートに集約

hajihaji

総合スコア26

VBA

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

マクロ

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

1グッド

0クリップ

投稿2025/04/08 07:58

実現したいこと

VBAで複数シートの情報を一つのシートに集約しようとしています。
この際、収集を除外するシートも設けています。

発生している問題・分からないこと

ただ収集が不規則であり、時には一番右端のシートのみ抽出します。
各シートのセルに結合箇所などはなく、
いろいろ調べてみましたがどうしても原因がわかりません。

該当のソースコード

On Error Resume Next Dim sh1, sh2 As Worksheet Dim dicT As Object Dim i, n,R1, R2 As Long Set sh1 = Worksheets("A") For Each s In ThisWorkbook.Worksheets R1 = sh1.Cells(sh1.Rows.Count, "A").End(xlUp).Row R2 = s.Cells(s.Rows.Count, "B").End(xlUp).Row n = R1 + 1 For i = 2 To R2 If s.Name <> "A" And s.Name <> "B" And s.Cells(i, "B") <> "" Then sh1.Cells(n, "B") = s.Cells(i, "A") n = n + 1 End If Next Next

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

For each ではなくシートをカウントするコードに書き換えましたが現象は変わりませんでした。

補足

特になし

tatsu99👍を押しています

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

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

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

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

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

TakaiY

2025/04/08 08:17

> 収集が不規則であり とはどいうい意味でしょう? 具体的にどのようなことが置きているの説明いただけますか? 回答はここではなく、質問を編集して追記などするといいと思います。
hajihaji

2025/04/08 22:22

ご返信ありがとうございます。 言葉足らずですみません。 やりたいことはシートAのA列にそのほか複数シートB列の情報をすべて抽出することです。 この際、シートAはもちろんシートBも収集対象から除外し、かつ収集先のB列の空欄も除外し、シートAのA列に玉突きで抽出したいのですが、この際、なぜか収集してくれるシートとそうでないシート、また抽出してくれる情報にムラがあるのです。具体的にはシートCは抽出してもシートDは抽出しない、B列の1行は抽出しても2行目は抽出しない。
TakaiY

2025/04/09 00:49

ここはコメントを書くところなので、ここではなく、質問を編集して内容を変更したほうが多くの人に見てもらえますよ。(最初に書いたとおり)
hajihaji

2025/04/09 02:00

ありがとうございます。 抽出先のシートに問題がある可能性があるので一度そこを確認しようと思います。
guest

回答2

0

集計先はシートAのB列と解釈します。(A列は集計先でない)
R1 = sh1.Cells(sh1.Rows.Count, "A").End(xlUp).Row
は、A列の最終行を取得しているので、どのシートを集計している場合でも、
常に同じ結果になります。
B列に集計するので、
R1 = sh1.Cells(sh1.Rows.Count, "B").End(xlUp).Row
と変えてください。
そうすると、
A列はなにも集計されないでB列に集計されるようになります。

余談ですが、
Dim sh1, sh2 As Worksheet
とすると、sh1はVariant型になります。
sh1をWorksheet型にしたいなら
Dim sh1 As Worksheet
Dim sh2 As Worksheet
とするか
Dim sh1 As Worksheet, sh2 As Worksheet
としてください。
Dim i, n, R1, R2 As Long も同様です。
i,n,R1はVariant型になります。

投稿2025/04/08 09:11

tatsu99

総合スコア5531

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

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

hajihaji

2025/04/08 22:22

ご返信ありがとうございます。 参考コードが不適切でしたので再度修正いたしました。 やりたいことはシートAのA列にそのほか複数シートB列の情報をすべて抽出することです。 この際、シートAはもちろんシートBも収集対象から除外し、かつ収集先のB列の空欄も除外し、シートAのA列に玉突きで抽出したいのですが、この際、なぜか収集してくれるシートとそうでないシート、また抽出してくれる情報にムラがあるのです。具体的にはシートCは抽出してもシートDは抽出しない、B列の1行は抽出しても2行目は抽出しない。 ※型の件、ありがとうございます。初めてしりました。 On Error Resume Next Dim sh1 As Worksheet, sh2 As Worksheet Dim dicT As Object Dim i As Long, n,R1, R2 As Long Set sh1 = Worksheets("A") For Each s In ThisWorkbook.Worksheets R1 = sh1.Cells(sh1.Rows.Count, "A").End(xlUp).Row R2 = s.Cells(s.Rows.Count, "B").End(xlUp).Row n = R1 + 1 For i = 2 To R2 If s.Name <> "A" And s.Name <> "B" And s.Cells(i, "B") <> "" Then sh1.Cells(n, "A") = s.Cells(i, "B") n = n + 1 End If Next Next
tatsu99

2025/04/09 00:52 編集

こちらでも提示されたコードで試験してみました。こちらで、確認した範囲では、正常に動作しています。 フィルターのかかったシートなどありませんでしょうか。フィルターがかかっていると、最終行を正しく取得できない場合があります。 型の件ですが Dim i As Long, n,R1, R2 As Long は Dim i As Long, n As Long, R1 As Long, R2 As Long としてください。 Dim i As Long, n,R1, R2 As Longとすると n,R1がVariant型になります。
hajihaji

2025/04/09 02:00

ご回答ありがとうございます。 やはり抽出対象のシートのほうに原因があるのかもしれないので再度確認をしてみます。
tatsu99

2025/04/09 02:09

>具体的にはシートCは抽出してもシートDは抽出しない 抽出されないシートDとシートA、シートBの3つだけを残し、ほかのシートはすべて削除して、 試験すれば、原因がわかりやすくなるかと。 その場合は、シートDを一番左端に配置しておくと、 For Each s In ThisWorkbook.Worksheetsの個所で、シートDが最初にsに割り当てられるので、 step単位で実行を行えば、何が起こっているのかが、判るかと思います。
guest

0

自己解決

R1 = sh1.Cells(sh1.Rows.Count, "A").End(xlUp).Row
n = R1 + 1
上記の2文をFor eachの上にもってきたところ解決しました。

On Error Resume Next
Dim sh1 As Worksheet, sh2 As Worksheet
Dim dicT As Object
Dim i As Long, n As Long ,R1 As Long, R2 As Long
Set sh1 = Worksheets("A")
R1 = sh1.Cells(sh1.Rows.Count, "A").End(xlUp).Row
n = R1 + 1
For Each s In ThisWorkbook.Worksheets
R2 = s.Cells(s.Rows.Count, "B").End(xlUp).Row
For i = 2 To R2
If s.Name <> "A" And s.Name <> "B" And s.Cells(i, "B") <> "" Then
sh1.Cells(n, "A") = s.Cells(i, "B")
n = n + 1
End If
Next
Next

投稿2025/04/09 02:27

hajihaji

総合スコア26

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問