ベストアンサー選定ルールの変更のお知らせ

いつもお世話になっています。

今回VB6でプログラムを作成していて壁にぶち当たってしまいました。
分かる方がいましたらご教授下さい。

タイトル通りなんですが配列の内容の重複をなくした新しい配列を作成したいと考えています。


配列A: 1, 1, 2, 6, 5, 2, 3, 3

配列B: 1, 2, 6, 5, 3

と配列Aの先頭から順に配列Bに入れていきたいのです。

また、配列を動的配列で宣言していますが、配列Bの終わりが不定なので、最後に終端コード?を入れる
必要があるのか??と思っているのですが”EOF”なのでしょうか?

for i=0 to EOF
配列B[i]
next i
とすればすべて取り出せるのでしょうか?


補足が必要でしたら言ってください。
よろしくお願いいたします。

A 回答 (4件)

ユーザー定義型の配列にすれば動的配列にできますよ。


フォームの中とか標準モジュールに定義します。
「a」とか「b」とかは適当に。
Type UType
a As Integer
b As String
End Type

~~~以下は私の前回回答を修正~~

Dim A(7) As UType
Dim B() As UType
と宣言して、
col.Add A(i).a & "|" & A(i).b, A(i).a & "-" & A(i).b
に変えて下さい。
Set col = Nothingの上に出力処理で
For i = 1 To col.Count
'出力(例ではイミディエトウィンドウに書いてます)
Debug.Print col.Item(i)
Next
    • good
    • 0
この回答へのお礼

みなさんの回答を参考にしながらようやく完成しました。
プログラミングは奥が深いな~

また相談させて頂くかも知れませんがよろしくお願いいたします。

今回は本当にありがとうございました。

お礼日時:2006/09/07 10:16

No.2さんと似たようなものかな?



Private Sub Command1_Click()
  Dim A(7) As Integer
  Dim B() As Integer
  Dim col As New Collection
  Dim i As Integer

  A(0) = 1
  A(1) = 1
  A(2) = 2
  A(3) = 6
  A(4) = 5
  A(5) = 2
  A(6) = 3
  A(7) = 3

'ここから本題↓

  For i = LBound(A) To UBound(A)
    '値をキーにしてコレクションに追加してみる
    On Error Resume Next
    col.Add A(i), CStr(A(i))
    If Err.Number = 0 Then
      '無事に追加できれば重複してないので配列Bに追加
      ReDim Preserve B(col.Count - 1)
      B(col.Count - 1) = A(i)
    End If
    On Error GoTo 0
  Next
  Set col = Nothing
End Sub

この回答への補足

早速ありがとうございます.
色々知らない関数?もあり目から鱗状態です.一つずつ確認したいと思います.


あれから色々組み入れていると例では足りない?ような考え方になってしまいました.

というのも


配列A: 1, 1, 2, 6, 5, 2, 3, 3
配列C: a, b, a, a, c, c, a, a

のようにそれぞれ対にして一つの意味をもたさなければ?(1-aでペア,1-bとは別もの)ということになりました.
2次元配列なら...と思ったのですが,動的配列ができないようで
1次元配列を2つ作ってやってみようと思い立ちました.

最大でも30程度のデータかと思うので配列A(30,30)としてもいけるのかな??


配列B: 1, 1, 2, 6, 5, 2, 3
配列D: a, b, a, a, c, c, a

のような感じで出力がしたいのです.
(表のイメージ)

1 | a
1 | b
2 | a
. | .


改良して対応することは可能なのでしょうか?

補足日時:2006/09/06 00:10
    • good
    • 0

お世話になります。



以下のような方法はいかがでしょうか。
1. まず Dictionary で重複の無いデータを作成します。
2. Dictionary に登録された数分の要素をもつ
配列を作成します。
3. 2 で作成した配列に Dictionary の値を入れます。

Private Sub Command1_Click()
  
  Dim arrayA(7) As Integer
  arrayA(0) = 1
  arrayA(1) = 1
  arrayA(2) = 2
  arrayA(3) = 6
  arrayA(4) = 5
  arrayA(5) = 2
  arrayA(6) = 3
  arrayA(7) = 3

  ' Scripting.Dictionary を使用する
  Dim dic As Object
  Set dic = CreateObject("Scripting.Dictionary")
  Dim checkValue As Variant
  For Each checkValue In arrayA
    If Not dic.Exists(CInt(checkValue)) Then
      ' 存在していなければ、Dictionary に登録
      dic.Add CInt(checkValue), "dummy"
    End If
  Next
  
  ' 結果用の配列
  Dim arrayB() As Integer
  ReDim arrayB(dic.Count - 1)
  Dim key As Variant
  Dim index As Integer
  index = 0
  For Each key In dic.Keys
    arrayB(index) = CInt(key)
    index = index + 1
  Next
  Set dic = Nothing
  
  ' 作成の配列の内容を出力
  Dim value As Variant
  For Each value In arrayB
    Debug.Print value
  Next
  
End Sub

この回答への補足

早速ありがとうございます.
Scripting.Dictionaryとは初めてしりました. 勉強になります.

あれから色々組み入れていると例では足りない?ような考え方になってしまいました.

というのも


配列A: 1, 1, 2, 6, 5, 2, 3, 3
配列C: a, b, a, a, c, c, a, a

のようにそれぞれ対にして一つの意味をもたさなければ?(1-aでペア,1-bとは別もの)ということになりました.
2次元配列なら...と思ったのですが,動的配列ができないようで
1次元配列を2つ作ってやってみようと思い立ちました.

最大でも30程度のデータかと思うので配列A(30,30)としてもいけるのかな??


配列B: 1, 1, 2, 6, 5, 2, 3
配列D: a, b, a, a, c, c, a

のような感じで出力がしたいのです.
(表のイメージ)

1 | a
1 | b
2 | a
. | .


改良して対応することは可能なのでしょうか?

補足日時:2006/09/06 00:08
    • good
    • 0
この回答へのお礼

みなさんの回答を参考にしながらようやく完成しました。
プログラミングは奥が深いな~

また相談させて頂くかも知れませんがよろしくお願いいたします。

今回は本当にありがとうございました。

お礼日時:2006/09/07 10:16

適当ですが。

。。

dim i,i_max as integer 'A
dim j,j_max as integer 'B
dim flg as boolean

i = 0
j = 0

i_max = 20
j_max = 0

for i=0 to i_max step 1

flg = 0

for j=0 to j_max step 1
if A[i] = B[j] then
flg = 1
exit for
end if
next

if flg = 0 then
'
else
j_max = j_max + 1
end if

next

この回答への補足

早速ありがとうございます.

あれから色々組み入れていると例では足りない?ような考え方になってしまいました.

というのも


配列A: 1, 1, 2, 6, 5, 2, 3, 3
配列C: a, b, a, a, c, c, a, a

のようにそれぞれ対にして一つの意味をもたさなければ?(1-aでペア,1-bとは別もの)ということになりました.
2次元配列なら...と思ったのですが,動的配列ができないようで
1次元配列を2つ作ってやってみようと思い立ちました.

最大でも30程度のデータかと思うので配列A(30,30)としてもいけるのかな??


配列B: 1, 1, 2, 6, 5, 2, 3
配列D: a, b, a, a, c, c, a

のような感じで出力がしたいのです.
(表のイメージ)

1 | a
1 | b
2 | a
. | .


追加して対応することは可能でしょうか?

補足日時:2006/09/06 00:07
    • good
    • 0
この回答へのお礼

みなさんの回答を参考にしながらようやく完成しました。
プログラミングは奥が深いな~

また相談させて頂くかも知れませんがよろしくお願いいたします。

今回は本当にありがとうございました。

お礼日時:2006/09/07 10:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!