• 締切済み

VBAで配列のデータを検索

初歩的なことかもしれませんが、自力ではどうしてもできなかったので質問させてください。 例えば dim 配列(5) as String 配列(0)=abc 配列(1)=123 配列(2)=def 配列(3)=456 配列(4)=ghi 配列(5)=789 といった配列がある場合で、配列()から「ghi」を検索したい場合は、 どのような手法を使えばよろしいでしょうか。

みんなの回答

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.6

こんにちは 正直何をなさりたいかよくわからないのですけれど、 「止むを得ず配列を受け取っている」(?)のだとしても、 「重複」なしの前提で、「完全一致」がお望みなら、 strS = " " & "ghi" & " " strW = " " & Join(配列, " ") & " " のような形にして Instr() 関数を使うのはどうですか? 戻り値 > 0 で、「判定」が返ります。 例示のように、「すべて文字長が同じという条件」なら、 割り算で「インデックス」が取れます。 エラー処理を考える必要も、まずないだろうし、 ループも要らないし。 (Excel2000以降の「バージョン」限定ですが)   条件が見えないので、何とも言えないけれど、 質問内容と質問の在り方を見る限りは、出来るなら 配列変数による以外の方法を選んだ方が良いように感じます。   「入」と「出」と「目的」によって方法は変わると思いますけれど、 ワークシート関数等のエクセルの機能を使うことを優先的に検討して、 それに溢れたら配列変数という順に、私なら考えます。 そこら辺の理由も見えないので、 的外れでしたらご容赦を。

AB-tetsuya
質問者

お礼

回答ありがとうございます。 皆様のご意見からVBAにこだわらない方が良いのかもしれませんね。 参考にさせていただきます。

すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

#4です。 すみません間違いました。 If 配列(i) = "abc" Then と書いたのは If 配列(i) = "ghi" Then ーー atFor はExit Sub に訂正します。 訂正後は下記コード 練習問題なら InputBoxで聞いて、答えた文字列で検索して Sub test02() Dim 配列(5) As String 配列(0) = "abc" 配列(1) = "123" 配列(2) = "def" 配列(3) = "456" 配列(4) = "ghi" 配列(5) = "789" x = InputBox("検索文字") 'MsgBox UBound(配列) For i = 0 To UBound(配列) If 配列(i) = x Then MsgBox x & "は要素番号" & i & "にあります" Exit Sub End If Next i MsgBox x & "は見つかりません" End Sub

AB-tetsuya
質問者

お礼

回答ありがとうございます。 まだまだ初心者なので、スマートなプログラムが理想ですけど なかなか難しいです。 勉強させていただきます。

すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

質問者は、まだスマートさや探索アルゴリズムなんて考えるレベルでは無いようなので Sub test02() Dim 配列(5) As String 配列(0) = "abc" 配列(1) = "123" 配列(2) = "def" 配列(3) = "456" 配列(4) = "ghi" 配列(5) = "789" 'MsgBox UBound(配列) For i = 0 To UBound(配列) If 配列(i) = "abc" Then MsgBox "ghiは" & i & "にあります" Exit For End If Next i MsgBox "見つかりません" End Sub しかしこんなの解説書の配列の章の例に載っていると思うが。 ーー エクセルではシートのセルが、配列みたいなもので、エクセルVBAでは データとの関連で配列を使う場合は少ないと思う。 初心者はセルデータを、わざわざ配列に格納して、ことを行おうとする例がある様だが、良くない。 ソートなどでは、配列は便利だが、ユーザーがソートプログラムを組むなんて、勧められない。数理学的な計算などなら使うかもしれないが。

すると、全ての回答が全文表示されます。
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.3

ANo.1です。 >VBAのみで検索できたらと考えていましたが、やはりセルを使わないと >できないでしょうか? Excelのバージョンによっては配列の個数に制限がでるかも。 Sub test() Dim 配列(5) As String Dim ch As Variant 配列(0) = "abc" 配列(1) = "123" 配列(2) = "def" 配列(3) = "456" 配列(4) = "ghi" 配列(5) = "789" With Application On Error Resume Next ch = .Match("ghi", 配列, 0) On Error GoTo 0 End With If Not IsError(ch) Then MsgBox 配列(ch - 1) & " は、配列の" & ch & "番目にありました" Else MsgBox "該当なし" End If End Sub こんな感じでしょうか。

AB-tetsuya
質問者

お礼

ありがとうございます。 参考にさせていただきます。

すると、全ての回答が全文表示されます。
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.2

Sub test() Dim 配列(5) As String Dim i As Integer Dim a As Variant 配列(0) = "abc" 配列(1) = 123 配列(2) = "def" 配列(3) = 456 配列(4) = "ghi" 配列(5) = 789 a = "ghi" For i = 0 To 5 If 配列(i) = a Then Exit For Next i MsgBox "配列(" & i & ")=" & a End Sub これじゃ回答になってないかな

AB-tetsuya
質問者

お礼

回答ありがとうございます。 For Next は私も考えてみました。 参考にさせていただきます。

すると、全ての回答が全文表示されます。
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1
AB-tetsuya
質問者

お礼

早速の回答ありがとうございます。 ただ、言葉が足りなくてすみません。 VBAのみで検索できたらと考えていましたが、やはりセルを使わないと できないでしょうか?

すると、全ての回答が全文表示されます。
このQ&Aのポイント
  • CanoScan LIDE400を購入したが、開封時にロックスイッチが閉まっているのに原稿台カバーが固定されておらず、仕様か不良か疑問。
  • ロックスイッチの固定・解除方法についても知りたい。
  • キヤノン製品に関する質問。
回答を見る

専門家に質問してみよう