アプリ版:「スタンプのみでお礼する」機能のリリースについて

表のようなデーターからオーダー列の値「23」と、記号列の値「A」を、アンドで検索して数値列の値「5384」を検索したいのですが、どんな方法があるでしょうか
現在はAutoFilterを使っていますが、処理時間が掛かり過ぎて実用的ではありません

出来るだけ処理時間が短く、シンプルなプログラムがあれば教えて頂きたいです
よろしくお願いします

「ExcelのVBAで効率的プログラムにつ」の質問画像

A 回答 (5件)

オートフィルタを使っているという事は、必ず一意に絞り込める保証があるなら、ワークシートのどこかてきとーな場所にcriteria領域を(一時的に・または恒常的に)準備してDGET関数を使った方がシンプルで高速です。


実は複数ヒットする可能性があるなら、同様にcriteria領域を仮に用意してAdvancedFilterを使ったほうが高速です。

今いったいどんなマクロで「処理が遅い」のか判りませんが、application.calculationをxlcalculationmanualにしてからオートフィルタで絞り込んでみると、改善するかも?しれません。

作成例:
application.screenupdating = false
application.calculation = xlcalculationmanual
range("A:C").autofilter field:=1, criteria1:=23
range("A:C").autofilter field:=2, criteria1:="A"
set res = range("C65536").end(xlup)
activesheet.autofiltermode = false
application.calculation = xlcalculationautomatic
application.screenupdating = true

if res.row = 1 then
 msgbox "NOT FOUND"
else
 msgbox res.value
end if
    • good
    • 0
この回答へのお礼

大変にありがとうございます
少し私のレベルを越えて難解な所も多いですが、調べて参考にさせて頂きます
出来れば「回答3の補足項目」を見て頂き、更にアドバイスして頂ける所があれば
是非お願いします

お礼日時:2012/10/08 01:17

回答4さまがおっしゃる通り、質問がまるっきり変わってますね。



まず、
> [23,A,が-2384]、[23,F,が+2384]ですが、
こうなる理屈がさっぱりわかりません。
続いて、
> 時には表Aの[23,A]の5384と[24,A]の5373が合計され、
> 表Bに[28,M]の10757と表示されている事もあります
これを判断する条件が一切不明です。
この辺りはなんらかの人的な判断が必要なのではないですか?

私の理解力が劣っているだけかもしれませんが、
人にたいして説明しきれない処理をプログラミング出来るはず無いと思いませんか?

なので、すいませんが
> そのため30回近くAutoFilterを繰り返さなければなりません。
> もっと簡単に出来る知恵があればよいのですが・・・
> どんなヒントでも構いませので宜しく願いします
この部分のヒントだけ、
30回近く処理を繰り返すように、Do~LoopまたはFor~Nextを使って書いてやればOK。
あとはご自身で調べるなり、他の回答がつくまで待つなり、質問しなおすなり、
なんとか解決の糸口をつかんでくださいませ。
    • good
    • 0

人の回答に寄せられた補足を横取りして回答するような、そんな泥棒紛いの無礼なマネはしたくありません。


それに「実は」と言いながら、元のご相談とはまるで無関係なご質問にすり替わってます。一回このご相談は解決で閉じてから、改めて本当にヤリタイ事をキチンと詳しく情報提供して投稿し直してみたらどうですか。


一応ご参考までに。
どんなデータからどんな理屈でどんな結果が欲しいのか、さっぱり不明です。
それにご利用のエクセルのバージョンも不明のご相談ですが、エクセル2007以降を使い、SUMIFS関数で計算させるのが一番簡単で手っ取り早いんじゃないかなと思います。
理解不明な時はキチンと正しい状況説明を添えて、仕切り直してご相談を投稿し直して下さい。
    • good
    • 0
この回答へのお礼

要領を掴めずわかりにくい事を書いて申し訳ありません
皆さんからアドバイス頂いた内容から自分なりにトライしてみます
いろいろ勉強になりました

お礼日時:2012/10/09 20:56

どのように「時間がかかる」んでしょう?


・行数が多すぎて、オートフィルタのレスポンスが遅い
・オートフィルタの条件を指定するのに手間がかかる(=面倒)


とりあえず、5万件のダミーデータで確認しましたが、
フィルタ処理自体は1秒未満で終わりました。
特別高性能なパソコンは使用していません。
いわゆる、ミドルスペックくらいのものです。

なので、「時間が・・」は後者と断定して進めさせていただきます。
(異論がございましたら、補足くださいませ。)

準備として、
・A2セルに"オーダー"の検索値(今回は「23」)
・B2セルに"記号"の検索値(今回は「A」)
・4行目に項目名("オーダー"・"記号"・"数値"などの文字列)の行
・5行目以降にデータ行
をご用意ください。

で、コードは以下。

Sub Macro1()
  With Range("A4:C" & Range("A65535").End(xlUp).Row)
    .AutoFilter
    .AutoFilter Field:=1, Criteria1:=Range("A2")
    .AutoFilter Field:=2, Criteria1:=Range("B2")
  End With
End Sub

あとはボタンにでも登録しておいて、
A2・B2セルを打ち変えてお試しくださいませ。

「列がもっとある」なら、コード中の"A4:C"の「C」を適宜、
項目行を4行目以外にするなら、"A4:C"の「4」を適宜、
それぞれ打ち変えてくださいませ。

この回答への補足

大変ありがとうございます、実は下記のような表A,Bの[オーダー列][記号列]のどこか1個所または数か所が違う表を比較・検索し数値の増減を調べています。そのため表Bの項目を上から順に変数に代入、表Aを順にAutoFilterし、Filterされた合計値が表Bの数値と同じかどうか比較しています
そのため30回近くAutoFilterを繰り返さなければなりません。もっと簡単に出来る知恵があればよいのですが・・・どんなヒントでも構いませので宜しく願いします
表A            表B
オーダー 記号 数値     オーダー 記号 数値
21 A 5367     21 A 5367
25 B 5380     25 B 5380
25 E 5369     25 E 5369
22 D 5370     22 D 5370
21 C 5371     21 C 5371
23 A 5384     23 F 5384
24 A 5373     24 A 5373

因みにこの表で導き出したい答えは、[23,A,が-2384]、[23,F,が+2384]ですが、時には表Aの[23,A]の5384と[24,A]の5373が合計され、表Bに[28,M]の10757と表示されている事もあります

補足日時:2012/10/08 01:10
    • good
    • 0

ご回答します。



VBAと記載していますが、関数で十分可能です。

1.表の左側欄外に、オーダーと記号を連結した列を作成する
2.VLOOKUP関数を利用して、検索する。
=VLOOKUP("23A",a2..D100,4,false)

上記の関数のパラメータは多少誤りがあるかもしれません。
ヘルプとかで研究してみてください。

よろしくお願いします。

この回答への補足

ありがとうございます
私の理解が浅いのか、どうやってオーダーと記号を連結した文字列で、VLOOKUPをかけるのでしょうか
エラーになるように思うのですが、
何か方法があるのであれば、宜しくお願いします

また、それは検索項目が複数ある場合にも活用出来るでしょうか

補足日時:2012/10/08 01:23
    • good
    • 0

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