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

VBAについての質問です。
マクロが保存されているエクセルと同じフォルダにあるエクセルファイルを全て開くマクロをつくりたくて、以下のようにしました。

Dim filename As String
Dim openedbook As Workbook
Dim isbookopen As Boolean


filename = Dir(ThisWorkbook.Path & "*.xls")
Do While filename <> ""
If filename <> ThisWorkbook.Name Then
isbookopen = False
For Each openedbook In Workbooks
If openedbook.Name = filename Then
isbookopen = True
Exit For
End If
Next
If isbookopen = False Then
Workbooks.Open (filename)
End If
End If
filename = Dir()
Loop

エラーはでないのですが、ファイルは1つも開きません。何がだめなのかを教えていただきたいです。
よろしくお願いします。

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

  • うーん・・・

    Doの行からとばされました

    No.1の回答に寄せられた補足コメントです。 補足日時:2020/11/29 19:57
  • つらい・・・

    そのように変更しても変わらずです泣

    No.2の回答に寄せられた補足コメントです。 補足日時:2020/11/29 21:44

A 回答 (6件)

こんにちは



ファイルパスの「\」その他に関しては、既に指摘の出ている通りですね。

一方で、開いているブックとのチェックを
>For Each openedbook In Workbooks
で行っていますが、毎回ループでチェックしなければならないのと、ブックを開くごとにチェック対象が増えてゆく(実際は、新しく開いたブックのチェックは不要)という欠点があります。(別に、間違った処理にはなりませんけれど)

さらには、このチェックは、
>If filename <> ThisWorkbook.Name Then
とも重複していることになります。
(Workbooksには、ThisWorkbookも含まれているので)

最初にDictionaryオブジェクト等に、既オープンのブックをリスト化するなどしておくことで、チェックを単純にできるものと考えられます。
また、ロジックを単純化できると、IFのネストやループのネストも減るので、視認性もよくなると思われます。

以下、ご参考までに。

Sub Sample_12047309()
Dim fList, f
Dim folderPath As String, fileName As String

folderPath = ThisWorkbook.Path & "\"
Set fList = CreateObject("Scripting.Dictionary")

For Each f In Workbooks
 fList.Add f.Name, ""
Next f

fileName = Dir(folderPath & "*.xls")
While fileName <> ""
 If Not fList.Exists(fileName) Then _
   Workbooks.Open (folderPath & fileName)
 fileName = Dir()
Wend

End Sub
    • good
    • 0
この回答へのお礼

丁寧にありがとうございます!
考えてたマクロを作ることができました!
ありがとうございました!!

お礼日時:2020/11/30 20:16

とりあえず、修正しておきました。


動作確認済みです。
Public Sub sample()
Dim filename As String
Dim openedbook As Workbook
Dim isbookopen As Boolean


filename = Dir(ThisWorkbook.Path & "\*.xls")
Do While filename <> ""
If filename <> ThisWorkbook.Name Then
isbookopen = False
For Each openedbook In Workbooks
If openedbook.Name = filename Then
isbookopen = True
Exit For
End If
Next
If isbookopen = False Then
Workbooks.Open (ThisWorkbook.Path & "\" & filename)
End If
End If
filename = Dir()
Loop

End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます!
最初に私が訂正してたのは不十分だった用で、書いていただいた通りに訂正したら無事にできました
御丁寧にありがとうございました!

お礼日時:2020/11/30 20:18

>filename = Dir(ThisWorkbook.Path & "*.xls")



これについては 他の方の指摘どり \ が無い

しかし この一行は ループの外にあり
”全て開く” 事は出来ないよな
基本的な事をまったく理解されていないように思われます
    • good
    • 0
この回答へのお礼

Dir関数をなかなか理解できずにうなっていたのを見透かされましたね笑
より正確に思ったものを作れるようになるためにご指摘の通り基本を学び直したいと思います。

お礼日時:2020/11/30 20:19

> Workbooks.Open (filename)





Workbooks.Open (ThisWorkbook.Path & "¥" & filename)

にしてみたら?
    • good
    • 0
この回答へのお礼

無事に解決することができました!
回答ありがとうございました!
また困ったときはお力添え願えるとありがたいです!

お礼日時:2020/11/30 20:21

ThisWorkbook.Path & "*.xls"でなく


ThisWorkbook.Path & "¥*.xls"
としてみては、いかがでしょうか。
この回答への補足あり
    • good
    • 0

デバッグでステップ実行してみた?

この回答への補足あり
    • good
    • 0
この回答へのお礼

やってみたらDoの行から一気にすっ飛ばされました

お礼日時:2020/11/29 19:56

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A