
お世話になります。VBA初心者です。
複数ブックをシートごとにデータをマージするソースコードで、
以下部分の動きがなぜ必要なのかがわかりません。
新しいブックに、既存ブックと同じシートを作っていくのですが、作成したあとに余分なシートを削除する、とあります。
余分なシートが作成されるケースが思い浮かばないのですがどんな場合でしょうか。
よく、VBAのコードを見ていると、
0を代入し初期化したり、clear.contentsなどと、なにか処理を始める前に、きれいにするような動きを見かけます。これらも意味がよくわからないのですが、以下のケースも、何かを新たに作成したら、セットで余分な何かを削除するような動きを入れるものなのでしょうか?
ずっと考えているのですがよくわかりません。
どなたか教えていただけないでしょうか?
'新規ブック及びシートの作成
sheet_names = Array("Sheet1", "Sheet2", "シート1", "シート2")
Set twb = Workbooks.Add
'全てのシートを作成する
For i = 0 To UBound(sheet_names)
Call add_sheet(twb, sheet_names(i))
Next
'余分なシートを削除する
For i = twb.Worksheets.count To 1 Step -1
sh_name = twb.Worksheets(i).Name
Call del_sheet(twb, sh_name, sheet_names)
Next
A 回答 (21件中11~20件)
- 最新から表示
- 回答順に表示
No.10
- 回答日時:
No9です。
①の行はこのサイトで表示すると2行ですが、実際は1行です。
VBE(マクロを表示している画面)に取り込んだ時、1行になることを確認してください。
②についても同様です。
No.9
- 回答日時:
>データ統合が必要のないシート目次は、BV列まで列名が入っています。
>データ統合が必要な、data1~data7は、見出しはAL列まで固定で、
この情報が正しければ、
sheet_names = Array("data1","data2","data3","data4","data5","data6","data7")
にしなければいけませんが、そのようになってますでしょうか。
又、data1~data7の最終列はAL列ということなので、
現在は最終列をマクロで算出していますが、AL決め打ちのほうが、
copy時のエラーが発生しなくなる可能性が高くなります。
データ統合が必要なのはdata1~data7だけであれば、そのようにして試してみる価値はあるかと思います。
If count = 1 Then
wb.Worksheets(sh_name).Range("A1:" & ecol & "3").Copy twb.Worksheets(sh_name).Range("A1")・・・①
maxrow_trg = 3
End If
If maxrow_src > 3 Then
wb.Worksheets(sh_name).Range("A4:" & ecol & maxrow_src).Copy twb.Worksheets(sh_name).Range("A" & maxrow_trg + 1)・・・②
End If
の①②を
①
wb.Worksheets(sh_name).Range("A1:AL3").Copy twb.Worksheets(sh_name).Range("A1")
②
wb.Worksheets(sh_name).Range("A4:AL" & maxrow_src).Copy twb.Worksheets(sh_name).Range("A" & maxrow_trg + 1)
のようにしてください。
No.8
- 回答日時:
こちらで提示した
sheet_names = Array("Sheet1", "元データ", "元データ2")
の行ですが
あなたの環境にあわせて、きちんと設定しなければいけません。
実際は、どのようになっていますか。
そこに、目次、Sheet1などがあってはいけません。
ありがとうございます。上記項目は、「新規ブック及びシートの作成」箇所の「sheet_names=Array("","","")」の箇所と認識しているのですが、
こちらは必要なシートのみにしています。(先ほど目次が含まれていたので、削除して実行しました。sheet1はそもそも指定しておりませんでした)
再度確認し、実行すると先ほどと同じエラー「新規ブックから余分なシートを削除する」の制御の、
twb.worksheets(sheet_name).delete の箇所で「インデックスが有効範囲がない」のエラーが発生してしまいます。
No.7
- 回答日時:
>wb.Worksheets(sh_name).Range("A1:" & ecol & "3").Copy twb.Worksheets(sh_name).Range("A1")
>maxrow_trg = 3
>でエラー「この操作は結合したセル範囲には行えません」となり
>2つ目以降のブックのデータ追記行うことができません。
1.エラー発生時のsh_nameはどうなっていますか。
2.エラー発生時のecol の値はどうなっていますか。
3.ecolの値(例:Xとします)が、該当シート(sh_nameで示されるシート)の最終列になっています。
実際の最終列がZ列なら、マクロで算出したecolが正しくないということになります。ecolと実際の最終列は一致していますか。
4.エラーの発生したシートの見出し部分(3行分)の画像を提示していただくことは可能でしょうか。(最初の列から最後の列まですべての列です)
質問を拾っていただきありがとうございます!
昨日質問した際は、余分なシートを削除する制御をコメントブロックした状態でした。教えていただき理解できましたので、この部分のコメントブロックを解除し実行しました。
すると
’新規ブックから余分なシートを削除する(del_sheetのプロシージャ)
の8行目「twb.worksheets(sheet_name).Dekete」で「インデックスが有効範囲にない」とエラーが出ます。
sheet_nameにカーソルをあてるとデータが入っている1枚目のシート名が格納されています。
Book1が作成されており、sheet1(不要),目次(不要),data1(シート名です)~data7 が作成されている状態です。中身はブランクです。
ここで改めて余分なシートを削除する箇所をコメントアウトして実行しました
2、3のご質問について→
エラー発生時のecolはAL列が格納されており正しいように見受けられます。
4 本番データの画像を提示することは難しいのですが、補足で画像を添付しました。K列以降も、A~E列のどれかのパターンになっております。
データ統合が必要のないシート目次は、BV列まで列名が入っています。
データ統合が必要な、data1~data7は、見出しはAL列まで固定で、
1レコードでもあるとすると、AL列まで抜けなくデータが格納されています。
データ内容は日付、文字列、数値のどれかとなります。
以上大変お手数ですが、引き続き教えていただきたくよろしくお願い申し上げます。
No.6
- 回答日時:
こんばんは
>0を代入し初期化したり、clear.contentsなどと、なにか処理を始める前に、きれいにするような動きを見かけます。これらも意味がよくわからない
これは、VBAで処理結果を(繰り返し)出力する時に処理範囲が変わる場合に既存データを無くすために使う事が多いかと思います。
例えば、
Sheets("Sheet2").Range("A2").CurrentRegion.Copy Sheets("Sheet1").Range("A1")
Sheet2のA2セルを含む空白セルに囲まれた範囲をSheet1のA2セルを基準にコピペするコードですが、Sheet2の作業で毎回範囲が変わる場合、ペースト先には先の処理データが残る可能性があります。
Sheet1で引き続き
With Sheets("Sheet1")
myList = Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp))
end With
と配列にA列のデータを入れるような処理をしたら・・・正しく取得できませんね。従って、先の処理のペースト前に.ClearやClearContentsを実行します
(ロジックを考えれば上記は回避できるかも知れませんが、Sheets("Sheet1")を閲覧となるとクリアーした方が早いですね)
>余分なシートが作成されるケースが思い浮かばないのですがどんな場合でしょうか。
Workbooks.Addは新規ブックを作成します。
この場合、Excelのオプション 基本操作 新規ブックの作成時 項目に準じ新規ブックを作成します。したがって、この設定は変更できる為、人によって違う可能性があります。
また、Workbooks.Addメソッドを使ってブックを作り
更にSheets.Add(After:=Sheets(Sheets.Count))でシートを追加すると
Workbooks.Addメソッド作られたシートを使わず処理が進む可能性があるの
余分なシートを削除するなんて事になる場合があります。
最初にWorkbooks.Addメソッドを使う時に作成シート数を操作する事もあります。
Application.SheetsInNewWorkbook =2
この場合、余分なシートを作成する事なくシートを指定してコピペなどが行えます。
(Application.SheetsInNewWorkbookはそのままオプションに登録されるので実行前の値を変数などに一時保存して戻すような処理が必要です)
更に ActiveSheet.Copyメソッドの場合、新規ブックに1シートのみが作成できます。
ActiveSheet.Copy を行ってからSheets.Addでシートを増やすと言うのもありですね。
ブックをまるっとコピーして、それこそ不要シートを削除なんて事も考えられます
私的には・・
Workbooks.Addメソッドを使った方が良い場合
シートモジュールに書かれたVBAを移行したくない場合
一部のみ限定コピペ
破損(支障)ブックのコピペ(再構築部品取など)
複数シートの操作
ActiveSheet.Copyを使う事が多い場面
シートモジュールに書かれたVBAも共にコピぺしたい時
書式など・・・など
上記から
>複数ブックをシートごとにデータをマージするソースコードで
確かに。どのようなコードでどのような解説なのか分かりませんので何とも言えませんが、(すみません掲示のコードはなんか・・?
まあ、Workbooks.Addなので・・取り敢えず考えていません)
>余分なシートを削除する
Workbooks.Addなら可能性あり
ActiveSheet.Copy なら 多分不要・・・かな
No.5
- 回答日時:
こんばんは
実際に追加や削除の処理を行っているコードが示されていないので、以下は全くの推測だけですけれど・・
どのような環境でご提示のマクロを使う想定なのかもわかりませんが、通常、新しいブックを作成するとテンプレートで指定されているシート数とシート名のシートが作成されます。
例えば、新規ブックを作成すると、Sheet1、Sheet2、Sheet3の3シートが作成されるようになっていたとします。
(=個々の設定によって異なりますが・・)
実際の処理コードが不明なのでどうなっているのかわかりませんが、仮に、単に指定のシートを追加する処理だけを行うと、ご提示の例の場場合で言えば、Sheet3が余分に残ることになると推測されます。
それを削除しようという意図ではないかと想像しますけれど、わざわざループで処理しているのは不可思議ですね。
実際のコードをご提示になれば、もう少し内容がわかるものと思います。
No.3
- 回答日時:
前回の回答者です。
新規のブックを作成すると、デフォルトでは、3つのシート
Sheet1,Sheet2,Sheet3が作成されています。
このシートが、集計対象に全てふくまれているなら、まったく問題ありません。
ところが、集計対象のシートが、”総務”、"営業"、"東京"の3つの場合は、
Sheet1,Sheet2,Sheet3は不要なシートになります。
そのため、Sheet1,Sheet2,Sheet3を削除します。
この度は誠にありがとうございました。そしてご回答ありがとうございます。
実務でコードを実行するといくつかエラーが出てしまい、ひとつひとつ理由を探っているところです。
>新規のブックを作成すると、デフォルトでは、3つのシート
Sheet1,Sheet2,Sheet3が作成されています。
このシートが、集計対象に全てふくまれているなら、まったく問題ありません。
→今、集計対象外の「目次」シートを追加して実行してみました。意味がわかりました!!どうもありがとうございました。
別の質問となってしまい恐縮です。本番環境で実行すると
なぜか, 「'新規ブック1ブックをマージする」の21行目、
wb.Worksheets(sh_name).Range("A1:" & ecol & "3").Copy twb.Worksheets(sh_name).Range("A1")
maxrow_trg = 3
でエラー「この操作は結合したセル範囲には行えません」となり
2つ目以降のブックのデータ追記行うことができません。
見出しは、きちんと処理ができた仮環境と同じで1~3行が見出しとなっており、結合の形も同じです。
もしなにか解決のヒントがございましたら、ご教示いただけないでしょうか。
どうぞよろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) EXCELのVBAについて 2 2023/07/05 17:17
- Visual Basic(VBA) エクセルのマクロで対象ごとにシート分けしてその内容をセルに書き込みたい 9 2022/08/24 13:23
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) 改行ごとに行を追加し、数量を分割 4 2023/07/11 16:39
- Visual Basic(VBA) 複数シートの複数列に入力されているデータを重複なしで抽出するVBAを作りたいです。 9 2022/06/17 10:33
- Visual Basic(VBA) セルの値からファイルを複数作りたい2 3 2022/10/07 15:54
- Visual Basic(VBA) Excel VBA 複数ブックシートごとにデータを統合する方法について 4 2022/05/20 14:23
- Visual Basic(VBA) VBAが止まります。 1 2022/09/02 14:51
- Excel(エクセル) 複数のブックをひとつのブック(複数のシートにまとめる)場合にシートとの順番について 5 2022/12/28 20:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
特定の文字を含むシートだけマ...
-
excelのマクロで該当処理できな...
-
XL:BeforeDoubleClickが動かない
-
【VBA】シート名に特定文字が入...
-
実行時エラー1004「Select メソ...
-
エクセルVBA Ifでシート名が合...
-
Excelマクロのエラーを解決した...
-
Excel VBA で自然対数の関数Ln...
-
ユーザーフォームに入力したデ...
-
エクセルのシート名変更で重複...
-
シート削除のマクロで「delete...
-
VBAの授業でナンプレを制作して...
-
Worksheet_Changeの内容を標準...
-
シートが保護されている状態で...
-
VBAで同じシート名のコピー時は...
-
【Excel VBA】Worksheets().Act...
-
VBA オートフィルター繰り返し
-
ブック名、シート名を他のモジ...
-
VBAマクロでシートコピーした新...
-
VBA 検索して一致したセル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelマクロのエラーを解決した...
-
特定の文字を含むシートだけマ...
-
【ExcelVBA】全シートのセルの...
-
ユーザーフォームに入力したデ...
-
excelのマクロで該当処理できな...
-
実行時エラー'1004': WorkSheet...
-
ブック名、シート名を他のモジ...
-
実行時エラー1004「Select メソ...
-
VBA 存在しないシートを選...
-
ExcelVBA:複数の特定のグラフ...
-
エクセルのシート名変更で重複...
-
IFステートの中にWithステート...
-
VBA 検索して一致したセル...
-
ExcelのVBAのマクロで他のシー...
-
XL:BeforeDoubleClickが動かない
-
別のシートから値を取得するとき
-
エクセルVBA Ifでシート名が合...
-
エクセル・マクロ シートの非...
-
シートが保護されている状態で...
-
シート削除のマクロで「delete...
おすすめ情報
取得するシートの見出しの例となります。
私の力不足で、エラー回避ができないため大変恐縮ですが、別の方法を探りたく投稿をさせていただきました。
https://oshiete.goo.ne.jp/qa/12957037.html