• ベストアンサー

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/17069)
回答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