- 締切済み
エクセルVBAでデータ検索(Win2000,Excel2000)
エクセルで毎日の業務で手計算している作業をVBAコードかいて試しているのですが、縦と横の検索で行き詰まってしまい質問しました。どうぞよろしくお願いします。 _A__B____C____D__E__F___G___H 1| 2|_______その他_1~3_4~6_7~10_11~20_21~30 3| 3|__項目A___ 0___50__49__46___43__40 4|__項目B___ 0___45__44__39___37__34 5|__項目C___ 0___43__42__34___30__ 28 行 *このデータは現在(B3:V42)にあり今後増える可能性あり *1行目とA列は空白です。 *2行目とB列は対応する項目です。 *3行目は関係ない値が入っています(データをつくる為の値) このようなデータが、"Sheet2"にあると仮定します "Sheet1"のシート上に配置したComboBox(コントロールツールボックスの)に検索値があります。 (ComboBox1 → 数値 , ComboBox2 → 数値 , ComboBox3 → 文字)*リストは"Sheet1"に登録してあります。 TextBox1 ÷ 2 の結果を小数点以下切上げし、これにTextBox2の値をかけたもの(仮にAAAとする)が、2列目のそれぞれのセルの数値範囲に対応し、TextBox3の文字列がB列に対応し、両検索結果の交わったセルの値を返すようにしたい。 例)もしAAAが「8」なら「F列」をみる。TextBox3 の文字列が「項目B」なら「4行目」をみる。この結果、交わったセルは「F4」なので、「F4」にある値「39」を"Sheet1"."A1"に返す。 また、これらコンボボックス(このシートとは別にテキストボックスを使うこともある)にはひとつずつchangeイベントでいきなり別シート("Sheet3")に書くコードが既に書いてあります。このセルから取り出すことも可能です。よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- popesyu
- ベストアンサー率36% (1782/4883)
よく伝わってなかったようですが。 もしどうしてもシート上の表示を 2|__その他_1~3_4~6_7~10_11~20_21~30 としたいのであれば、 C列の最大値は3、D列の最大値は6とわざわざ抜き出すコードを追加しなければならないので、最初から最大値の3、6、10...だけの表示にしておけばという意味なんですよ。この表の横軸って連続値なんですよね?? ※例えば1~5、8~10(6,7が無い)ではないですよね? であれば最大値だけの表示でも意味は通じますし。わざわざコード上で列を登録しなくても表の値がそのまま利用できますし。 ということで 下記見本コードですと 2|__その他____3_6_10_20_30.... と書いておくことで 例えば「25」というような値が検索値であれば30の値が入っているセルの列数を引いてくるんですが。 正確に書くなら「最初に対象値>=検索値になった列数」です。この場合は30>=25が初めて条件成立したセルですのでそこの列数をとります。
- popesyu
- ベストアンサー率36% (1782/4883)
たて列の検索はFind関数ですぐに出てくるでしょう たて = ActiveSheet.Columns(1).Find(TextBox3).Row 横は・・・1~3_4~6_7~10_11~20_21~30 と表示するなら文字列になってしまうので、 そこから比較対象の値を無理やり抜き出しても良いのですが、 3_6_10_20_30 のように数字で表示した方が楽で良いかなと。 後はその範囲でループさせて一つ一つ値をチェックしていくとか。 For Each c In ActiveSheet.Range("C2:H2") If c.Value >= AAA Then よこ = c.Column Exit For End If Next c
補足
説明が足りませんでした。 1~3_4~6_7~10_11~20_21~30については、検索値が1~3の間ならD列を4~6の間ならE列を・・・というようにしたいので、予めCaseなどで値に対応する列を登録しておく必要があるのかなぁ・・・とも思っています。 また、この値は、1000まであり、1列づつ値にしてしまうと1000列書かないといけなくなります。後のメンテの大変なので・・・ できたら、検索値がxなら何列をみて!と指示を出したいと思っているのですが、あまりVBAも詳しい方では無いのでこのあたりで苦戦をしております。
補足
popesyuさん!ありがとうございます。理解しました。2|__その他____3_6_10_20_30.... としました。 で、早速試してみました。 1)TextBoxにコードを書いた為、TextBoxに入力中に実行されてしまいます。これは、とりあえずボタンを作ってこれで実行させました。できたら、最後のBoxが入力された時点で実行させたいです。 2)実行した結果、どの値を入れても「その他」を返してきます。その他を「0」にしたらその該当するセルの列数ではなく、該当するセルの値が返ってきました。(AAAが15なら20) 現在このように書いてます。 Private Sub CommandButton1_Click() Worksheets("Sheet2").Activate AAA = TextBox1 / 2 MsgBox AAA For Each c In ActiveSheet.Range("C2:V2") If c.Value >= AAA Then よこ = c.Column Exit For End If Next c MsgBox c Worksheets("Sheet1").Activate End Sub 3)実際には、Sheet1でいろんな項目を書き込んでいくのでActivateSheetではなく動いてほしいのですが・・・これはしょうがないですよね。 4)たて = ActiveSheet.Columns(1).Find(TextBox3).Row はすみません!理解できませんでした。 とりあえず書いてみたんですが、実行時エラー'91':オブジェクト変数またはWithブロック変数が設定されていません。といわれました。 お手数ですが、宜しくお願い致します。