tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルArrayListの定義
記事No15726
投稿日: 2013/06/29(Sat) 14:04
投稿者GC
初めまして、
ArrayListの配列をはじめて使いますが、
Dim Ar As New ArrayList

エラーが出ました。
ユーザ定義型は定義されたいません。

参照設定にあると思いますが、
どういう名前(参照可能ライブラリファイル)がわかりません。

教えてください。
よろしくお願いします。
環境VB6 OS:XP

[ツリー表示へ]
タイトルRe: ArrayListの定義
記事No15727
投稿日: 2013/06/29(Sat) 17:25
投稿者魔界の仮面弁士
> ArrayListの配列をはじめて使いますが、
VB6 に ArrayList は存在しません。
(VB.NET には ArrayList がありますが、配列ではありません)

VB.NET の ArrayList に近い物としては、VBA.Collection オブジェクトがあります。
ソートなどが必要なケースでは、ADODB.Recordset で代用する手法もありますね。

とりあえず、VBA.Collection を用いたサンプル:

Dim col As VBA.Collection
Set col = New VBA.Collection

col.Add "Item1"
col.Add "Item2"
col.Add "Item3"

Debug.Print "件数:", col.Count
Debug.Print "1番目:", col(1)
Debug.Print "2番目:", col(2)
Debug.Print "3番目:", col(3)

Debug.Print "2番目を削除"
col.Remove 2

Debug.Print "件数:", col.Count
Debug.Print "1番目:", col(1)
Debug.Print "2番目:", col(2)


もし、Collection や Dictionary などの機能ではどうしても都合が悪いのであれば、
下記の様にして、.NET の ArrayList を呼び出すこともできます。
(個人的にはあまりお奨めしません)

Dim ar As Object
Set ar = CreateObject("System.Collections.ArrayList")

ar.Add "Item1"
ar.Add "Item2"
ar.Add "Item3"

Debug.Print "件数:", ar.Count
Debug.Print "0番目:", ar(0)
Debug.Print "1番目:", ar(1)
Debug.Print "2番目:", ar(2)

Debug.Print "1番目を削除"
ar.Remove 1

Debug.Print "件数:", ar.Count
Debug.Print "0番目:", ar(0)
Debug.Print "1番目:", ar(1)

[ツリー表示へ]
タイトルRe^2: ArrayListの定義
記事No15728
投稿日: 2013/06/29(Sat) 22:42
投稿者GC
魔界の仮面弁士、ご回答ありがとうございます

> VB6 に ArrayList は存在しません。
> (VB.NET には ArrayList がありますが、配列ではありません)
なるほど、自分の知識が不足です。

なぜArrayList あるいは、Arrayを使いたいということは
実は、今は構造体の配列(動的な配列)を使っています。
でも、行の追加、削除するとソートなどかなり面倒くさい。
C++の場合にArrayなどよく使っています。


C++の場合
typedef struct                
{
 CString SysPart;
 CString TayeID;        
 CString TypeID;        
 CString  LinkID;        
 CString  Bcode;        
 CString Teme1;
 CString Teme2;        
}MaeSokuseLink_Link;
CArray<MaeSokuseLink_Link, MaeSokuseLink_Link> m_MaeSokuseLink;
同じくVB6の場合どうなるか

>Dim col As VBA.Collection
>Set ar = CreateObject("System.Collections.ArrayList")
ちょっと足りないかなー

アドバイスお願いします。
よろしくお願いします。

[ツリー表示へ]
タイトルRe^3: ArrayListの定義
記事No15729
投稿日: 2013/06/29(Sat) 23:44
投稿者VBレスキュー(花ちゃん)
>でも、行の追加、削除するとソートなどかなり面倒くさい。
http://www.hanatyan.sakura.ne.jp/vbhlp/fil_Sort.htm

> >Dim col As VBA.Collection
> >Set ar = CreateObject("System.Collections.ArrayList")
> ちょっと足りないかなー
意味が解らないけど

> アドバイスお願いします。
魔界の仮面弁士さんがコードを掲載されておられますが。


下記のようにでも書けばいいのですか?

'Common Language Runtime Library を参照設定してから

Private Sub Command1_Click()
   'Dim ar    As Object         '参照設定しないなら
   'Set ar = CreateObject("System.Collections.ArrayList")
    
    Dim ar    As New ArrayList  '参照設定したなら
    Dim vList As Variant
    ar.Add "Item2"
    ar.Add "Item4"
    ar.Add "Item1"
    ar.Add "Item3"
    
    ar.Sort
    For Each vList In ar
        Debug.Print vList
    Next

    ar.Reverse
    For Each vList In ar
        Debug.Print vList
    Next
End Sub

http://msdn.microsoft.com/ja-jp/library/system.collections.arraylist.aspx

[ツリー表示へ]
タイトルRe^4: ArrayListの定義
記事No15730
投稿日: 2013/06/30(Sun) 12:28
投稿者GC
VBレスキュー(花ちゃん)、ご回答ありがとうございます

> >でも、行の追加、削除するとソートなどかなり面倒くさい。
> http://www.hanatyan.sakura.ne.jp/vbhlp/fil_Sort.htm
>
ありがとう、見てみます。

> > >Dim col As VBA.Collection
> > >Set ar = CreateObject("System.Collections.ArrayList")
> > ちょっと足りないかなー
> 意味が解らないけど
>
説明が不足ですが、すみません。
言いたいことは、例で説明いたします。
1.構造体
Public Type Excel_Str
    tem1 As String
    tem2 As String
    tem3 As String
    tem4 As String
    tem5 As String
End Type
Public ExcelStr() As Excel_Str
mnExcel_n=10
ReDim ExcelStr(mnExcel_n)
2.
for i=0 to 8
ExcelStr(i).tem1 = "Item2" & i
ExcelStr(i).tem2 = "Item2" & i
ExcelStr(i).tem3 = "Item2" & i
ExcelStr(i).tem4 = "Item2" & i
ExcelStr(i).tem5 = "Item2" & i
Next i
3.
3行目に挿入する場合
今の現状では最後に追加するしかない。
ExcelStr(8).tem1 = "Item2" & 4
ExcelStr(8).tem2 = "Item2" & 4
ExcelStr(8).tem3 = "Item2" & 4
ExcelStr(8).tem4 = "Item2" & 4
ExcelStr(8).tem5 = "Item2" & 4
4.
sortedする
以上は、構造体配列のやりかたです。

5.したいことは
ExcelStr(8).tem1 = "Item2" & 4
            .tem2 = "Item2" & 4
            .tem3 = "Item2" & 4
            .tem4 = "Item2" & 4
            .tem5 = "Item2" & 4
一行の中に5個.tem1、.tem2、.tem3、.tem4., tem5があります。
単に
>'Set ar = CreateObject("System.Collections.ArrayList")
で使うと、5個.tem1、.tem2、.tem3、.tem4., tem5が入れる場所がないです。
いい方法がないでしょうか?
よろしくお願いします

[ツリー表示へ]
タイトルRe^5: ArrayListの定義
記事No15731
投稿日: 2013/07/01(Mon) 10:16
投稿者VBレスキュー(花ちゃん)
最初の質問は、ArrayList が使用したいといった質問だったと思ったのですが?

今回のような要望なら、VB2010 等の .NET 系の Visual Basic を使用されるか、現状の方法を
使用されるかだと思います。
(今後も色々要望が増えそうだし、メモリ等の問題もでてくるかも知れないし)

.NET 系のVB の ArrayList なら ar.Add(ExcelStr(i)) のようにして構造体も取り込めるのですが
VB6.0 からだとできないのか? 方法が間違っているのかエラーになるようですネ。
(詳しく調べておりませんので...。)

そもそも、構造体で扱っておられるのは、Excel のデーターのように推測されますが、なぜ
構造体で扱う必要があるのでしょうか?
私も昔は、データーをランダムファイルで構造体で扱っていたのですが、今は、ADO 等の方が
便利なのでデーターを構造体で扱うという事は殆どしていないのですが。

[ツリー表示へ]
タイトルRe^6: ArrayListの定義
記事No15732
投稿日: 2013/07/01(Mon) 13:27
投稿者GC
> 最初の質問は、ArrayList が使用したいといった質問だったと思ったのですが?
>
すみません、最初に、ArrayList が2次元の配列できると思いました。
質問がだんだん増えた。
結論としては、ArrayList を使わないこと。

> そもそも、構造体で扱っておられるのは、Excel のデーターのように推測されますが、なぜ
> 構造体で扱う必要があるのでしょうか?
> 私も昔は、データーをランダムファイルで構造体で扱っていたのですが、今は、ADO 等の方が
> 便利なのでデーターを構造体で扱うという事は殆どしていないのですが。
そうです、今は、mdbファイルのデータを一度読み込んで、編集などにして、最後にmdbファイル
へ書き込むというやりかたです。
直接にmdbを操作などよくわからない部分があります。改めて、新規に質問します。
考えてみたら、やっぱり直接操作ほうが楽ですね、勉強になりました。
ありがとうございました。
ちなみに、いつも、 VBレスキュー(花ちゃん)作ったサンプルを見ています。
使っています。
ありがとうございました。

[ツリー表示へ]
タイトルRe^7: ArrayListの定義
記事No15750
投稿日: 2013/07/08(Mon) 02:07
投稿者魔界の仮面弁士
> そうです、今は、mdbファイルのデータを一度読み込んで、編集などにして、最後にmdbファイル
> へ書き込むというやりかたです。

mdb を扱うなら、ADODB.Recordset で管理されては如何でしょう。
クライアントカーソルの Recordset にすれば、Sortプロパティで並び替えもできますよ。

Jet はバッチカーソルに対応しておらず、複数行の UpdateBatch 更新はできないので、
データの書き戻しは単行ずつ行う必要がありますけれどね。

[ツリー表示へ]
タイトルRe^8: ArrayListの定義
記事No15751
投稿日: 2013/07/11(Thu) 08:55
投稿者GC
魔界の仮面弁士さん、ご回答ありがとう

> mdb を扱うなら、ADODB.Recordset で管理されては如何でしょう。
> クライアントカーソルの Recordset にすれば、Sortプロパティで並び替えもできますよ。
>
情報がありがとう。早速みてみます。

> Jet はバッチカーソルに対応しておらず、複数行の UpdateBatch 更新はできないので、
> データの書き戻しは単行ずつ行う必要がありますけれどね。
     Set dbWorkspace = DBEngine.Workspaces(0)
     Set dbDatabase = dbWorkspace.OpenDatabase(MdbPath2)
で使っています。一行単位でUpdateしています。

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

[ツリー表示へ]