
やりたいこと:地域ごとに作っているデータがありそのデータを一つのシートにまとめたい。
シート名=地域 になっているのでまとめるシートにシート名も追加したい。
サンプルの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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
VBAについてです。 初心者です。 Resize(.Rows.Count -1)のカッコ内の最初の「
Visual Basic(VBA)
-
i=cells(Rows.Count, 1)とi=cells(Rows.Count, 2)の違い
Visual Basic(VBA)
-
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
-
4
数式による空白を無視して最終行を取得するマクロ
Excel(エクセル)
-
5
【ExcelVBA】全シートのセルの数式を値に変換する事は可能でしょうか?
Visual Basic(VBA)
-
6
マクロで最終行を取得してコピーしたい
Visual Basic(VBA)
-
7
B列の最終行までA列をオートフィル
Visual Basic(VBA)
-
8
文字列の結合を空白行まで実行
Visual Basic(VBA)
-
9
複数の列の値を結合して別の列へ返す
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA セルの値と同じ名前のシー...
-
Excelの中央値の複数条件について
-
エクセルのワークシートが重く...
-
エクセルで入力シートから別シ...
-
ExcelVBAで、指定したシートに...
-
VBA 繰り返しと特定条件の抽出
-
エクセルについて質問です 日付...
-
日付を基準にして別シート転記...
-
エクセルVBAで 指定のデーター...
-
セル内で改行された文字列をセ...
-
Excel 複数のシートからグラフ...
-
エクセル マクロを使って日々...
-
EXCEL VBA 一致しないデータの...
-
Excel ハイパーリンク先のセル...
-
同じExcelのBOOK内で 1枚目の...
-
Excelで数値→文字列変換で指数...
-
Excelで行ごとコピー、同じ行を...
-
たくさん作った同じ設定のグラ...
-
Excelの関数について、特定の文...
-
エクセルにおける、グラフの指...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルのワークシートが重く...
-
ExcelVBAで、指定したシートに...
-
エクセルで入力シートから別シ...
-
VBA セルの値と同じ名前のシー...
-
IF, ISNUMBER, INDIRECTの組み...
-
Excelの中央値の複数条件について
-
エクセルで入力→日付を自動判別...
-
Excel ハイパーリンク先のセル...
-
エクセルVBA:表の内容を担当者...
-
【Excel】VLOOKUP関数で複数の...
-
エクセル マクロを使って日々...
-
指定した日付の範囲内でデータ...
-
エクセルについて質問です 日付...
-
エクセルにて別シートの値を参...
-
エクセル:複数シートのデータ...
-
EXCEL VBA 一致しないデータの...
-
エクセル 毎日更新する表のデ...
-
エクセル シフト勤務表から、...
-
VBAのoffsetの動き方について教...
-
Excel 複数のシートからグラフ...
おすすめ情報