[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/07/01(Fri) 00:38
投稿者名:はせ
Eメール:
URL :
タイトル:
配列中から配列の番号を検索する
初めて投稿します。
VBであるコード番号に対応した文字列を格納する配列を作成して
 (マスタとして使用してるのですが・・。)
対応文字列 > コード番号
の処理を高速に行なう方法をご教授願います。

 配列
masuta(0)="あああ"
masuta(1)="ああい"
masuta(2)="ああう"
masuta(3)="ああお"
  ・・・略
masuta(9999)="んんん"

 ”てきな” は何番でしょうか?
または”がぎぐ”は配列に存在するか?調べたい

のような使い方です。

for ~ next で全ての配列を見る方法しか思いつかないのですが
どうしても件数が多い場合は時間がかかりすぎて・・・。

良い方法をご存知でしたらお願いします。

投稿時間:2005/07/01(Fri) 09:15
投稿者名:
Eメール:
URL :
タイトル:
Re: 配列中から配列の番号を検索する
なぜ9999が「んんん」なのかは置いといて…
N進数(N=あ〜んの文字数)として考えれば計算で求めることができるんじゃないでしょうか?

> 初めて投稿します。
> VBであるコード番号に対応した文字列を格納する配列を作成して
>  (マスタとして使用してるのですが・・。)
> 対応文字列 > コード番号
> の処理を高速に行なう方法をご教授願います。
>
>  配列
> masuta(0)="あああ"
> masuta(1)="ああい"
> masuta(2)="ああう"
> masuta(3)="ああお"
>   ・・・略
> masuta(9999)="んんん"
>
>  ”てきな” は何番でしょうか?
> または”がぎぐ”は配列に存在するか?調べたい
>
> のような使い方です。
>
> for ~ next で全ての配列を見る方法しか思いつかないのですが
> どうしても件数が多い場合は時間がかかりすぎて・・・。
>
> 良い方法をご存知でしたらお願いします。

投稿時間:2005/07/01(Fri) 10:01
投稿者名:ダンボ
URL :
タイトル:
Partition関数
> 良い方法をご存知でしたらお願いします。

Partition関数を調べてみてください。まさにお望みの機能に「近い」物だと思います。
・この関数は私も使ったことが無いので、はせさんの望みどおりかはちょっと不安。
・速度については、中でどう実装しているか分からないが機械語コードである分速いのでは。
(まあコーディングが綺麗になることは言えそう)

投稿時間:2005/07/01(Fri) 11:41
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: 配列中から配列の番号を検索する
> 対応文字列 > コード番号
> の処理を高速に行なう方法をご教授願います。

私なら、たとえば

  Set Dict = CreateObject("Scripting.Dictionary")
  Dict("あああ") = 0
  Dict("ああい") = 1
  Dict("ああう") = 2
  Dict("ああお") = 3
  Dict("んんん") = 9999
  Key = "ああう"
  If Dict.Exists(Key) Then
     MsgBox Dict(Key)
  Else
     MsgBox "未登録:" & Key
  End If

のような、逆引き用の Dictionary を用意するか、または、配列を使わず、

  Dim RS As ADODB.Recordset

  Set RS = New ADODB.Recordset
  RS.Fields.Append "Name", adVarWChar, 30
  RS.Fields.Append "Index", adInteger
  RS.Open
  RS.Fields("Name").Properties("OPTIMIZE").Value = True
  RS.Fields("Index").Properties("OPTIMIZE").Value = True
  RS.AddNew Array("Name", "Index"), Array("あああ", 0)
  RS.AddNew Array("Name", "Index"), Array("ああい", 1)
  RS.AddNew Array("Name", "Index"), Array("ああう", 2)
  RS.AddNew Array("Name", "Index"), Array("ああお", 3)
  RS.AddNew Array("Name", "Index"), Array("べんし", 9999)
  RS.AddNew Array("Name", "Index"), Array("んんん", 9999)

  Key = "ああお"
  RS.Filter = "Name='" & Key & "'"
  If RS.EOF Then
     MsgBox "未登録:" & Key
  Else
     MsgBox RS.Collect("Index")
  End If
  RS.Filter = adFilterNone

  Index = 9999
  RS.Filter = "Index=" & CStr(Index)
  S = ""
  Do Until RS.EOF
      S = S & vbCrLf & "[" & RS.Fields("Name").Value & "]"
      RS.MoveNext
  Loop
  RS.Filter = adFilterNone
  MsgBox Mid(S, 3)

のように、レコードセットを使って管理する手法をとるかも。

投稿時間:2005/07/01(Fri) 20:02
投稿者名:はせ
Eメール:
URL :
タイトル:
Re^2: 配列中から配列の番号を検索する
ありがとうございました。

琴さん ダンボさん
 すいません便宜上 "あああ"〜"んんん"を使ってしまって・・・
 特に連続性のない文字列配列なのです
例えば、ですけど 商品コード & 商品名 とかなのです。
例えが誤解を招いてすみません

魔界の仮面弁士
 ADOの配列を使うことを以前思いついたのですがインデックスを使うと
高速になることを考えていませんでした。
ADOを使って関数化して使ってみたいと思います。
あと、Scripting.Dictionaryも初めて知りました。
 これも他のところでいろいろ使えそうなので覚えておきます。

みなさんありがとうございました。

投稿時間:2005/07/01(Fri) 22:53
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^3: 配列中から配列の番号を検索する
> 魔界の仮面弁士
敬称略。(笑

>  ADOの配列を使うことを以前思いついたのですがインデックスを使うと
> 高速になることを考えていませんでした。
OPTIMIZEダイナミックプロパティを指定すると、Find や Filter の効率が上がります。
ただし、VB文字列型(adBSTR)のフィールドには適用できないという制限があるので、
可変長文字列型(adWVarChar)で最大文字数を定義しなければならないのが難点かも。

> ADOを使って関数化して使ってみたいと思います。
値を保持するのですから、関数ではなく、クラス化した方が使いやすいのでは。

> あと、Scripting.Dictionaryも初めて知りました。
Dictionary を利用するなら、SCRRUN.DLL を参照設定して使うと楽ですよ。

投稿時間:2005/07/04(Mon) 03:00
投稿者名:はせ
Eメール:
URL :
タイトル:
ありがとうございました。
魔界の仮面弁士さま!
 ありがとうございました。

クラス化して使ってみることにしました。

しっかしオブジェクト指向がよ〜わからん

やる意味が理解できてないので・・・()
 参考になるページがあったら教えてくださいね
(VBではあんまりやらないのか?)

また質問させていただきます。