質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

3084閲覧

EXCEL VBAマクロでフォルダに入っているEXCELブックのシートを参照して集計ブックに保存していきたいが、シート名が違う

ko1

総合スコア23

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/03/05 06:19

EXCEL VBAマクロでフォルダに入っているEXCELブックのシートを参照して集計ブックに保存していきたいが、シート名が違う

ご質問させていただきます。

EXCEL VBAマクロでフォルダに入っているEXCELブックのシートを参照して集計ブックに保存して行こうと下記のマクロで動かしておりますが、
現在、EXCELブック(名前は複数)のシートAのG1とF25を引っ張り、集計ブックに入れ込んでおります。
しかし、新たにシートBのH1とG25を引っ張る必要がでてきました。
ただシートの名前が違う状況ですと、抽出する事ができず、違うシート名のブックにあたった時点でデバッグエラーと出てしまいます。

下記のマクロで

Do Until myFile = ""
Workbooks.Open myPath & myFile
With Workbooks("集計.xls").Worksheets("Sheet1").Range("A65536").End(xlUp)
.Offset(1, 0).Value = myFile
.Offset(1, 1).Value = Workbooks(myFile).Worksheets("シートA").Range("G1").Value
.Offset(1, 2).Value = Workbooks(myFile).Worksheets("シートA").Range("F25").Value
もしシート名がシートBならばH1を抽出
End With

くわえて、参照するデータが無ければデバッグエラーではなく無視してマクロ続行というマクロは組み込めるのでしょうか。

大変恐縮ですが、ご教示の程よろしくお願い致します。

Sub macro1()
Dim myPath As String
Dim myFile As String

myPath = "C:\Users\test\Desktop\フォルダ1"
myFile = Dir(myPath & "*.xls")

Do Until myFile = ""
Workbooks.Open myPath & myFile
With Workbooks("集計.xls").Worksheets("Sheet1").Range("A65536").End(xlUp)
.Offset(1, 0).Value = myFile
.Offset(1, 1).Value = Workbooks(myFile).Worksheets("シートA").Range("G1").Value
.Offset(1, 2).Value = Workbooks(myFile).Worksheets("シートA").Range("F25").Value
End With
Workbooks(myFile).Close savechanges:=False
myFile = Dir()
Loop
End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

もうちょっと柔軟な作りにするべきかと思います。
全シートを回して、特定のシート名で切り分けるような作りの方がよいでしょう。
例えばこんな感じ(動作未確認です)

VBA

1Sub macro1() 2 Dim myPath As String 3 Dim myFile As String 4 Dim myBk As Workbook 5 Dim ws As Worksheet 6 7 myPath = "C:\Users\test\Desktop\フォルダ1" 8 myFile = Dir(myPath & "*.xls") 9 10 Do Until myFile = "" 11 12 Set myBk = Workbooks.Open(myPath & myFile) 13 With Workbooks("集計.xls").Worksheets("Sheet1").Range("A65536").End(xlUp) 14 For Each ws In myBk.Worksheets 15 Select Case ws.Name 16 Case "シートA" 17 .Offset(1, 0).Value = myFile 18 .Offset(1, 1).Value = ws.Range("G1").Value 19 .Offset(1, 2).Value = ws.Range("F25").Value 20 Exit For 21 Case "シートB" 22 .Offset(1, 0).Value = myFile 23 .Offset(1, 1).Value = ws.Range("H1").Value 24 .Offset(1, 2).Value = ws.Range("G25").Value 25 Exit For 26 End Select 27 Next 28 End With 29 30 myBk.Close savechanges:=False 31 myFile = Dir() 32 33 Loop 34 35End Sub 36

くわえて、参照するデータが無ければデバッグエラーではなく無視してマクロ続行というマクロは組み込めるのでしょうか。

On Error Resume Nextを使えば可能ですが、本当に必要かどうかを考えて使ってください。
ほとんどのエラーは事前にチェックすることで回避が可能です。
それでも回避できない場合、Resume Next を使うことが妥当であるなら使うべきです。

投稿2020/03/05 06:49

ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DreamTheater

2020/03/05 06:54

ttyp03さんの(特に)最後の3行に非常に同意します。 安易にエラースキップを使用するべきではありません。
ttyp03

2020/03/05 06:57

安易にResumeNextしちゃうとホントのエラー(バグ)を見逃しちゃいますからね。
ko1

2020/03/05 07:00

ありがとうございます。頂きました上記ソースで実行できました。 お手数をおかけいたしました。
guest

0

こんにちは。
目的のシートが存在するか否かをチェックできれば回避できると解釈しました。

Workbookオブジェクトとシート名を渡して、そのブックにそのシート名が存在するか否かを返す
こんな関数を作れば判定できませんか?

Pubic Function IsExistSheetName(sheetName As String, wb As Workbook) As Boolean Dim ws As Worksheet IsExistSheetName = False For Each ws In wb.Worksheets If ws.Name = sheetName Then IsExistSheetName = True Exit Function End If Next End Function

Trueが返ればシート名あり、Falseならシート名なし。

投稿2020/03/05 06:46

DreamTheater

総合スコア1095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ko1

2020/03/05 07:01

ありがとうございます。ご参考にさせて頂きます。
guest

0

無視してマクロ続行

詳しく見ていないですがOn ErrorステートメントのOn Error Resume Nextですね。

ただ、意味不明な結果になる事もある(そんな時に何が原因なのか?が分からない)事もあるので、分かるならエラーする箇所をIf文で飛ばすようにした方がいいとは思います。

投稿2020/03/05 06:28

yoorwm

総合スコア1305

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ko1

2020/03/05 07:01 編集

ありがとうございます。参考にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問