
VBA初心者です。
自分で組んでみたのですが上手く動作せず、質問させていただきます。
元データの各シート名が複数ブック名と一部一致する場合
一致したブックに新しいシートを追加して、元データのシート内容を転記していきたいです。
フォルダ内に元データとなるブックと転記したい複数ブックが格納されている状態です。
元データには各拠点の名前で複数シートが存在します。
複数のブック名は”拠点名【営業活動個人分析】”となっています。
現状はシートの追加まで組んでいるつもりです。※下記添付
どこをどう直せばいいのか、もしくは別の方法があれば教えて頂けると幸いです。
Sub consolid()
'このブックと同じフォルダの全ブックをまとめます
Dim mb As Workbook
Dim wb As Workbook
Dim myfdr As String
Dim fname As String
Dim n As Long
Dim i As Integer
Application.ScreenUpdating = False
Set mb = ThisWorkbook
myfdr = ThisWorkbook.path
fname = Dir(myfdr & "\*営業活動個人分析*.xls*")
Do Until fname = Empty
If fname <> mb.Name Then
Set wb = Workbooks.Open(myfdr & "\" & fname)
i = 1
Do While i <= Worksheets.Count
Dim str1 As String
str1 = "【"
If Left(wb.Name, InStr(wb.Name, str1) - 1) = mb.Worksheets(i).Name Then
Dim s As Variant, flag As Boolean
Dim ws As Worksheet
Dim ws1 As Worksheet
Set ws1 = mb.Worksheets
For Each s In Sheets
If s.Name = ws1.Cells(1, "AO").Value Then
flag = True
Exit For
End If
Next s
If flag = False Then
Set ws = Sheets.Add(After:=Sheets(Sheets.Count))
ws.Name = ws1.Cells(1, "AO").Value
End If
End If
Loop
wb.Close
n = n + 1
End If
fname = Dir
Loop
Application.ScreenUpdating = True
End Sub
No.5ベストアンサー
- 回答日時:
とりあえず動くようにしました。
ブック名は横浜【個人分析管理表】ではなく横浜【営業活動個人分析管理表】にしてあります。どちらが正しいかは、こちらでは判断できません。
横浜【個人分析管理表】が正しいなら
fname = Dir(myfdr & "\*営業活動個人分析*.xls*")
を
fname = Dir(myfdr & "\*個人分析*.xls*")
にしてください。
-------------------------------------
Sub consolid()
'このブックと同じフォルダの全ブックをまとめます
Dim mb As Workbook
Dim wb As Workbook
Dim myfdr As String
Dim fname As String
Dim i As Integer
Application.ScreenUpdating = False
Set mb = ThisWorkbook
myfdr = ThisWorkbook.Path
fname = Dir(myfdr & "\*営業活動個人分析*.xls*")
Do Until fname = Empty
If fname <> mb.Name Then
Set wb = Workbooks.Open(myfdr & "\" & fname)
i = 1
Do While i <= mb.Worksheets.Count
Dim str1 As String
str1 = "【"
If Left(wb.Name, InStr(wb.Name, str1) - 1) = mb.Worksheets(i).Name Then
Dim s As Worksheet, flag As Boolean
Dim ws As Worksheet
Dim ws1 As Worksheet
flag = False
Set ws1 = mb.Worksheets(i)
For Each s In wb.Worksheets
If s.Name = ws1.Cells(1, "AO").Value Then
flag = True
Exit For
End If
Next s
If flag = False Then
Set ws = wb.Worksheets.Add(After:=wb.Worksheets(wb.Worksheets.Count))
ws.Name = ws1.Cells(1, "AO").Value
End If
End If
i = i + 1
Loop
wb.Close (True)
End If
fname = Dir
Loop
Application.ScreenUpdating = True
End Sub
>どちらが正しいかは、こちらでは判断できません。
ブック名の情報が誤ったもので申し訳ないです。
修正いただきありがとうございます。
無事動作しました。
シート追加後の転記も無事完了し、大変助かりました。
No.3
- 回答日時:
こんにちは
ざっと眺めただけなので、よく理解できていませんが…
>元データのシート内容を転記していきたいです。
なんだか、値を転記している部分が見当たらないような気がしますが…?
>元データには各拠点の名前で複数シートが存在します。
同じ名前のシートが複数存在できないので、実態はどうなっているのかしらん。
既に指摘が出ていますが…
>Do While i <= Worksheets.Count
>For Each s In Sheets
>Set ws = Sheets.Add(After:=Sheets(Sheets.Count))
複数のブックを扱う場合、デフォルトの指定を利用しない方が間違いを防ぎやすいと思います。
そもそもですが…
>上手く動作せず、質問させていただきます。
「何が思ったのと違うのか」、「実際にやりたいことは何か」をキチンと説明しないで、コードのみを示しても、コードが動作する限りは「それが質問者様のなさりたいこと」という解釈の前提でしか読み取れません。
ですので、第三者には「動けばOK」という判断でしか回答できないと思いますよ。
さて、現状は二重のループで、合致を検索しているように見受けられますが、想像するところ、「元データ」というブック内の各シートを処理できれば良いのではないでしょうか?
フォルダ内の各ブックに対応するシートが必ず存在するのかは不明ですが、現状ではフォルダ内のブックを全て必要あろうが/なかろうが開いているので、時間のロスがありそうに思えます。
一方で、元ブックのシート名がわかれば転記先のブック名は決まるのでしょうから、元ブックのシートに対してループさせるようにすれば、処理全体は一重のループで済むものと推測します。
よくわかっていませんけれど…
シート名に対して、
「元ブックのシート名」&「【営業活動個人分析】.xls」
というファイルを開いて転記するような手順にした方が、流れがわかりやすくなるのではないかと想像しました。
ついでながら、余計なことではありますが、デバッグ中は
>Application.ScreenUpdating = False
などは外しておいた方が、処理の動きがある程度は目視可能なので宜しいのでは?
(画面がチラついたり、実行速度は遅くなりますけれど)
※ なさりたいことをほとんど理解できていませんので、的外れかもしれませんが、その際にはご容赦ください。
回答の締め切り後のお礼連絡で大変申し訳ないですが、
>値を転記している部分が見当たらないような気がしますが…?
シート追加後に値の転記をしたかったのですが、シートの追加すらできず、途中の段階で質問させていただいてました。
>上手く動作せず、質問させていただきます
動作確認中にホワイトアウトしてしまう状況でした。次回質問の機会には気をつけさせていただきます。
>「元データ」というブック内の各シートを処理できれば良いのではないでしょうか?
ご指摘の通りです。ご説明読ませていただきましたが一重のループで済むと思います。自分では考えが及ばす、fujillinさんの考え方を参考に修正していきたいと思います。
>処理の動きがある程度は目視可能なので宜しいのでは?
動作確認段階では今後外すようにします!
いろいろとご丁寧にご指摘いただきありがとうございます!
No.2
- 回答日時:
気になった点。
>Do While i <= Worksheets.Count
のシートカウントって
・このコードが記載されているBook
・直前に開かれたアクティブなBook
のどちらを指しているのでしょう?
と初級レベルは思いました。
どちらに対してもSetステートメントを用いるのなら、Bookを明確に指定する方がミスる事はないと思いますけど。
> flag As Boolean
フラグを立てループ内で幾度も使用するなら、
>flag = True
で処理を抜けループの最初に戻った際には、flag = False による初期設定が必要なのでは?
お返事いただきありがとうございます。
ブックの指定をしていない部分が多々ありましたので、もう一度見直して指定しなおしてみたいと思います。
>flag = False
一応記載はしているのですが、書く位置が違いますかね;
もう一度見直してみます。
ご指摘頂きありがとうございます!!
No.1
- 回答日時:
補足要求です。
1.元データの各シート名が複数ブック名と一部一致する場合ということですが、シート名のサンプルとブック名のサンプルを提示してください。
また、そのどこが一致すると転記条件が成立すのかを例を提示してください。
2.シートを追加する条件を日本語で説明してください。
(AO1のセルの内容も含めて)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) VBAが止まります。 1 2022/09/02 14:51
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 別ブックからコピペしたい...
-
VBA シートをコピーする際に Co...
-
[Excel]ADODBでNull変換されて...
-
別ブックをダイアログボックス...
-
エクセルVBA→他ブックを参照し...
-
VBAで別のブックにシートをコピ...
-
VBAの参照先のファイル名をセル...
-
Excelのマクロコードについて教...
-
エクセルのマクロを使ってメー...
-
相対パスでExcel Bookのオープン
-
マクロVBA別Excelブックにデー...
-
【Excel VBA】書き込み先ブック...
-
EXCEL VBA 単語置き換え につい...
-
エクセルのマクロについて教え...
-
VBA アプリケーション定義また...
-
Excel2007でBOOK間のシート移動...
-
開いていない他のブックからシ...
-
Excel2007VBAファイルの表示に...
-
【ExcelVBA】zip圧縮されたCSV...
-
エクセルVBAが途中で止まります
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA シートをコピーする際に Co...
-
別ブックをダイアログボックス...
-
VBA 別ブックからコピペしたい...
-
エクセルVBAが途中で止まります
-
ワイルドカード「*」を使うとう...
-
VBA コードを実行すると画面が...
-
VBAで別のブックにシートをコピ...
-
VBAで別ブックのシートを指定し...
-
【Excel VBA】書き込み先ブック...
-
Excelマクロ 該当する値の行番...
-
【ExcelVBA】zip圧縮されたCSV...
-
[Excel]ADODBでNull変換されて...
-
【ExcelVBA】インデックスが有...
-
Excel2007VBAファイルの表示に...
-
VBAで複数のブックを開かずに処...
-
vbaで他のブックに転記したい。...
-
エクセルマクロで、他ブックか...
-
vbaでvbaProjectのパスワード解...
-
VBA 実行時エラー 2147024893
-
【マクロ】違うフォルダにある...
おすすめ情報
ご連絡頂きありがとうございます。
>1.元データの各シート名が複数ブック名と一部一致する場合ということですが、シート名のサンプルとブック名のサンプルを提示してください。
シート名 横浜、東京、名古屋、大阪
ブック名 横浜【個人分析管理表】、東京【個人分析管理表】、名古屋【個人分析管理表】、大阪【個人分析管理表】
>2.シートを追加する条件を日本語で説明してください。
(AO1のセルの内容も含めて)
AO1(日付名)のシートがブック内に存在しない場合のみ、シートをAO1(日付名)で追加が条件です。
元データの各シートのAO1には日付が文字列で入っています。例)1113(シートを作成した日付)
各ブック内には日付をシート名としたこれまでのデータが蓄積されている状態です。
宜しくお願い致します。