プロが教える店舗&オフィスのセキュリティ対策術

WINXP Excel2003 VBA データベース検索について教えて下さい。

Sub データ表示()
Dim no As Long

With Sheets("データ入力")
On Error GoTo エラー処理
no = WorksheetFunction.Match( _
.[B1], [データ].Resize(, 1), 0)
On Error GoTo 0

.[B5] = [データ].Cells(no, 2)
.[D5] = [データ].Cells(no, 3)
.[E5] = [データ].Cells(no, 4)
.[F5] = [データ].Cells(no, 5)
.[B7] = [データ].Cells(no, 6)
.[C7] = [データ].Cells(no, 7)
.[D7] = [データ].Cells(no, 12)
.[B9] = [データ].Cells(no, 8)
.[B11] = [データ].Cells(no, 9)
.[B13] = [データ].Cells(no, 10)
.[D13] = [データ].Cells(no, 11)
Exit Sub

エラー処理:
MsgBox "該当するNo.のデータはありません"
.[B5:F5].ClearContents
.[B7:F7].ClearContents
.[B9:F9].ClearContents
.[B11:F11].ClearContents
.[B13:F13].ClearContents
End With
End Sub

というプログラム(EXCEL極意6VBAという参考文献の一部を利用)で、1枚のシート(”データ”という
名前のデータベース)51列ほどあります。からキー(一番右端の列をキー)の値と一致したデータを
別のシートへ呼び出す方法です。

そこで、こまっているのが、あるキーだとちゃんと呼び出してくるのに、肝心の希望のキーだと、エラーになって該当データ無となってしまうのです。

簡単にかくと

”データ”というデータベース

A列     B列      C列       D列・・・・・・・・ AY列
001    あああ     AAAA     2012/08/20   120821002 ←このAY列をキーとして検索
をかけるとエラー処理にいってしまう。

B列”あああ”だとうまくデータを検索してくる。

Vlook関数だとキーとなるデータは一番左端にないといけないということなのですが、Match関数もそうなのでしょうか?

ちなみにオートフィルターでのVBAだとうまくいくのですが、・・・

もしこのつたない文で、御理解いただき、おわかりになる方が、いらっしゃれば、ご指導ください。

もしくは、Match関数以外での検索方法でもけっこうです。

最終的に希望する結果は、D列の日付(重複する日付有)で絞り込み、AY列のキー(重複するデーターは無)でその行のデーターを別シートに表示させること

A 回答 (4件)

データの範囲を明示的に指定すれば、別の列でも検索できるようにはなります。

理由はよく判りません。
それと[データ]の範囲は拡張してますか?
例えば、キーがF列の場合、
Hit = WorksheetFunction.Match( _
.[B1], [データ].Range("F1:F99"), 0)
On Error GoTo 0

この回答への補足

たびたびありがとうございます。

昨日より、ずっと頭を抱えております。
このプログラムでB1の値と[データ]の値についてなのですが、[データ]にある値をB1にコピーしても
一致する値がないと返ってきてしまいます。

御指摘のようにしても、同様なのです。

単純なこと(例えば変数の文字列宣言しているとか。(確認済みですが))なのでしょうが
理解できません。

デバッグでB1の値と[データ]の値を見てもどう見ても同じ数字なのですが、認識しません。

[データ]の値を手打ちで直してみても同じなのですが。

おわかりになれば、御指導下さい。
宜しくお願い致します。

補足日時:2012/08/22 13:42
    • good
    • 0

#3です。



すみません。
どうも動作仕様を誤解していたようです。

検索したいのは
[データ]範囲の【51列目】
すなわち
[データ].Columns(,51)  '[データ]の51列目
なのですね。

質問文のコードは
「行と列が逆」なのではなく
「検索する列を指定できていない」でした。

no = WorksheetFunction.Match( _
.[B1], [データ].Columns(,51), 0)

として、
[データ]の【51列目】を検索するようにしてやれば通るかと。

---------

先述のとおり
[データ].Resize(, 1)  '[データ]の1列目
A列のことなので

てっきり
[データ].Resize(1)  '[データ]の1行目
を検索する場面かと思ってました。

勘違い怪答大変失礼いたしました。 <(_ _)>
「Excel2003 Match関数につい」の回答画像4
    • good
    • 0
この回答へのお礼

締め切り後にもかかわらず、わざわざありがとうございます。

ためしてみますね(*^^)v

本当にありがとうございました。

また、多分いろいろ質問すると思いますが宜しくお願い致します。<m(__)m>

お礼日時:2012/08/23 16:52

ぇっと、行と列が逆になってますけど?



-------------------------------------
 [データ].Resize(, 1)
というのは
 [データ]範囲の【 1列目 】
つまり、A列のことです。

検索したいのは
 [データ]範囲の【 1行目 】 
すなわち
 [データ].Resize(1)
なのでは?
-------------------------------------
転記部分も
 .[B5] = [データ].Cells(no, 2)
というのは
 [データ]範囲の第no【行】目の値をB5に転記する
記述になってます。

以上ご参考まで。

この回答への補足

その後、いろいろ試してみたところ、[データ].Range("AY1:AY65531"))と".Resize(1)をはずすと
うまく値をひろってきました。”AY65531はシートの最後の値65536から一番上の空白行3行とフィールド行の4行分をひいた値でうまくいきました。

いろいろありがとうございました。

これで一応解決(?)とさせていただきます。

補足日時:2012/08/23 14:03
    • good
    • 0
この回答へのお礼

ありがとうございます。本当ですね
訂正して、うまくいけば本当に単純なことだったんですね。

う~ん。でもやっぱり症状はかわらないので、MATCH関数を使わない別の方法でやってみます。

どうもありがとうございました。

お礼日時:2012/08/23 08:55

gokui6.exeのどのファイル?


AY列、これは日付?

この回答への補足

jazzcorpさんありがとうございます。
補足します。
極意の5章5です。AY列は、請求番号になります。
宜しくお願いします。

補足日時:2012/08/22 06:12
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!