- ベストアンサー
Excel VBAで検索(Win2000 Excel2000)
現在、下記のようなコードを書いています。データテーブルの縦と横の検索値を探してその列数と行数を返したいのですが、下記の Sub検索1 と Sub検索2 を1つのSubで実行させるにはどうしたらよいのでしょうか?よろしくお願い致します。 ----------------------------------------- Sub 検索1() Worksheets("Data").Activate Dim x As Integer For x = 3 To 22 If Cells(2, x).Value >= 12 Then MsgBox x Exit Sub End If Next MsgBox "見つかりません" End Sub --------------------------------------------- Sub 検索2() Worksheets("Data").Activate Dim i As Integer For i = 4 To 42 If Cells(i, 2).Value = "A" Then MsgBox i Exit Sub End If Next MsgBox "見つかりません" End Sub
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
Worksheets("Data").Activate Dim x As Integer Dim y as Integer For x = 3 To 22 If Cells(2, x).Value >= 12 Then MsgBox x For y = 4 To 42 If Cells(y, 2).Value = "A" Then MsgBox y Exit Sub End If Next End If Next MsgBox "見つかりません" End Sub これだと、縦位置2の行で、まず横方向で12を探し見つかったら、その位置をメッセージ表示します。 で、横位置2の列を、縦方向に検索し見つかったら、メッセージ表示をし、関数を抜けます。見つからなければ”見つかりません”のメッセージを表示します。 こんな所で如何でしょう?
その他の回答 (4)
- ki-aaa
- ベストアンサー率49% (105/213)
>Sub Test()で2つのSubを実行させるということですね・・・ その通りなのですが、私のコードの目的は、Sub検索1 と Sub検索2 で、xとiにセットした数値を使って、Sub Test()で他の処理をできる(今はMsgBox ("x= " & x) MsgBox ("i= " & i) が書いてある)ということを示したかったのです。
お礼
ki-aaaさん!ありがとうございます。 私の勉強不足のようですね・・・勉強になりました。
- PAPA0427
- ベストアンサー率22% (559/2488)
あっは(^^; コーディング間違ってましたね。ごめんなさい。 Worksheets("Data").Activate Dim x As Integer Dim y as Integer For y = 4 To 42 For x = 3 To 22 If Cells(y, x).Value >= 12 Then MsgBox x Exit Sub End If If Cells(y, x).Value = "A" Then MsgBox y Exit Sub End If Next Next MsgBox "見つかりません" End Sub で大丈夫です。
補足
PAPA0427さん!回答有難うございます。 ただ、すまみせん。私の説明が悪かったようです。実はデータテーブルの横に対応する検索値Aと縦の項目に対応する検索値Bがありまして(._.;) 最初に書いておくべきでしたね。 まずSub検索1は、データテーブルのC2からV2までの横の項目と検索値A(ここでは"12"です)を照合させてます。その結果、その列数をとってきてます。 次にSub検索2で、データテーブルのB4からB42までの縦の項目と検索値B(ここでは"A"です)を照合させています。その結果、その行数をとってきてます。 まだ書いていないのですが、この後、Sub検索1とSub検索2で得た行と列のセルの値をもってこようと考えています。 度々申し訳ございません。宜しくお願い致します。
- ki-aaa
- ベストアンサー率49% (105/213)
>Sub検索1 と Sub検索2 を1つのSubで実行させるには ここの所が良くわからないのですが、こうしたらどうでしょうか。 Option Explicit Dim x As Integer Dim i As Integer Sub test() Call 検索1 Call 検索2 MsgBox ("x= " & x) MsgBox ("i= " & i) End Sub Sub 検索1() Worksheets("Sheet1").Activate For x = 3 To 22 If Cells(2, x).Value >= 12 Then Exit Sub End If Next MsgBox "見つかりません" End Sub Sub 検索2() Worksheets("Sheet1").Activate For i = 4 To 42 If Cells(i, 2).Value = "A" Then Exit Sub End If Next MsgBox "見つかりません" End Sub
補足
ki-aaaさん!早速ありがとうございます。 説明不足ですみませんでした。 Sub Test()で2つのSubを実行させるということですね・・・これでも構いませんが、試してみたら、見つからなかった場合、MsgBox"見つかりません"の後に最終行又は列の次の値を返してきます。なぜでしょう?
- PAPA0427
- ベストアンサー率22% (559/2488)
両方まとめれば出来ますよ。 Worksheets("Data").Activate Dim x As Integer Dim y as Integer For y = 4 To 42 For x = 3 To 22 If Cells(y, x).Value >= 12 Then MsgBox x Exit Sub End If If Cells(i, 2).Value = "A" Then MsgBox i Exit Sub End If Next Next MsgBox "見つかりません" End Sub もしくは、 Sub 検索 If 検索1 = False then if 検索2 = False then Exit Sub End If End If End Sub Function 検索1() As Blooean 検索1 = False Worksheets("Data").Activate Dim x As Integer For x = 3 To 22 If Cells(2, x).Value >= 12 Then MsgBox x 検索1 = True Exit Function End If Next MsgBox "見つかりません" End Function --------------------------------------------- Function 検索2() As Blooean 検索2 = False Worksheets("Data").Activate Dim i As Integer For i = 4 To 42 If Cells(i, 2).Value = "A" Then MsgBox i 検索2 = True Exit Function End If Next MsgBox "見つかりません" End Function でしょうかね。
補足
PAPA0427さん!さっそくありがとうございます。 すみません!エラーになりました。 デバックしたら「If Cells(i, 2).Value = "A" Then」にマーカーがついて、アプリケーション定義またはオブジェクト定義のエラーになります。 よろしくお願いします。
お礼
PAPA0472さん!ありがとうございます。 OKです。とりあえずうまくいきましたので、あとで構文の内容を勉強してみます。助かりました。