[[20140602180803]] 『最小値、順位の抽出』(MECO) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『最小値、順位の抽出』(MECO)

お世話になります。
問)
T列〜AE列にデータがあり、P列〜S列に下記の計算要領の結果を表示するのをVBAで。

 行/列	P	Q	R	S	T	U	AC	AE
 1	R-西	R-東	min-西	min-東	コードNo	項目名	東	西
 2	11	8	37.1	35.7	XX...01	アアア	0	0
 3	-	-	-	-	XX...01	コードNo	東	西
 4	-	-	-	-	XX...01	XX..16	38.4	37.1
 5	-	-	-	-	XX...01	XX..11	35.7	39.8
 6	8	11	36.7	36.9	XX...02	イイイ	0	0
 7	-	-	-	-	XX...02	XX..10	37.7	37.2
 8	-	-	-	-	XX...02	XX..06	36.9	36.7
 9	6	12	36.3	37.8	XX...03	ウウウ	0	0
 10	-	-	-	-	XX...03	XX..04	37.8	36.3
 11	-	-	-	-	XX...03	XX..12	40.5	40.2
 12	2	3	35.0	34.9	XX...04	エエエ	0	0
 13	-	-	-	-	XX...04	XX..08	34.9	35.2
 14	-	-	-	-	XX...04	XX..03	38.1	35.0
 15	-	-	-	-	XX...04	XX..05	35.5	37.2
 16	7	13	36.5	40.1	XX...05	オオオ	0	0
 17	-	-	-	-	XX...05	XX..12	40.1	36.5
 18	1	4	34.2	35.0	XX...06	カカカ	0	0
 19	-	-	-	-	XX...06	XX..08	36.2	34.2
 20	-	-	-	-	XX...06	XX..05	35.0	35.4
 21	-	-	-	-	XX...06	XX..11	36.1	34.6
 22	-	-	-	-	XX...06	XX..07	0	0
 23	-	-	-	-	XX...06	XX..08	35.7	35.6

データ説明)
・T列:コードNo(20桁の英数字)
 ※作業列であり、U列の項目名より関数式により別表より取得したもの
・U列:項目名+コードNo(20桁の英数字)
 ※T列のコードNoとは異なる
・V列〜AB,AD列:(省略)
・AC,AE列:数値データ(「0」および一部に文字列を含む)
計算要領)
S列
 U列の項目名毎にコードNo行の「AC列」の最小値を項目名がある行に表示する
R列
 U列の項目名毎にコードNo行の「AE列」の最小値を項目名がある行に表示する
Q列
 グループ毎(注記)の「S列」の小さい順位(同値は同順位で以降繰下げ)
P列
 グループ毎(注記)の「R列」の小さい順位(同値は同順位で以降繰下げ)
(注記)
・非該当には「-」表示する
・「グループ」:T列のコードNoの「左から18桁」を抜出したもの
・AC,AE列データは、最初の項目名以外は「項目名」→「コードNo」の繰返し
・データは多くて4000行程度まで

補足)
現状は関数式で処理を行っていますが、エクセルの処理速度が遅いです。
その為、VBAで何とかならないかと考えての質問になります。
ただ、当方VBAは“超”初心者ですので、そこのところはご容赦ください。
※処々の現象から処理速度の遅い原因がこの処理にあると推定しましたが、
 “的外れ”になる可能性がゼロではないことをご了解願います

時間がとれずにレスポンスが遅れがちになるかも知れませんが、
よろしくお願いします。

訂正(19:47)
コードNoの桁数を「20桁」に、グループの抜取りを「18桁」に
訂正させていただきました。

(MEKO)
< 使用 Excel:Excel2010、使用 OS:Windows7 >


 マクロで処理と一言で言っても、いろいろな運用があります。

 計算式のように値を変更したら即座に結果を反映したいのか、入力を一通り行った後に
 一括処理したいのか。

 前者であればマクロであっても、都度処理の時間がかかるので思ったように改善しない
 可能性もありますし、後者であれば計算を手動に変えておいて、更新したいときだけ
 F9 で計算させるという運用も代替にならないかは検討の余地があると思います。

 まずはそのあたり、どういう運用を考えたいのかを明確にしてはと思います。
 後は現在使用している数式を提示すれば、数式を改善するという選択肢も出てくる
 気がします。
(Mook) 2014/06/02(月) 20:27

 どの様な処理をしたいのか説明だけでは不明です 
 R列、T列、U列 の式を提示下さい(式を見ることによってある程度やりたいことが想像できます)

 T列の 2行目から5行目まで コードNo XX...01 、6行目から8行目まで コードNo XX...02、
 というように同一コードが固まっているのですか?、同一コードが飛び飛びになっていることはないのですか?
 また、同一コードは最大何行程度ありますか?

 >・U列:項目名+コードNo(20桁の英数字) 
 提示された表では、そのように見えませんが 実際はどの様になっていますか?
 U列:項目名 または コードNo が入力されているということでいいですか?

 >S列 
 > U列の項目名毎にコードNo行の「AC列」の最小値を項目名がある行に表示する 
 項目名は、T列の同一コードの先頭行にあるようですが、先頭行にあるということでいいですか?
 先頭行でない場合 項目名 と コードNo の区別はどの様にできますか?

 AC列、AE列の値の最大値はいくらぐらいですか?

( By) 2014/06/02(月) 20:44


 現在どんな式を使っておられるのかわからないですが

 T列(か、どこか作業列)に左から10桁を抜き出した状態で表示させ
 ↓な感じの式にしてみるとどうですか?
 R2=IF(S2="-",S2,SMALL(OFFSET(AE2,,,COUNTIF($T:$T,$T2)),COUNTIF(OFFSET(AE2,,,COUNTIF($T:$T,$T2)),0)+1))
 S2=IF(T1=T2,"-",SMALL(OFFSET(AC2,,,COUNTIF($T:$T,$T2)),COUNTIF(OFFSET(AC2,,,COUNTIF($T:$T,$T2)),0)+1))
  
(HANA) 2014/06/02(月) 23:21

みな様、早々にありがとうございます。
説明不足すみません..今実データで確認する環境にないため、
できる範囲で補足させていただきます。

−運用のしかた−
・T列以降のデータは他ブックAからリンク貼付けしています
 (元々は同ブックであったのを、処理速度が遅いこのシートのみ分離)
・本ブックへの新たな入力操作はなく、データ処理のみ行います
・今回の質問対象列以外に10列ほど関数式で処理しています
 (今回の質問対象列の結果も参照します)
・他ブックAを開いた後に本ブックを開き、計算結果をフィルタ操作して
 他ブックへコピペ作業をします
以上から、即座に結果を反映する必要はなく、本ブックを開いてからの
操作でOKです。
手動計算については、やり方を調べて確認するようにします。

−コードNoについて−
・例示では20桁を省略して書いています
・日付や場所などの属性が付いた「ゼッケン」のようなものです
・T列は今回のゼッケン、U列のは“過去の”ゼッケンになります
・1項目名に1コード(ゼッケン)が付きます
 ※T列は関数式での便宜上、同一項目名該当行にコードを表示しています
 ※よって、同一コードの先頭行にはU列の項目名があります
・T列の同一コードは固まっていますが、U列には同一コードはない(筈です ^^;)
・同一コードは最大10行までを想定しています
・U列は“過去”を表示しているので、項目名とコードNoのみになります

尚、AC列、AE列の最大値は「99」までを想定しています。
使用している関数式や(HANA)さんのご提案式は、別途確認させていただきます。

レスポンス悪くてすみませんが、よろしくお願いします。
(MECO) 2014/06/03(火) 13:04


 >・データは多くて4000行程度まで
 >・同一コードは最大10行までを想定しています

 こんなことでもいいかな

 R2=IF(T2=T1,"-",MIN(IF(T2:T11=T2,IF(AE2:AE11>0,AE2:AE11,""),"")))
 S2=IF(T2=T1,"-",MIN(IF(T2:T11=T2,IF(AC2:AC11>0,AC2:AC11,""),"")))
 ともに配列数式です

 2列4000行程度ということで・・・

 >現状は関数式で処理を行っていますが、エクセルの処理速度が遅いです
 現状使用の式が不明ですが、他に問題がありそうですね
( By) 2014/06/03(火) 14:33

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.