こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

エクセル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")に書くコードが既に書いてあります。このセルから取り出すことも可能です。よろしくお願いします。

投稿日時 - 2003-12-16 10:49:36

QNo.731422

困ってます

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

よく伝わってなかったようですが。
もしどうしてもシート上の表示を
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が初めて条件成立したセルですのでそこの列数をとります。

投稿日時 - 2003-12-16 15:49:42

補足

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ブロック変数が設定されていません。といわれました。

お手数ですが、宜しくお願い致します。

投稿日時 - 2003-12-19 10:57:06

ANo.1

たて列の検索は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

投稿日時 - 2003-12-16 11:48:34

補足

説明が足りませんでした。
1~3_4~6_7~10_11~20_21~30については、検索値が1~3の間ならD列を4~6の間ならE列を・・・というようにしたいので、予めCaseなどで値に対応する列を登録しておく必要があるのかなぁ・・・とも思っています。
また、この値は、1000まであり、1列づつ値にしてしまうと1000列書かないといけなくなります。後のメンテの大変なので・・・
できたら、検索値がxなら何列をみて!と指示を出したいと思っているのですが、あまりVBAも詳しい方では無いのでこのあたりで苦戦をしております。

投稿日時 - 2003-12-16 14:03:54

あなたにオススメの質問