エクセルとアクセスでのフォルダ取得の違い - 実行時エラー13について

このQ&Aのポイント
  • エクセルでは正常に動作するのに対し、アクセスでは実行時エラー13「型が一致しません」が発生します。
  • 質問者はフォルダに入っているフォルダ名を取得し、一つにつなげたいと考えています。
  • ただし、アクセスで上記のコードを実行するとエラーが発生してしまいます。
回答を見る
  • ベストアンサー

エクセルならうまく行くのですがアクセスだとエラーに

エクセルならうまく行くのですがアクセスだとエラーになるのですがなぜでしょうか? フォルダに入ってるフォルダ名を全て取得して一つにつなげたいのですが Sub フォルダ名を取得() 参照設定:Microsoft Scripting Runtime Dim MyFSO As Object Dim MyGetFolder As String Dim MyFolderName As String Dim MyFolder As Folder Dim i As Long MyGetFolder = "D:\My Documents" Set MyFSO = CreateObject("Scripting.FileSystemObject") With MyFSO With .GetFolder(MyGetFolder) For Each MyFolder In .SubFolders MyFolderName = MyFolderName & "," & MyFolder.Name Next End With End With MsgBox MyFolderName Set MyFSO = Nothing End Sub これを実行するとアクセスだと For Each MyFolder In .SubFolders で、実行時エラー13 型が一致しません。 になります。 エクセルもアクセスも参照設定:Microsoft Scripting Runtimeにチェックを入れています。 コードはネットで拾ってきたコードです。 オフィスの種類は2003・OSはXPです。

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.1

> アクセスだとエラーになるのですがなぜでしょうか? こちらの環境(Acc2003・WinXP Home)にて、提示されたコードを 標準モジュールに貼り付けて、イミディエイト ウィンドウから実行して みましたが、サブフォルダ名が問題なく表示されました。 > For Each MyFolder In .SubFolders > で、実行時エラー13 型が一致しません。 とのことですが、FileSystemObjectのSubFoldersのメンバーの型は Folderで間違いありません。 ですので、可能性としては  a)「Microsoft Scripting Runtime」よりも優先順位が上の参照先   で、「Folder」という名前のオブジェクトが定義されている  b)同じMDBファイルに、「Folder」という名前のクラスモジュールがある といったことが考えられます。 (別のクラスで定義されたFolder型の変数に、FileSystemObjectの  Folderを格納しようとしたため、型不一致となった、と) ※そちらの環境下で、新規ファイルを作成して、Microsoft Scripting  Runtimeへの参照のみを追加した状態で、提示されたコードをすれば、  この推測の正否を確認できます) 上記の推測が正しければ、以下のように「何が定義しているFolderか」 を明示する形に修正すれば、エラーにはならなくなるはずです。 (但し、独自のクラスモジュールで「Folder」を定義している場合は、  今回発生したようなエラーを未然に防ぐため、名前の変更を検討される  ことをお勧めします) 【現在】   Dim MyFolder As Folder 【修正】   Dim MyFolder As Scripting.Folder

KVWLTZGGTUNMJ
質問者

お礼

ありがとうございました。

関連するQ&A

  • VBA 一つのフォルダの中のフォルダ名とファイル名

    一つのフォルダの中のフォルダ名とファイル名を取得したい場合は ************************************** Sub test() Dim MyFileName As String Dim MyFolderName As String Dim myFSO As Object Dim MyFolder As Scripting.Folder MyFolderName = "C:\" 'フォルダを取得 MyFileName = Dir(MyFolderName & "*.*") Do While MyFileName <> "" Debug.Print MyFileName MyFileName = Dir() Loop 'ファイルを取得 Set myFSO = CreateObject("Scripting.FileSystemObject") With myFSO With .GetFolder(MyFolderName) For Each MyFolder In .SubFolders Debug.Print MyFolder.Name Next End With End With Set myFSO = Nothing End Sub ************************************** の様に ファイル名・フォルダ名をそれぞれループして取得しないとダメでしょうか? もうちょっとスマートなコードはありますか?

  • エクセルVBAで質問です

    下のコードをみつけました。 質問が二つあります。 1.エラーになります。 実行するとユーザー定義型は定義されていません、と出ます。どこが不具合でしょうか?おなじように記述したつもりですが・・・ 2.コードでは、Cドライブの中にあるフォルダに固定されていますが、これをウィンドウを表示させて、検索したいフォルダを選択させて調べるようにできますか? どうぞよろしくお願いします。 Sub フォルダ取得() Dim myFSO As New FileSystemObject Dim myFolders As Folders Dim myFolder As folder Dim i As Integer Set myFolders = myFSO.GetFolder("C:\").SubFolders i = 1 For Each myFolder In myFolders Cells(i + 1, 1).Value = myFolder.Name i = i + 1 Next End Sub

  • エクセルVBA ファイル取得方法?

    エクセル2000のVBAにて 外付ハードディスクにあるファイルを取得しようとして、 下記のように書き込みました。 Private Sub CommandButton1_Click() Dim myFSO As New FileSystemObject Dim myFolder As Folder Dim myFiles As Files Dim myFile As File Set myFolder = myFSO.GetFolder("L:\製品実現プロセス書類\作業標準書\ ComboBox1") Set myFiles = myFolder.Files For Each myFile In myFiles ComboBox2.AddItem myFile.Name Next End Sub Private Sub UserForm_Initialize() Dim myFSO As New FileSystemObject Dim myFolders As Folders Dim myFolder As Folder Set myFolders = myFSO.GetFolder("L:\製品実現プロセス書類\作業標準書\").SubFolders i = 1 For Each myFolder In myFolders ComboBox1.AddItem myFolder.Name Next ComboBox1.ListIndex = 0 '初期値 End Sub コンボボックス1には フォームを開いたときにハードディスクLの製品実現プロセス書類フォルダ内の作業標準書フォルダー内のフォルダをすべてを書き込むようして、 コンボボックス2にはコマンドボタン1をクリックしたときに コンボボックス1で選択したフォルダ内のファイルを取得したいのですがパスが見つかりませんのエラーが出ます。 たぶん、コンボボックス1の書き込み方を間違えていると思いますが わかりません?? 教えていただけないでしょうか?

  • FileDateTime

    Dim MyFileName As String Dim MyPath As String Dim NewName As String Dim objFS As FileSystemObject Dim objFol, shellObj, folderObj, MyFolderName, myFile Dim New撮影日時 As String Sub test() MyFileName = "C:\Users\写真" Set objFS = CreateObject("Scripting.FileSystemObject") Set shellObj = CreateObject("Shell.Application") With objFS With .GetFolder(MyFileName) For Each MyFolder In .SubFolders MyPath = MyFileName & "\" & MyFolder.Name & "\" Set objFol = objFS.GetFolder(MyPath) Set folderObj = shellObj.Namespace(MyPath) MyFileName = Dir(MyPath & "*.*") Do While MyFileName <> "" ’ここでエラー New撮影日時 = FileDateTime(MyPath & folderObj.ParseName(MyFileName)) MyFileName = Dir() Loop Next End With End With Set objFS = Nothing End Sub このコードは何が変ですか? 写真フォルダに入っているサブフォルダの写真ファイルの撮影日時を取得したいのですが FileDateTime(MyPath & folderObj.ParseName(MyFileName)) で 実行時エラー_91「オブジェクト変数またはWithブロック変数が設定されていません」 になります。 原因がわかりません。 オフィス2010、アクセスです。

  • テキストファイルをエクセルに移すマクロのことで?

    以前、複数のテキストファイルをエクセルに移すマクロを教えてもらったのですが、 以下マクロですと、フォルダのパスを指定しないといけません。 今回教えてもらいたいのは、フォルダのパスを指定しなくてもよい方法です。 どういう事かと言うと、仮にディスクトップにフォルダがあるとします。 そのフォルダの中には、マクロが入っているエクセルシートとテキストが入っているフォルダです。 つまり、そのフォルダ内だけで、処理をしたいと考えています。 また、フォルダ名は、その時によって異なります。 今までは、以下の方法を使っていたのですが、ちょっと使いにくいと感じています。 申し訳ありませんが、どなたか教えていただけないでしょうか? Sub Macro() Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Dim FolderPath As String 'ここのアドレスをファイルが格納されているフォルダのパスに変えてください FolderPath = "C:\Users\・・・" Dim myFile As Object Dim i As Long i = 2 Dim myFolder As Object For Each myFolder In fso.GetFolder(FolderPath).SubFolders For Each myFile In fso.GetFolder(myFolder).Files Cells(i, 4).Value = myFolder Cells(i, 1).Value = myFile.Name Cells(i, 7).Value = fso.OpenTextFile(myFile.Path).ReadAll() i = i + 1 Next Next End Sub Private Sub CommandButton1_Click() End Sub

  • とある特定のフォルダで無限ループに陥る

    Sub 全てのファイル名を振り直す() i = 1 Set myFSO = CreateObject("Scripting.FileSystemObject") With myFSO With .GetFolder(フォルダ名) For Each MyFolder In .SubFolders NewFolder = MyFolder.Name Call フォルダ内のファイル名を変更する(NewFolder) Next End With End With Set myFSO = Nothing End Sub Sub フォルダ内のファイル名を変更する(NewFolder As String) Debug.Print NewFolder strPathName = フォルダ名 & NewFolder & "\" strFileName = Dir(strPathName & "*.*") Do While strFileName <> "" Name strPathName & "\" & strFileName As strPathName & "\" & Format(i, "0000") & ".gif" i = i + 1 strFileName = Dir() Loop End Sub こんな感じでフォルダの中のファイル名をループし、変更しているのですが とあるフォルダの中をループすると、 無限ループに陥ります。 原因は、 strFileName = Dir(strPathName & "*.*") Do While strFileName <> "" の時点でファイル名を変更するのでいつまでたっても終わりが来ないからなのですが フォルダ仮1は大丈夫なのに、フォルダ仮2をループし始めると無限ループに陥ります。 フォルダ名に問題があるのでしょうか? フォルダ名はネットには書けません。

  • 実行時エラー 76 パスが見つかりません。

    VBAのFileSystemObjectでフォルダをコピーしているのですが フォルダ1は問題なくコピーできるのですが 毎回フォルダ2だけは、 実行時エラー 76 パスが見つかりません。 と言うエラーになってしまいます。 Sub Sample() Dim myFSO As Object Dim MyPath As String MyPath = "C:\" Set myFSO = CreateObject("Scripting.FileSystemObject") myFSO.CopyFolder MyPath & "フォルダ2", MyPath & "新フォルダ2" Set myFSO = Nothing End Sub このようなコードなのですが、フォルダ1もフォルダ2も同じコードを使っています。 フォルダ2に関しては容量が10GBくらいありますが、フォルダが重すぎるのが原因でしょうか?

  • FSOでエクセルファイルを作成したい

    FSOでエクセルファイルを作成したいのですが、 ファイルの作成はできますが、作成したファイルが開けません。 Sub 新規Excelファイルを作成する() Dim MyFile As String Dim myFSO As Object MyFile = "管理簿.xlsx" Set myFSO = CreateObject("Scripting.FileSystemObject") With myFSO.CreateTextFile("C:\" & MyFile) .Close End With Set myFSO = Nothing End Sub で、エラーにならずうまくいっています。 が、その出来上がったファイルを開こうとすると 「ファイル形式またはファイル拡張子が正しくありません」 と言う旨のメッセージが表示されます。 何が間違ってますか? よろしくお願いします。

  • エクセルマクロでフォルダのコピーがしたい

    こんにちわ 色々調べてフォルダのコピーはできたのですが、色々いじっていて分からないことが出てきたので質問に来ました。 やりたいことはフォルダをコピーしたいのですが、それぞれ名前を自動で変えようと思い下記(1)を元に下記(2)を作ってみましたが、動きませんでした。 (1)いくつかのサイトを見て動いたマクロ sub test() Dim myFSO As New FileSystemObject myFSO.CopyFolder "C:\test", "C:\test2" End Sub (2)ちょっといじって動かないマクロ sub test() Dim myFSO As New FileSystemObject Dim name As String Dim name2 As String name = "C:\test" name2 = "C:\test2" myFSO.CopyFolder "name", "name2" End Sub 「パスが見つかりません」と出てきたので、読み込んでいないのだとは思うのですが、どうしたら動くかアドバイスをいただきたいです。 よろしくお願いします。

  • FSOを使いサブフォルダのファイル操作

    同じ階層のサブフォルダにxlsm入るが入っており、VBAによりモジュールを解放しようと試みています。 まずは、FSOを使ってサブフォルダにアクセスしようとしましたが、下から6行目でエラー(424 オブジェクトが必要です)が出てしまい、解決できませんので、ご教示いただけないでしょうか? よろしくお願いします Sub DeleteMain() With Application.FileDialog(msoFileDialogFolderPicker) If Not .Show Then Exit Sub Call DeleteSub(folderPath:=.SelectedItems(1)) End With End Sub Sub DeleteSub(folderPath As String, Optional mycount As Long = 0) Dim fso As Object, myFolders As Object, myfile As Object Set fso = CreateObject("Scripting.FileSystemObject") Set myFolders = fso.GetFolder(folderPath).SubFolders For Each myfile In fso.GetFolder(folderPath).Files mycount = mycount + 1 ' Cells(mycount, 1) = myfile.Path Debug.Print myfile.Path Next For Each myFolders In fso.GetFolder(folder.Path).SubFolders Call DeleteSub(myFolder.Path, mycount) Next Set fso = Nothing Set myFolders = Nothing End Sub

専門家に質問してみよう