プロが教えるわが家の防犯対策術!

お世話になります。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

質問者からの補足コメント

  • 取得するシートの見出しの例となります。

    「Excel VBA シートを追加後に余分」の補足画像1
      補足日時:2022/05/20 10:35
  • つらい・・・

    私の力不足で、エラー回避ができないため大変恐縮ですが、別の方法を探りたく投稿をさせていただきました。
    https://oshiete.goo.ne.jp/qa/12957037.html

      補足日時:2022/05/20 14:26

A 回答 (21件中1~10件)

このコードを書いた人に質問してください。

    • good
    • 1
この回答へのお礼

ありがとうございます。聞けないのでここで質問しております。

お礼日時:2022/05/19 23:00

ソースコードがこれだけとしたら、意味のある操作には見えません。

    • good
    • 1
この回答へのお礼

ありがとうございます。これだけではないです汗

お礼日時:2022/05/19 23:04

前回の回答者です。


新規のブックを作成すると、デフォルトでは、3つのシート
Sheet1,Sheet2,Sheet3が作成されています。
このシートが、集計対象に全てふくまれているなら、まったく問題ありません。
ところが、集計対象のシートが、”総務”、"営業"、"東京"の3つの場合は、
Sheet1,Sheet2,Sheet3は不要なシートになります。
そのため、Sheet1,Sheet2,Sheet3を削除します。
    • good
    • 1
この回答へのお礼

この度は誠にありがとうございました。そしてご回答ありがとうございます。

実務でコードを実行するといくつかエラーが出てしまい、ひとつひとつ理由を探っているところです。
>新規のブックを作成すると、デフォルトでは、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行が見出しとなっており、結合の形も同じです。

もしなにか解決のヒントがございましたら、ご教示いただけないでしょうか。
どうぞよろしくお願いいたします。

お礼日時:2022/05/19 23:45

質問文のコードだけでは、意図の特定はできないかと。


単なるサンプルコードということもあるので。

引用元を補足したら、だれか知ってるかも。
    • good
    • 1
この回答へのお礼

ありがとうございます!これだけでは意図は特定できないとのこと、よくわかっておらず、大変失礼いたしました。

お礼日時:2022/05/20 00:27

こんばんは



実際に追加や削除の処理を行っているコードが示されていないので、以下は全くの推測だけですけれど・・

どのような環境でご提示のマクロを使う想定なのかもわかりませんが、通常、新しいブックを作成するとテンプレートで指定されているシート数とシート名のシートが作成されます。

例えば、新規ブックを作成すると、Sheet1、Sheet2、Sheet3の3シートが作成されるようになっていたとします。
(=個々の設定によって異なりますが・・)

実際の処理コードが不明なのでどうなっているのかわかりませんが、仮に、単に指定のシートを追加する処理だけを行うと、ご提示の例の場場合で言えば、Sheet3が余分に残ることになると推測されます。
それを削除しようという意図ではないかと想像しますけれど、わざわざループで処理しているのは不可思議ですね。

実際のコードをご提示になれば、もう少し内容がわかるものと思います。
    • good
    • 2
この回答へのお礼

ご回答ありがとうございました。質問するための情報が足りていなかったにも関わらず、丁寧にご説明いただき大変勉強になります。

お礼日時:2022/05/20 00:30

こんばんは


>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 なら 多分不要・・・かな
    • good
    • 2
この回答へのお礼

ご丁寧に教えていただきありがとうございます!大変勉強になります!!

お礼日時:2022/05/20 04:00

>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行分)の画像を提示していただくことは可能でしょうか。(最初の列から最後の列まですべての列です)
    • good
    • 1
この回答へのお礼

質問を拾っていただきありがとうございます!

昨日質問した際は、余分なシートを削除する制御をコメントブロックした状態でした。教えていただき理解できましたので、この部分のコメントブロックを解除し実行しました。
すると
’新規ブックから余分なシートを削除する(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列まで抜けなくデータが格納されています。
データ内容は日付、文字列、数値のどれかとなります。

以上大変お手数ですが、引き続き教えていただきたくよろしくお願い申し上げます。

お礼日時:2022/05/20 10:32

こちらで提示した


sheet_names = Array("Sheet1", "元データ", "元データ2")
の行ですが
あなたの環境にあわせて、きちんと設定しなければいけません。
実際は、どのようになっていますか。
そこに、目次、Sheet1などがあってはいけません。
    • good
    • 1
この回答へのお礼

ありがとうございます。上記項目は、「新規ブック及びシートの作成」箇所の「sheet_names=Array("","","")」の箇所と認識しているのですが、
こちらは必要なシートのみにしています。(先ほど目次が含まれていたので、削除して実行しました。sheet1はそもそも指定しておりませんでした)

再度確認し、実行すると先ほどと同じエラー「新規ブックから余分なシートを削除する」の制御の、
twb.worksheets(sheet_name).delete の箇所で「インデックスが有効範囲がない」のエラーが発生してしまいます。

お礼日時:2022/05/20 11:03

>データ統合が必要のないシート目次は、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)
のようにしてください。
    • good
    • 1

No9です。


①の行はこのサイトで表示すると2行ですが、実際は1行です。
VBE(マクロを表示している画面)に取り込んだ時、1行になることを確認してください。
②についても同様です。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!