アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

しつこくてごめんなさい(閉じられていないので)


表題のご質問とだいぶ離れてしまいましたね
ご質問に対しての回答は#6に挙げているものですが
#20を書いてしまいました。さらに #20は勘違いのようです

>自分でも読解可能なコードを使って
もっともです。配慮が足りませんでした。

グタグタついでにコードとして記しておきます。
コード内に簡単なコメントも付加しましたので、ゆっくり時間がある時に遊んでみてください。(内容は理解できると思います、改造ポイントも)
(VBEに移さないと見にくいですね)

Sub データ処理1()
'処理:選択フォルダ内のすべてのxlsxファイルのSheet1(名前)のデータを新規ブックにまとめます
'フォルダピッカーでフォルダを選択
'予想される問題点----
'フォルダ内の不必要ファイルを読み込む可能性(共通キーワードなどで振り分け処理をする)
'シートを名前で特定しているのでシートが見つからない可能性が有ります(インデックスやオブジェクト名や探す処理で)
'1ファイル目で見出し行を取得しているのでフォルダ内でファイル名の1番若いファイルに見出しがある必要があります
'(ファイル取得順位の考慮が必要)
Dim scorewb As Workbook
Dim matomesh As Worksheet
Dim folderPath As Variant, fileName As String
Dim lastrow As Long, flag As Boolean
'フォルダピッカーダイアログ
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = 0 Then Exit Sub 'キャンセル時終了
folderPath = .SelectedItems(1)
End With
'ファイルの存在確認(取得)
fileName = Dir(folderPath & "\*.xlsx")
If fileName <> "" Then
Application.ScreenUpdating = False
Do
Set scorewb = Workbooks.Open(fileName:=folderPath & "\" & fileName)
If flag = False Then '1ファイル目処理のフラグ
'1ファイル目の処理
scorewb.Worksheets("Sheet1").Copy '開いたブックの対象シートをコピーして新規ブックを自動生成(生まれたてはActiveWorkbook)
Set matomesh = ActiveWorkbook.Worksheets(1) '上記の新規ブックのシートインデックス1のシートをオブジェクト変数にセット
matomesh.Name = "まとめ" '上記シートに名前を付ける
flag = True 'フラグ設定 2ファイル目の準備
Else
'2ファイル目以降の処理
lastrow = Application.Max(matomesh.Cells(Rows.Count, 1).End(xlUp).Row, 4) 'データがない場合の対策最小でも4が返る
'範囲 "A4:AL" & lastrow 見出し行はすべてのファイルで同じとして4行目以降がコピー対象
scorewb.Worksheets("Sheet1").Range("A4:AL" & lastrow).Copy _
matomesh.Cells(Rows.Count, "A").End(xlUp).Offset(1) '最終行の1行下.Offset(1)
End If
scorewb.Close savechanges:=False
fileName = Dir() 'フォルダにあるすべての.xlsxファイル(次のファイル名を取得)
Loop Until fileName = "" '上記で""が変えるまで繰り返す
Application.ScreenUpdating = True
Else
MsgBox "データがありません"
End If
End Sub
    • good
    • 1
この回答へのお礼

ご回答誠にありがとうございました。現在追いついていないですが、週末改めてじっくり勉強させていただきます。貴重なお時間を頂戴してしまい、申し訳ございません。本当にありがとうございます。

お礼日時:2022/05/20 22:20

>sheet1しか生成されない


No.6 の
フォームタブー>オプション 基本操作 ー> 新規ブックの作成時 のシート数を確認してみたら?

返信はありませんでしたが・・・
No.14の応用例
例えば、こんな感じの事をやりたいのかな と

Sub Sample1()
Dim Sh As Worksheet
Dim ArrShName() As String
Dim chkshName As Variant
Dim trgSh As Variant
Dim i As Long, n As Long
Dim ThisWB As Workbook
Dim NewWB As Workbook

Set ThisWB = ThisWorkbook
trgSh = Array("data1", "data2", "data3", "data4", "data5", "data6", "data7")
ReDim ArrShName(0)

For Each Sh In ThisWB.Worksheets
If Sh.Name = trgSh(0) Then
ReDim Preserve ArrShName(i)
ArrShName(i) = Sh.Name
i = i + 1
Exit For
End If
Next Sh
If ArrShName(0) = "" Then MsgBox ("ターゲットシートがありません"): Exit Sub
Worksheets(ArrShName).Copy
Set NewWB = ActiveWorkbook
For i = 1 To UBound(trgSh)
For Each Sh In ThisWB.Worksheets
If Sh.Name = trgSh(i) Then
If ThisWB.Worksheets(trgSh(i)).Range("BV1").Value = "" Then
n = ThisWB.Worksheets(trgSh(i)).Cells(Rows.Count, "A").End(xlUp).Row
ThisWB.Worksheets(trgSh(i)).Range("A1:AL" & n).Copy _
NewWB.Worksheets(1).Cells(Rows.Count, "A").End(xlUp).Offset(1)
End If
Exit For
End If
Next Sh
Next
End Sub
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。色々と教えていただくのですが、新たに組み合わせたりなどが、うまくできないため、
教えて頂いた方には大変申し訳ないのですが、自分でも読解可能なコードを使ってあらたにツールを作れないかと思い、大変恐縮ですが、以下投稿を新たにさせていただきました。
https://oshiete.goo.ne.jp/qa/12957037.html

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

これから外出します。

戻りは夕方になります。
    • good
    • 1
この回答へのお礼

色々と本当に申し訳ございません。私自身が頂いたソースコードをよく理解できず、ネットで見つけた似たようなソースコードを活用して、この制御をできないかと思い、不明点を新規で投稿いたしました。
https://oshiete.goo.ne.jp/qa/12957037.html

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

>エラーも回避できない状況と、シート削除の処理等々、手作業は入れたくないので、色々わからなくなってきてしまいました。



現在、シート削除、見出しのコピーでエラーが出るので、それを回避する方法で作り直してみましょうか。

基本的には以下のような流れになります。
1.ファイルをコピーするときに、
1件目のファイルをそのままコピーして、統合用のブックとする。

2.統合用のブックから「目次」シートを削除する。
(もし、残しても良いなら削除はしません)

3.2件目以降のファイルの、data1~data7のシートのデータ行(4行目以降)を、統合用ブックにコピーする。
コピーする列はA~AL列とする。
    • good
    • 1
この回答へのお礼

この度は私の理解不足でお時間頂戴したのに有意義に活用することができず大変申し訳ございませんでした。週末に頂いたコメントを見て勉強させていただきます!!本当にありがとうございました!!

お礼日時:2022/05/20 22:23

>ありがとうございます。

ということは、sheet1しか生成されないのはやはり何かがおかしいのでしょうか?

おかしくありません。設定です。
こちらexcel2019ですが、あなたのexcelのバージョンはいくつでしょうか。
excel2019の場合、
オプションのクリックー>新しいブックの作成時の「ブックのシート数」
で1を設定すると、Sheet1のみ作成されます。
2を設定すると、Sheet1,2が作成されます。
3を設定すると、Sheet1,2,3が作成されます。

これは、マクロでの新規作成だけではなく、手作業で新規ブックを作成した場合も同様です。
あなたの設定が3になっている前提で今まで書いてきました。
そのため
(通常は)Sheet1,2,3が作成される。・・・というような書き方をしています。
    • good
    • 1
この回答へのお礼

なるほど、どうもありがとうございます。
本番環境は2016です。

色々とご教示いただきありがとうございます。
エラーも回避できない状況と、シート削除の処理等々、手作業は入れたくないので、色々わからなくなってきてしまいました。。

もう一度少し考えてみたいと思います。せっかく教えていただいたのに申し訳ございません。。

お礼日時:2022/05/20 13:53

誤記訂正


新規のブックが作成され、そこに、(通常は)Sheet1,Sheet2,Sheet3
されているのを確認できます。



新規のブックが作成され、そこに、(通常は)Sheet1,Sheet2,Sheet3
が作成されているのを確認できます。

の誤りです。失礼しました。
    • good
    • 1

>1点質問ですが、”sheet1” "sheet2" "sheet3" が作成される、の意味が判りかねるのですが、どの段階でこれらのシートが作成されるのでしょうか? ...



新規ブックを作成したときです。
Set twb = Workbooks.Add・・・・①
'全てのシートを作成する
For i = 0 To UBound(sheet_names)
Call add_sheet(twb, sheet_names(i))
Next

上記の①を実行したときです。
次の、For i = 0 To UBound(sheet_names)
の行にブレイクポイントを設定し、実行すると、
その行で、マクロが止まります。
新規のブックが作成され、そこに、(通常は)Sheet1,Sheet2,Sheet3
されているのを確認できます。
ブレイクポイントについては、下記URLを参照ください。
https://kabu-macro.com/detail.php?dir=word&dir2= …
    • good
    • 1
この回答へのお礼

ありがとうございます。ということは、sheet1しか生成されないのはやはり何かがおかしいのでしょうか?

お礼日時:2022/05/20 13:35

こんにちは #7を回答した者です。


横から失礼しますね
サブルーチンの処理内容が定かでないけれど・・
シートを作るとか削除するとかを複雑に考えず、作ってから・・

必要なシートだけでのブックを作成して 作成直後のブック(ActiveWorkbook)に対して加工処理をすれば良いのではと・・思います

参考 ブック作成部分のコード
Sub Sample()
Dim Sh As Worksheet
Dim ArrShName() As String
Dim chkshName As Variant
Dim i As Long
ReDim ArrShName(0)
For Each chkshName In Array("data1", "data2", "data3", "data4", "data5", "data6", "data7")
For Each Sh In ThisWorkbook.Worksheets
If Sh.Name = chkshName Then
ReDim Preserve ArrShName(i)
ArrShName(i) = Sh.Name
i = i + 1
End If
Next Sh
Next
If ArrShName(0) = "" Then MsgBox ("ターゲットシートがありません"): Exit Sub
Worksheets(ArrShName).Copy
End Sub

一応、簡単なエラー処理、シート名配列のシート名が存在しているかのチェックロジックを組み込んでいます。

全くない場合はUIでインフォ
1つ以上あった場合は、存在するシートのみで新規ブック作成します
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます!後ほど確認させていただきます。

お礼日時:2022/05/20 22:21

>twb.worksheets(sheet_name).delete の箇所で「インデックスが有効範囲がない」のエラーが発生してしまいます。



もし、上記のエラーがなくならないなら、とりあえず、「'余分なシートを削除する」箇所をコメントアウトしていただけますでしょうか。
そうすると、統合したブックにSheet1~Sheet3が残りますが、それは後で、手動で削除すればとりあえず、作業は進むかと思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

「新規ブック及びシートの作成」箇所
sheet_names=Array("data1","data2","data3","data4","data5","data6","data7")としておりますが、一度Excelを終了し、再度立ち上げて、このまま保持されておりました。

こちらで実行したところ、やはり余分なシートを削除する、の該当箇所で
インデックスが有効範囲にない、のエラーが出てしまいます。

1点質問ですが、”sheet1” "sheet2" "sheet3" が作成される、の意味が判りかねるのですが、どの段階でこれらのシートが作成されるのでしょうか?

実際は、sheet1というのだけが作成されています。
Arrayでは、指定していないのですがsheet1は作成されている状況です。

お礼日時:2022/05/20 13:18

>twb.worksheets(sheet_name).delateのsheet_nameには


>1枚目のデータシート“data1”が格納されております。

これは、
sheet_names = Array("data1","data2","data3","data4","data5","data6","data7")
として、実行した場合で、間違いないでしょうか。
もし、そうであれば、何かおかしなことになっているので、
一旦、excelを全て終了し、マクロのあるブックのみをオープンした状態で実行してください。(他のブックを開いた状態でマクロを実行してはいけません)
実行前に、
sheet_names = Array("data1","data2","data3","data4","data5","data6","data7")
となっていることを必ず確認してください。
それで、どうなりますでしょうか。
    • good
    • 0

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