• ベストアンサー

VB6のコレクション

Dim FileSys As Object Dim Prox As Object Dim fj As Object Set FileSys = CreateObject("Scripting.FileSystemObject") Set Prox = ColFileSys.Files For Each fj In Prox ~ 質問を簡単にするために端折ってあります。 上記のコードで動いているプログラムがあるのですが filesはfileコレクションを返すとあり、上記のコードの宣言を Dim Prox As Collection と変更しました。 これで理論的にはうまく動くかと思ったのですが 「型が一致しません」のエラーになりました。 Collectionの運用法に関しては間違っていないと思いますが 何が原因でエラーなのかさっぱり分かりません。 なお、Collectionに関しては次のサイトを参考にしました。 そこをスクロールしていって上から4つ目のキーというところに用法があります。 http://homepage1.nifty.com/rucio/main/shokyu/jugyou23.htm

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

  • ベストアンサー
  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.4

No3,onlyromです。 >今家に帰ってDim Prox As Collectionをどうすればうまく動くのか思案中 です。 できないことはありませんが、それにはもうひとつ変数をとってやらなければいけません。 ただ、そんなコードを書くと、他の人がそのコードを見たら、おい、おい、となりますよ。 ゆえに、却下!(^^;;; >MSDNだとファイルオブジェクトとあったので >Dim Prox As Files >Dim Prox As File >を試してみたのですが両方ともダメでした。 >勿論objectとすればいいのですが、それだと芸がないような気がしまして・・・ そのようにするためにはNo1の回答にもあるように、Early Bindingをします。 で、その方法ですが、簡単です。 Microsoft Scripting Runtime を参照設定するだけ。 そうすると以下のように明示できます。 '---------------------------------- Sub Test()  Dim FileSys As FileSystemObject  Dim myFolder As Folder  Dim Prox As Files  Dim fj As File  Set FileSys = New FileSystemObject  '●CreateObjectなし●  Set myFolder = FileSys.GetFolder("C:\BBB")  Set Prox = myFolder.Files  For Each fj In Prox    MsgBox fj.Name  Next fj End Sub '--------------------------------------------------- と、いうことですから、 >バインディングという言葉も初めて聞きました。 >こちらは日を改めまして勉強します。 などと言わずにいま直ぐ調べてみることをお奨めします。  

yasyatengu
質問者

お礼

なるほど、こういうときにバインディングという言葉を使うのですね。 Filesの宣言でうまくいく方法がありましたか。 NEW という言葉が出てきましたが、これがキーワードみたいですね。 なぜNEWなのかという文法的なことは未だよく分かりませんが あまりにも明快な回答を頂き大分前に進むことができると思います。 どうもありがとうございました。

その他の回答 (3)

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.3

既にエラーの原因はお分かりだと思いますが。。 質問のCollectionオブジェクトは自分で作成するものです。 で、Collectionオブジェクトの便利な使い方について一言。 例えば、商品マスターがあり、 コードをキーにしてCollectionオブジェクトを作成すると、 コードで商品名を取出すことができます。 '---------------------------------------------- Private Sub Form_Click()  Dim i As Integer  Dim myKeys  Dim myValues  Dim myTable As Collection  myKeys = Array("F001", "F002", "F003")  myValues = Array("りんご", "みかん", "バナナ")  Set myTable = New Collection  For i = LBound(myValues) To UBound(myValues)    myTable.Add myValues(i), myKeys(i)  Next i  MsgBox "myTable(2): " & myTable(2) & vbLf & vbLf _  & "myTable(""F002""): " & myTable("F002") End Sub '-------------------------------------------------   もちろん、コントロールなどもセットできるのは言うまでもありません。

yasyatengu
質問者

お礼

どうも発展的回答ありがとうございます。 見たところ配列ですが、これって配列に使えるということですか? 便利とのご指摘なので挑戦してみたいと思います。 ところで#1のお礼にも書きましたが Dim Prox As Collectionを Dim Prox As Object以外でどう宣言すれば動くか思案中です。 もしよければ教えて下さい。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

http://q.hatena.ne.jp/1162664828 が一例ですが Set objFolder = objFS.GetFolder(TARGET_FOLDER) For Each objFile In objFolder.Files sFname = objFile.Name のようにGetFolder(TARGET_FOLDER) に当たるものがForEach InのInでFilesを指定するには必要では。 ーー Set FileSys = CreateObject("Scripting.FileSystemObject") Set Prox = ColFileSys.Files FileSysとColFileSys.Files が不一致ですが、よいのですか。

yasyatengu
質問者

お礼

お返事ありがとうございます。 表現を端折ってお手数をおかけしたようです。 質問に書いてありますように現在動いているプログラムです。 わが社で稼働しているプログラムの一部分なので動作は保証はされています。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

Collctionクラスと Filesクラスとは別物です ですから『型が一致しません』となります 『Microsoft Scripting runtime』を参照設定して F2キーでオブジェクトブラウザを起動して 『Collection』 と 『Files』 を検索してみましょう Filesの方は ItemとCountプロパティしかありません Collectionの方は AddやRemoveメソッドがあります ItemやCountも関数として実装しています このあたりの実装が違うので そのまま単純に代入出来ないわけです CreateObjectとObject型での遅延バインディングより 参照設定しておいて 事前バインディングを使用したほうがいいかと思います Excelなどバージョンが異なる物場合は 開発時に『事前バインディング』、リリース時に『遅延バインディング』と言った事もしますが ・・・

yasyatengu
質問者

お礼

お返事ありがとうございます。 コレクションはコレクションでも幾つか種類があるのですか。 これは気付きませんでした。 バインディングという言葉も初めて聞きました。 こちらは日を改めまして勉強します。 今家に帰ってDim Prox As Collectionをどうすればうまく動くのか思案中です。 MSDNだとファイルオブジェクトとあったので Dim Prox As Files Dim Prox As File を試してみたのですが両方ともダメでした。 勿論objectとすればいいのですが、それだと芸がないような気がしまして・・・ この場合の宣言の方法が分かりましたら教えて下さい。

関連するQ&A

  • CreateObjectでエラー

    VB初心者です。 VB6で以下のコードのCreateObjectがエラー になってしまいます。 何が原因と考えられますか? Dim objFileSys As Object CheckFileExist = False 'ファイルの有無を確認する Set objFileSys = CreateObject("Scripting.FileSystemObject")   ↑   ここで、エラーが発生 CheckFileExist = objFileSys.FileExists(S_strFileFull) Set objFileSys = Nothing   エラーメッセージが   「オートメーションエラーです。    ライブラリが登録されてません。」   と出てしまいます。何が原因と考えられますか?   よろしくお願いします。

  • 実行時エラー 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くらいありますが、フォルダが重すぎるのが原因でしょうか?

  • EXCEL「Dictionaryオブジェクト」宣言

    EXCEL VBAにて Dictionaryオブジェクトを利用しようと思い ネット検索して調べていると・・・ 1)Dim MyDic As Object Set MyDic=CreateObject("Scripting.Dictionary") 2) Dim MyDic As Scripting.Dictionary Set MyDic = New Scripting.Dictionary 3) Dim MyDic Set MyDic=CreateObject("Scripting.Dictionary") 4) Dim myDic As New Scripting.Dictionary 上記の4パターンが出てきました。 いずれも「連想配列」を使うものなのですが、 オブジェクト型、バリアント型、Newキーワードで宣言・・・ 4つの違いがイマイチ理解できません。 違いを教えてください。

  • 「New」はつけた方がいいのでしょうか?

    vbaなのですが、 FileSystemObjectでドライブの情報を取得したりファイル操作をしているのですが FileSystemObjectを宣言する時は、 Dim myFSO As New FileSystemObject にしたほうがいいのか、 Dim myFSO As FileSystemObject でいいのか教えてください. Sub Sample() Dim myFSO As New FileSystemObject Dim Drv As Variant Dim buf As String Set myFSO = CreateObject("Scripting.FileSystemObject") For Each Drv In myFSO.Drives Debug.Print Drv.DriveLetter Next Drv Set myFSO = Nothing End Sub 上記のコードは、newを付けても付けなくても結果は変わりませんでした。 よろしくお願いします。

  • VBA SFO C:\Windows

    Cドライブには、 IntelもWindowsのどちらのフォルダも存在するのに Sub Sample() Dim myFSO As Object Debug.Print CreateObject("scripting.filesystemobject").GetFolder("C:\Intel").Size Debug.Print CreateObject("scripting.filesystemobject").GetFolder("C:\Windows").Size Set myFSO = Nothing End Sub をVBAで実行すると \Windows の方だけエラーになります。 エラー内容は 実行時エラー 70 書き込みできません。 です。 何故でしょうか?

  • VB6でFileSystemObjectで読込

    Visual BasicV6でFileSystemObjectを(もし必要ならTextStream オブジェクトも)使って、テキストファイルを変数に読み込む実例を作っていただけませんでしょうか。 UTF-8コードのテキストファイルを読み込みたいのですが、当方、VB.NETは使えないし、MS社などのFileSystemObjectの使い方についての下記説明を見ても、どこで変数に入っていることが分からないため、お願いいたします。 Dim fso, MyFile Set fso = CreateObject("Scripting.FileSystemObject") Set MyFile = fso.CreateTextFile("c:\testfile.txt", True) MyFile.WriteLine("This is a test.") MyFile.Close Visual BasicV6自体は十分使えますが、FileSystemObjectなどについては全く分かりません。よろしくお願いいたします。

  • VB6.0にて、CSVファイルを読み込もうとしているのですが、1行ずつ

    VB6.0にて、CSVファイルを読み込もうとしているのですが、1行ずつ読み込めません。 以下のコードで、Lineのメッセージボックスが表示されないのです。 どなたか教えていただけないでしょうか。よろしくお願いします。 'CSVファイル読み込み Sub Stream() Dim Line, Temp As Variant Dim objFSO As Object Dim objStream As Object Const ForReading = 1, ForWriting = 2, ForAppending = 3 Set objFSO = CreateObject("Scripting.FileSystemObject") Set objStream = objFSO.OpenTextFile(strDFpath & strDFname(1), ForReading, False) Temp = objStream.ReadAll MsgBox Temp '最後の行までループ Do Until objStream.AtEndOfLine - 1 <> True '1行読む Line = objStream.ReadLine MsgBox Line Loop objStream.Close Set objStream = Nothing Set objFSO = Nothing End Sub

  • ディレクトリの存在有無の確認方法

    VB6を使っています。 ファイルの存在有無はFileSystemObjectを使って以下のような方法で確認しいますが、ディレクトリの存在有無はどのようにすれば、確かめられるでしょうか? Dim objFileSys As Object Set objFileSys = CreateObject("Scripting.FileSystemObject") If objFileSys.FileExists("C:ABC.XYZ") Then よろしくお願いします。

  • ファイルへの書き込み

    いままでPrintメソッドを使って書き込みしていました。 ちょっと志向を変えてオブジェクト(?)をつかってプログラミングしています。 ファイルの書き込みでつまづいたので教えてください。 真ん中くらいに質問文があります Dim objFileSystem As Object Dim objFile As Object Dim strFileName As String Dim strBuff As String ' 読み込むファイル名 strFileName = "Readme.txt" ' FileSystemObjectオブジェクトへの参照 Set objFileSystem = CreateObject("Scripting.FileSystemObject") ' ファイルを開く Set objFile = objFileSystem.OpenTextFile(strFileName) ' ファイルの最後に達するまでループ strBuff = strBuff + naiyo.Text   'ここで質問。この書き方だとファイルモードが不正とエラーが出ます。   'この部分どう書けばよいのでしょうか? objFile.writeline (strBuff) ' ファイルを閉じる objFile.Close ' オブジェクトを解放 Set objFileSystem = Nothing Set objFile = Nothing オブジェクト変数(というのでしょうか(^^ゞ)を使ったファイルの書き込み方教えてください。

  • 同名でもエラーにならない理由

    Sub バックアップ作成() Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") FSO.CopyFile CurrentProject.FullName, "C:\test.mdb" Set FSO = Nothing End Sub このコードを実行すると、同じファイルがあってもエラーになりません。 Sub DiskOprate4() MkDir "C:\バックアップ" End Sub なら同名のフォルダがあればエラーになります。 ファイルはエラーにならないがフォルダならエラーになるのでしょうか? それともFSOというのを使うとエラーにならないのですか? よろしくお願いします。

専門家に質問してみよう