お世話になります。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件中1~10件)
- 最新から表示
- 回答順に表示
No.21
- 回答日時:
しつこくてごめんなさい(閉じられていないので)
表題のご質問とだいぶ離れてしまいましたね
ご質問に対しての回答は#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
ご回答誠にありがとうございました。現在追いついていないですが、週末改めてじっくり勉強させていただきます。貴重なお時間を頂戴してしまい、申し訳ございません。本当にありがとうございます。
No.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
ご回答ありがとうございます。色々と教えていただくのですが、新たに組み合わせたりなどが、うまくできないため、
教えて頂いた方には大変申し訳ないのですが、自分でも読解可能なコードを使ってあらたにツールを作れないかと思い、大変恐縮ですが、以下投稿を新たにさせていただきました。
https://oshiete.goo.ne.jp/qa/12957037.html
No.19
- 回答日時:
これから外出します。
戻りは夕方になります。色々と本当に申し訳ございません。私自身が頂いたソースコードをよく理解できず、ネットで見つけた似たようなソースコードを活用して、この制御をできないかと思い、不明点を新規で投稿いたしました。
https://oshiete.goo.ne.jp/qa/12957037.html
No.18
- 回答日時:
>エラーも回避できない状況と、シート削除の処理等々、手作業は入れたくないので、色々わからなくなってきてしまいました。
。現在、シート削除、見出しのコピーでエラーが出るので、それを回避する方法で作り直してみましょうか。
基本的には以下のような流れになります。
1.ファイルをコピーするときに、
1件目のファイルをそのままコピーして、統合用のブックとする。
2.統合用のブックから「目次」シートを削除する。
(もし、残しても良いなら削除はしません)
3.2件目以降のファイルの、data1~data7のシートのデータ行(4行目以降)を、統合用ブックにコピーする。
コピーする列はA~AL列とする。
この度は私の理解不足でお時間頂戴したのに有意義に活用することができず大変申し訳ございませんでした。週末に頂いたコメントを見て勉強させていただきます!!本当にありがとうございました!!
No.17
- 回答日時:
>ありがとうございます。
ということは、sheet1しか生成されないのはやはり何かがおかしいのでしょうか?おかしくありません。設定です。
こちらexcel2019ですが、あなたのexcelのバージョンはいくつでしょうか。
excel2019の場合、
オプションのクリックー>新しいブックの作成時の「ブックのシート数」
で1を設定すると、Sheet1のみ作成されます。
2を設定すると、Sheet1,2が作成されます。
3を設定すると、Sheet1,2,3が作成されます。
これは、マクロでの新規作成だけではなく、手作業で新規ブックを作成した場合も同様です。
あなたの設定が3になっている前提で今まで書いてきました。
そのため
(通常は)Sheet1,2,3が作成される。・・・というような書き方をしています。
なるほど、どうもありがとうございます。
本番環境は2016です。
色々とご教示いただきありがとうございます。
エラーも回避できない状況と、シート削除の処理等々、手作業は入れたくないので、色々わからなくなってきてしまいました。。
もう一度少し考えてみたいと思います。せっかく教えていただいたのに申し訳ございません。。
No.16
- 回答日時:
誤記訂正
新規のブックが作成され、そこに、(通常は)Sheet1,Sheet2,Sheet3
されているのを確認できます。
は
新規のブックが作成され、そこに、(通常は)Sheet1,Sheet2,Sheet3
が作成されているのを確認できます。
の誤りです。失礼しました。
No.15
- 回答日時:
>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= …
No.14
- 回答日時:
こんにちは #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つ以上あった場合は、存在するシートのみで新規ブック作成します
No.13
- 回答日時:
>twb.worksheets(sheet_name).delete の箇所で「インデックスが有効範囲がない」のエラーが発生してしまいます。
もし、上記のエラーがなくならないなら、とりあえず、「'余分なシートを削除する」箇所をコメントアウトしていただけますでしょうか。
そうすると、統合したブックにSheet1~Sheet3が残りますが、それは後で、手動で削除すればとりあえず、作業は進むかと思います。
ご回答ありがとうございます。
「新規ブック及びシートの作成」箇所
sheet_names=Array("data1","data2","data3","data4","data5","data6","data7")としておりますが、一度Excelを終了し、再度立ち上げて、このまま保持されておりました。
こちらで実行したところ、やはり余分なシートを削除する、の該当箇所で
インデックスが有効範囲にない、のエラーが出てしまいます。
1点質問ですが、”sheet1” "sheet2" "sheet3" が作成される、の意味が判りかねるのですが、どの段階でこれらのシートが作成されるのでしょうか?
実際は、sheet1というのだけが作成されています。
Arrayでは、指定していないのですがsheet1は作成されている状況です。
No.12
- 回答日時:
>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")
となっていることを必ず確認してください。
それで、どうなりますでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
excelのマクロで該当処理できな...
-
ユーザーフォームに入力したデ...
-
Excelマクロのエラーを解決した...
-
特定の文字を含むシートだけマ...
-
【VBA】シート名に特定文字が入...
-
別のシートから値を取得するとき
-
ブック名、シート名を他のモジ...
-
VBA 検索して一致したセル...
-
【ExcelVBA】全シートのセルの...
-
エクセル VBA シートのコピー
-
ExcelのVBAのマクロで他のシー...
-
IFステートの中にWithステート...
-
同じ作業を複数のシートに実行...
-
実行時エラー'1004': WorkSheet...
-
ExcelVBA:複数の特定のグラフ...
-
エクセル・マクロ シートの非...
-
XL:BeforeDoubleClickが動かない
-
エクセルのシート名変更で重複...
-
セルの値によって、シート見出...
-
VBA 入力月で該当シートを選択...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定の文字を含むシートだけマ...
-
【ExcelVBA】全シートのセルの...
-
ユーザーフォームに入力したデ...
-
excelのマクロで該当処理できな...
-
別のシートから値を取得するとき
-
Excelマクロのエラーを解決した...
-
実行時エラー'1004': WorkSheet...
-
ブック名、シート名を他のモジ...
-
ExcelのVBAのマクロで他のシー...
-
VBAで指定シート以外の選択
-
VBA 存在しないシートを選...
-
エクセルのシート名変更で重複...
-
IFステートの中にWithステート...
-
シートが保護されている状態で...
-
【VBA】シート名に特定文字が入...
-
ExcelVBA:複数の特定のグラフ...
-
XL:BeforeDoubleClickが動かない
-
実行時エラー1004「Select メソ...
-
【VBA】色のついたシート名を取得
-
エクセル・マクロ シートの非...
おすすめ情報
取得するシートの見出しの例となります。
私の力不足で、エラー回避ができないため大変恐縮ですが、別の方法を探りたく投稿をさせていただきました。
https://oshiete.goo.ne.jp/qa/12957037.html