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

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

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

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

2回答

15666閲覧

Dir関数を用いてフォルダ内のブック名を表示するプログラムで発生するエラー

sunaday

総合スコア6

VBA

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

1クリップ

投稿2020/04/01 15:35

前提・実現したいこと

エクセルVBAの練習として、Dir関数を用いて該当フォルダ内にあるブックの名前を表示するコードを書いています。以下のような問題が発生しています。どこに問題があるかわかる方ご回答いただければ幸いです。

発生している問題・エラーメッセージ

7行目:メッセージボックスは表示されるが空白である。実際は該当フォルダに入っているブック名が「○○.xlsx」と表示されるようにしたい。 8行目:「プロシージャの呼び出し、または引数は不正です。」

該当のソースコード

Sub message()
Dim フォルダー名 As String
Dim ブック名 As String
フォルダー名 = ThisWorkbook.Path & "¥"
ブック名 = Dir("フォルダー名" & "*.xlsx")
Do While ブック名 <> " "
MsgBox ブック名
ブック名 = Dir()
Loop
End Sub

試したこと

5行目において、変数「フォルダー名」にダブルクォーテーションを付けた状態で上記の問題が発生します。ダブルクォーテーションがないと、5行目で「ファイル名または番号が不正です。」とエラーが出てしまいます。

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

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

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

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

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

imihito

2020/04/01 22:48

コードの記載されているブックはどこに保存されていますか? もしかしてOneDriveなどではないですか?
meg_

2020/04/02 00:34

コードは「コードの挿入」で記入してください。
sunaday

2020/04/02 15:22

ご回答いただきありがとうございます。 保存場所を変更することで解決できました。 OneDriveに保存されている状態でできなかったのは何故でしょうか? コードの記入の仕方、以後気を付けます。
guest

回答2

0

ベストアンサー

修正点は2箇所

変数は"で囲んではいけない。囲むと単なる文字列になる。
" "は半角空白、Dir関数がファイルが見つからないときに返すのは ""(空文字列、長さ0の文字列)

vba

1Sub message() 2 Dim フォルダー名 As String 3 Dim ブック名 As String 4 フォルダー名 = ThisWorkbook.Path & "\" 5 ブック名 = Dir(フォルダー名 & "*.xlsx") 6 Do While ブック名 <> "" 7 MsgBox ブック名 8 ブック名 = Dir() 9 Loop 10End Sub

投稿2020/04/01 18:33

hatena19

総合スコア33694

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

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

sunaday

2020/04/01 22:39

回答いただきありがとうございます。 変数の”を外し、6行目の""を空文字列にしたところ、5行目を実行しようとしたときに「ファイル名または番号が不正です。」と表示されてしまいます。 この場合どのように書き換えたらよいでしょうか、、?
hatena19

2020/04/01 23:57

回答のコードで確認しましたが、エラーなく正常に実行できています。 回答のコードをコピーしてそれを実行して確認してください。
guest

0

OneDriveに保存されている状態でできなかったのは何故でしょうか?

についての回答です。

「ローカルウィンドウ」などで、ThisWorkbook.Pathのパスを確認すればわかるのですが、
OneDrive上のファイルの場合https://d.docs.live.net/~で始まるパス(WEB上のURL)となってしまいます。
イメージ説明

https://~のパスはDir関数にはフォルダと認識されないため「ファイル名または番号が不正です。」のエラーが発生します。

対処としては、OneDriveに保存されている状態でもC:\~のようなローカルのパスを取得できるのがベストですが、調査不足で取得方法は不明です。

他の対処としては以下が考えられます。

  • ユーザーに設定を変えて貰う

参考

OneDriveの仕様が変わったのでしょうか? - マイクロソフト コミュニティ

  • 特定の文字列から始まったらEnviron("OneDrive")でパスの先頭を置き換える

vba

1'かなり適当&決め打ちの処理。 2Dim fso As Object 'As Scripting.FileSystemObject 3Set fso = VBA.Interaction.CreateObject("Scripting.FileSystemObject") 4 5Dim p As String 6p = ThisWorkbook.Path 7 8 9If VBA.Strings.InStr(1, p, "https://d.docs.live.net/", vbBinaryCompare) = 1 Then 10 'OneDriveのパスなら~ 11 Dim s() As String 12 s = VBA.Strings.Split(p, "/", Limit:=5, Compare:=vbBinaryCompare) 13 14 p = fso.GetAbsolutePathName(fso.BuildPath(VBA.Interaction.Environ$("OneDrive"), s(UBound(s)))) 15End If 16 17MsgBox p
  • (ファイル名の列挙が目的であれば)Shell.Applicationを使用する

vba

1Sub message2() 2'https://teratail.com/questions/250814 (Dir関数を用いてフォルダ内のブック名を表示するプログラムで発生するエラー) 3 4 'Shell32.~となっている型宣言は、「参照設定」から「Microsoft Shell Controls And Automation」を参照すると使用可能。 5 6 'ファイル列挙に必要なオブジェクトをインスタンス。 7 Dim appShell As Object 'As Shell32.Shell 8 Set appShell = VBA.Interaction.CreateObject("Shell.Application") 9 10 '探索するフォルダーを指定。 11 Dim rootDir As Object 'As Shell32.Folder3 12 Set rootDir = appShell.Namespace(ThisWorkbook.Path) 13 14 'rootDirの中のファイル・フォルダーの集合。 15 Dim dirItems As Object 'As Shell32.FolderItems3 16 Set dirItems = rootDir.Items() 17 18 19 'dirItems.Filterの1個目の引数に指定する定数。 20 'https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/ne-shobjidl_core-_shcontf 21 Const SHCONTF_FOLDERS = &H20& 'フォルダのみを探す場合。 22 Const SHCONTF_NONFOLDERS = &H40& 'ファイルのみを探す場合。 23 24 '「*.xlsx」のファイルのみにフィルター。 25 dirItems.Filter SHCONTF_NONFOLDERS, "*.xlsx" 26 27 Dim ブック名 As String 28 29 Dim itm As Object 'As Shell32.FolderItem 30 For Each itm In dirItems 31 ブック名 = itm.Name 32 MsgBox ブック名 33 Next itm 34 35End Sub 36

投稿2020/04/03 12:06

imihito

総合スコア2166

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問