• 締切済み

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

  • VBA:配列の中で文字列が何番目にあるか知りたい

    たとえば Hairetu = Array("ABC","DEF","GHI") としておいて配列から"DEF"が何番目にあるのかを検索する方法はないのでしょうか? よろしくお願いします。

  • QUERY_STRINGを連想配列に入れたい

    よろしくお願いします。 $_SERVER['QUERY_STRING']の値 q1=abc&q2=def&q3=ghi を連想配列に入れたいと思います。 $array = array("q1"=>"abc","q2"=>"def","q3"=>"ghi"); どのようにしたらQUERY_STRINGの値を連想配列に入れられますか?

    • ベストアンサー
    • PHP
  • 二次元配列の分割

    よろしくお願いします。 $hoge = array( "one" => array("abc" => "100", "def" => "200", "ghi" => "300"), "two" => array("abc" => "110", "def" => "210", "ghi" => "310"), "three" => array("abc" => "120", "def" => "220", "ghi" => "320") "four" => array("abc" => "130", "def" => "230", "ghi" => "330") ); というような配列があったとき、 abcが110以下のときと、110より大きい場合で分割した配列を 用意したいと考えてます。 具体的には、 $hoge1 = array( "one" => array("abc" => "100", "def" => "200", "ghi" => "300"), "two" => array("abc" => "110", "def" => "210", "ghi" => "310"), ); と $hoge2 = array( "three" => array("abc" => "120", "def" => "220", "ghi" => "320") "four" => array("abc" => "130", "def" => "230", "ghi" => "330") ); に分割したいと考えています。 どのように記述すればよいのでしょうか?

    • ベストアンサー
    • PHP
  • PHP 配列について

    PHPで簡単なプログラムを作っています。 上手い方法があれば教えてください。 例えば $arr = array(); $arr(0) = "ABC"; $arr(1) = "DEF"; $arr(2) = "GHI"; $arr(3) = "JKL"; $arr(4) = "MNO"; この様な配列があり、これを以下の様に「特定のデータを削除し空いているキーを詰めたい」場合どうしたら良いのでしょうか? この場合は"DEF"を削除。 $arr(0) = "ABC"; $arr(1) = "GHI"; $arr(2) = "JKL"; $arr(3) = "MNO"; アドバイスお願いします。

    • ベストアンサー
    • PHP
  • 文字列を配列にしたい

    お世話になります。 PHP4.3.9を利用しているのですが、以下のような文字列を分割して、求める形の配列に入れたいのですが、何か良い方法はありますでしょうか? ■文字列 abc=123&def=456&ghi=789 ■このような形にしたいと思っています↓ $hoge = array(   "abc"=>"123",   "def"=>"456",   "ghi"=>"789" ) ヒントだけでも結構ですので、ご教示いただけると幸いです。宜しくお願いします。

    • ベストアンサー
    • PHP
  • MAPの配列・・・???!!!

    Mapというものを使うのが初めてなのですが、 よくわからなくなってしまいました。 他のプログラムから、 「MAPの配列で返ってくる」 のですが、このMAPの配列をintひとつ、ストリング2つから 作ろうとしているのですが、できずに困っています。 map[0]=("abc","ABC") map[1]=("def","DEF") map[2]=("ghi","GHI") ・ ・ みたいなイメージなのですが、エラーになります・・・ Map[] hairetu = new HashMap(); これでコンパイルできません。 HelloWorldMap.java:17: 互換性のない型 出現: java.util.HashMap 要求: java.util.Map[] Map[] hairetu = new HashMap(); Map[] hairetu; という宣言だけならできます。 受け渡し先でMapの配列を要求しているのでこのような形が必要なのですが・・・ ちなみにソースを見ると hairetu[i].get(キー) みたいなとり方をしています。

    • ベストアンサー
    • Java
  • EXCELVBA 配列値集計方法

    こんにちは、 配列の集計方法に関してお聞きしたいのですが、 配列1がありますて、 配列1(1,1)、配列1(1,2)の値をもとに (配列1(1,1)が重複しており、かつ 配列1(1,2)も重複している場合) 重複しているものがあれば 配列1(1,3)の値を合算したものを求め 配列2に格納するようにしたいのですが、 うまくロジックが組めません。 よい方法なあるでしょうか。 配列1内データ----------------- 配列1(1,1)=abc 配列1(1,2)=test1 配列1(1,3)=15 配列1(2,1)=def 配列1(2,2)=test1 配列1(2,3)=50 配列1(3,1)=abc 配列1(3,2)=test1 配列1(3,3)=111 配列1(4,1)=ghi 配列1(4,2)=test2 配列1(4,3)=80 配列1の値を集計後----------- 配列2(1,1)=abc 配列2(1,2)=test1 配列2(1,3)=116 配列2(2,1)=def 配列2(2,2)=test1 配列2(2,3)=50 配列2(3,1)=ghi 配列2(3,2)=test2 配列2(3,3)=80

  • 配列のつなげ方

    配列をつなげて文字列にしたいと思っています。 Dim abc() As String Dim i As String Dim namae As String i=0 ここでDBに接続してループでまわしながらデータを取得してきます。 Do while y > z abc(i) = X i = i+1 loop Xはループがまわる毎に違う値がセットされます。例えば1回目のループでリンゴ、2回目のループでミカンといった具合にです。 つまり、abc(0)=リンゴ、abc(1)=ミカン、abc(2)=メロン といった具合にです。 最終的には namae="リンゴ、ミカン、メロン、・・・・"といった具合にnamaeに代入したいと思っています。namae = abc(0) & "," & abc(1) & ","....と やれば実現できるのはわかります。 Xにはデータがいくつはいっているかわかりません。どうやった式をたてれば、実現できるでしょうか?

  • VB2005 配列から要素を検索する方法

    VB2005入門者です。 配列の中要素を検索し、一致すれば処理を行うというプログラムを組みたいのですがうまくいきません。 1列目hoge_nameと2列目hoge_noが既に配列に代入してあり 0列目 POINT と1列目hoge_name[AやB]と2列目hoge_no[A00~A03]が一致した場合、3列目のhoge_id(0)からhoge_id(17)に格納したいのです。 hoge.txtは BEBE,A,A00  ,ABC POINT,A,A00  ,ABC POINT,A,A01 ,DEF POINT,B,A02 ,ABC ETC,A,A03   ,GHI POINT,B,A03  ,GHI POINT,A,A03  ,GHI といった感じで、スペースが不特定数混じったカンマ区切りテキストです。 以下で実行すると6行目の3列目でA04を探してしまい、6行目の情報をとってくれません。 hoge_no配列に含まれる文字列から検索し、一致した場合に処理できれば解決するのでは、と思いましたが。Allay.indexOfを試したりしましたがうまくいきませんでした。アドバイス頂きたいのでどなたかよろしくお願いします。 Dim reader1 As New System.IO.StreamReader(geo_name, System.Text.Encoding.Default) Dim i As Long = 0 Dim j As Long Dim answer() As String ReDim answer(0 To 0) Do Until reader1.EndOfStream line = reader1.ReadLine() If (line.Contains("POINT")) Then field = line.Split(",") answer(i) = Trim(field(1)) + "," + (field(2).Trim) + "," + (field(7)) If (field(1).Trim = hoge_name(i) = True And field(2).Trim = hoge_no(i)) = True Then hoge_id(i) = field(7) i = i + 1 ReDim Preserve answer(0 To i) ReDim Preserve hoge_id(0 To i) End If End If Loop For j = 0 To UBound(answer, 1) - 1 reader.Close() Next

  • C言語のポインタと配列

    どうにも理解しようとしていますが全体像が理解できないので、わかっていることわからないことまとめていくのでバンバン指摘してくださるとうれしいです。 1.配列の宣言には int a[]; a[] = {1,2,3}ですが、コンピュータは{"1","2","3"}の部分の数を数えて[]に代入しているので、 int [][3] = {{1,2,3},{4,5,6}}のような配列を作ったとき[][3]の部分の左側の数字も勝手に代入している。 この時なぜ3が勝手に代入されないかがわからない 2.数字とメモリ int s = {1,2,3}をメモリ的に表現すると、123の順に並んでいる。s[1]=2 int s[][2] = {{1,2,3},{4,5,6}}をメモリ的に表現すると123456に並んでいる。s[1][1]= 5 ここまで文字列以外の配列は添え字だけで管理されている。 3.文字列とポインタ char s[] = "abc"とするとメモリ的にはabc\0であり、[]には4が代入され、s[1]はb自身を指す。 char *s = "abc"をメモリで表すとabc\0であり、\0が来るまでを文字列と認識する。 sは&s[0]とも表現できるように、最初のアドレスを指し示している。 char *s[]= {"abc","def"}をメモリ的に表現するとabc\0def\0であり、[]には2がコンピュータにより判断されて代入される。\0までを文字列として表現しようとする。s [1] は"def"の最初のアドレスを指し示すが、s[1][1]とするとe自身を指すようになる。この時、s[1] = &s[1][0]と表現することは可能であると考えられる。 文字列を直接さす場合でも、ポインタで表現する場合でも、\0が要素の最後に来るのでしょうか? また、{{"abc","def"},{"ghi","jkl"}}を文字列で直接表す場合は char s[2][2] = {{"abc","def"},{"ghi","jkl"}}; となるかと思いますが char *s[2][2] = {{"abc","def"},{"ghi","jkl"}}; とするとs[1][1]でghiの最初のアドレスを、s[1][1][0]でg自身を表せるようになるのでしょうか?

専門家に質問してみよう