
やりたいこと:地域ごとに作っているデータがありそのデータを一つのシートにまとめたい。
シート名=地域 になっているのでまとめるシートにシート名も追加したい。
サンプルのVBA
Sub sh1()
Dim A
'2つ目のシートから最終シートまでループ
For i = 2 To Sheets.Count
'まとめシートの最終セルを取得
Set A = Sheets("統合").Cells(Rows.Count, "A").End(xlUp)
With Sheets(i).Range("A1").CurrentRegion
'データ部分をコピー
.Resize(.Rows.Count - 1).Offset(1, 0).Copy A.Offset(1, 1)
'シート名を入力
A.Offset(1, 0).Resize(.Rows.Count - 1) = Sheets(i).Name
End With
Next
End Sub
ー--
ここで、わからないのが、素直にデータの開始がA1ならよいのですが、A3からタイトル行があり、データが入っています。
With Sheets(i).Range("A1").CurrentRegion
ここは、
With Sheets(i).Range("A3").CurrentRegion
になおす、そして、
'データ部分をコピー
.Resize(.Rows.Count - 1).Offset(1, 0).Copy A.Offset(1, 1)
ここのoffsetの値をどうすればいいのかがわかりません。
どなたかご教示ください。
No.1ベストアンサー
- 回答日時:
こんばんは
この様な疑問が所維持た場合、1つずつ整理して確認するのが良いと思います
どのように確認するのか・・・
ご質問の場合は、実行によるセル範囲を確認すれば良いと思いますので
各セル範囲取得コードの命令をSelectとかDebug.Print 命令.Address
などとしてステップ実行などで確認していくと命令の挙動がつかめます
考えすぎかも知れませんが、ご質問の中で躓きになっている原因は
.CurrentRegionでは無いかと推測します
A1から始まるターゲット範囲があるとして、(1行目が見出し行)
これが上手う行くとして・・
これをA3~にすると とありますが・・
1,2行目にデータが無い空行の場合にしか思うようにはなりません
言い方を変えると1,2行目にデータがある場合は
Sheets(i).Range("A1").CurrentRegion も
Sheets(i).Range("A3").CurrentRegion も同じ範囲がを示すと言う事です
従って、.Resize .Offset 共に1行目A1が起点(最上部左セル)になるので3つ下にずらし3つ小さくする必要があると思われます
(3行目見出しの場合A4以下)
.Resize(.Rows.Count - 3).Offset(3, 0)
もし、1,2行目にデータが無ければ(3行目見出し行)
Sheets(i).Range("A3").CurrentRegionがデータ範囲のみを取得するので .Resize .Offset 共にそのまま(1つ下で1つ小さくする)で良いと思います
Sub sh1()
Dim A
'2つ目のシートから最終シートまでループ
For i = 2 To Sheets.Count
'まとめシートの最終セルを取得
Set A = Sheets("統合").Cells(Rows.Count, "A").End(xlUp)
Sheets(i).Select
Sheets(i).Range("A1").CurrentRegion.Select
With Sheets(i).Range("A1").CurrentRegion
'データ部分をコピー
.Resize(.Rows.Count - 1).Offset(1, 0).Select
Sheets("統合").Select
A.Offset(1, 1).Select
'シート名を入力
A.Offset(1, 0).Resize(.Rows.Count - 1).Select
End With
Next
End Sub
上記確認コードはコピペで作ったのでエラーがあったら許して
F8キーで(各定数を変えて)試してみてください
変化がわかれば簡単ですよね
こんばんは
.CurrentRegionのこと
目からうろこでした。offsetにばかりとらわれていて、
.CurrentRegionは、なんかそのままかけばいいのかぐらいの浅い考えでした。まさにおっしゃる通りでした。
サンプルもありがとうございます。
定数をかえつつ頑張ってみます。
1こずつ考えていくことができていませんでした。思い込みが強かったです。
No.3
- 回答日時:
回答がダブってたらごめんなさい。
>ここのoffsetの値をどうすればいいのかがわかりません。
項目行を抜いてデータだけをと言うのなら変える必要はないのでは?
質問文からは1行目・2行目には何も入力がないと読み取れます。
それとも何かタイトルの様なものが入力されているのでしょうか?
こんばんは、ありがとうございます。
1行目、2行目はメモ的なものがはいっています。
今月の集計実施日、営業部門コードなどです。
上司に確認したら、そこはけさないでね。そのままで計算してといわれました。A1からにしたい
No.2
- 回答日時:
こんばんは
CurrentRegionは指定したセルと連続してデータが入力されているセル範囲を取得します。
ですので、そのシートの1行目や2行目の状態によって、
Sheets(i).Range("A3").CurrentRegion
で得られるセル範囲の左上は、A1セル、A2セル、A3セルの3通りの可能性が考えられます。
3行目を除いて、4行目以降を指定するのなら、範囲の左上が
A1の場合、減ずる行数=3、オフセット=3行
A2の場合、減ずる行数=2、オフセット=2行
A3の場合、減ずる行数=1、オフセット=1行
とすれば良いことになります。
もしも、1行目、2行目の状態が定型で固定ならば、場合分けは不要で固定値でも処理できますね。
ちなみに、上記の差分の行数は
4 - .Cells(1).Row
で計算することができます。
ご提示のサンプルでは、1行目がタイトルで、2行目以降を指定したいので、行数-1、オフセット+1と固定値にしていることになります。
いずれの場合でも、「タイトル行のみでデータがない場合」にはresize後の行数として「0」を指定することになってしまうので、エラーが発生します。
「必ずデータが存在する」保証があるなら、気にする必要はありませんけれど、そうでない場合は、「対象行数が0ではない」ことをチェックしておく方が良いかも知れません。
別の方法として、「最終行を求める」という方法もあります。
ご存じとは思いますが、
lastR = Cells(Rows.Count, 1).End(xlUp).Row
でA列の最終行を求めることができますので、これを利用して
・lastRが4以上であれば、4行目から「lastR - 3」行分を取得
・lastRが3以下ならば、(データがないので)処理は飛ばしてもよい
とすることも可能です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 集計シートA列のコードと一致する右に並んだシート名(コード)の3行目から10行目をコピーして貼り付け 4 2022/08/18 15:24
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Excel(エクセル) 並べ替え、ソートの構文がわからない。 お世話になります。VBA超初心者です。 エクセルでワークシート 2 2023/06/28 21:00
- Visual Basic(VBA) エクセル VBA 処理スピードを上げたいのですが。 6 2023/03/31 20:52
- Visual Basic(VBA) 最終行の指定について教えてください。 複数シートを1シートへまとめる下記マクロでは各シートの6行目を 1 2022/10/04 18:37
- Excel(エクセル) マクロで行を追加、削除すると行位置がずれますが、解決方法はありませんか?。 5 2022/05/28 16:03
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) 形式を選択して貼り付け 以下のコードで「元」シートと「先」シートのA列に同じ値があったら指定範囲をコ 5 2022/11/11 07:30
- Excel(エクセル) マクロで最終行から上に検索を逆にしたい 1 2022/05/17 18:27
このQ&Aを見た人はこんなQ&Aも見ています
-
VBAについてです。 初心者です。 Resize(.Rows.Count -1)のカッコ内の最初の「
Visual Basic(VBA)
-
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
i=cells(Rows.Count, 1)とi=cells(Rows.Count, 2)の違い
Visual Basic(VBA)
-
-
4
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
5
Excelで隠れてしまった図やテキストボックスを探す方法
Excel(エクセル)
-
6
VBAでシートコピー後、シート名が重複している時の処理
Access(アクセス)
-
7
数式による空白を無視して最終行を取得するマクロ
Excel(エクセル)
-
8
VBAのオートフィルターで該当行がない場合に処理を止めたい
Excel(エクセル)
-
9
vba 2つの条件が一致したらコピーして別シートに値のみ貼り付け
Visual Basic(VBA)
-
10
【ExcelVBA】全シートのセルの数式を値に変換する事は可能でしょうか?
Visual Basic(VBA)
-
11
文字列の結合を空白行まで実行
Visual Basic(VBA)
-
12
マクロで最終行を取得してコピーしたい
Visual Basic(VBA)
-
13
複数の列の値を結合して別の列へ返す
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelVBAで、指定したシートに...
-
エクセルで入力シートから別シ...
-
IF, ISNUMBER, INDIRECTの組み...
-
データを時系列で表示させたい
-
Excel 複数のシートからグラフ...
-
Excelの選択肢をポップアップリ...
-
【Excel】VLOOKUP関数で複数の...
-
excelでデータの集計
-
エクセルのワークシートが重く...
-
Excelマクロで毎月のデータ一覧...
-
EXCELでシートごとの合計を一つ...
-
Excel ハイパーリンク先のセル...
-
EXCEL-VBAで、別ファイルのシー...
-
エクセル:複数シートのデータ...
-
VBA セルの値と同じ名前のシー...
-
エクセルVBAで 指定のデーター...
-
EXCELで困ってます。今日中には...
-
エクセルにて別シートの値を参...
-
質問:特定文字列から空白行ま...
-
指定した日付の範囲内でデータ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA セルの値と同じ名前のシー...
-
エクセルのワークシートが重く...
-
Excelの中央値の複数条件について
-
Excel ハイパーリンク先のセル...
-
ExcelVBAで、指定したシートに...
-
IF, ISNUMBER, INDIRECTの組み...
-
エクセルで入力シートから別シ...
-
エクセルについて質問です 日付...
-
エクセルVBA:表の内容を担当者...
-
指定した日付の範囲内でデータ...
-
VBAのoffsetの動き方について教...
-
EXCEL VBA 一致しないデータの...
-
エクセルで入力→日付を自動判別...
-
エクセル マクロを使って日々...
-
VBAを利用しオートフィルタで日...
-
エクセル 毎日更新する表のデ...
-
【Excel】VLOOKUP関数で複数の...
-
エクセル:複数シートのデータ...
-
Excel 複数のシートからグラフ...
-
質問:特定文字列から空白行ま...
おすすめ情報