Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Excel 2013)
下限<=セルの値<=上限 のチェックと書き込み
投稿日時: 17/09/12 17:48:39
投稿者: olive23804

いつもお世話になっております。
こんな形で、データが 86,400行 × 10列 入っています。
変数で、上限、下限があり、それらの値に外れていると値を削除したいと考えています。
1つ1つのセルに対して、下限<=セルの値<=上限 であるかのチェックを行う以外に、何か良い方法があるのでしょうか?
ご教授の程よろしくお願い致します。
 
時間    1列    2列    ...    10列
2017/09/12 00:00:00    4    8    ...    9
2017/09/12 00:00:01    5    8    ...    11
2017/09/12 00:00:02    6    7    ...    2
2017/09/12 00:00:03    1    10    ...    3
2017/09/12 00:00:04    3    4    ...    6
2017/09/12 00:00:05    8    7    ...    3
・    ・    ・    ...    ・
・    ・    ・    ...    ・
・    ・    ・    ...    ・
2017/09/13 00:00:00    9    5    ...    7

回答
投稿日時: 17/09/12 18:48:58
投稿者: Suzu

olive23804 さんの引用:
変数で、上限、下限があり、それらの値に外れていると値を削除したいと考えています。
1つ1つのセルに対して、下限<=セルの値<=上限 であるかのチェックを行う以外に

 
一つ一つのセル と言うのが純粋に 86,400行 × 10列 の各セル を指しているのでしょうか。
それとも、列に対し 単一なのでしょうか。
 
列に対し単一なのであれば、オートフィルターで事足りそうですけど。

回答
投稿日時: 17/09/12 19:23:48
投稿者: sy

質問の目的は何ですか?
 
セルの数が多いからご自身で考えたコードでは遅いので早く処理をしたいとか?
それとも単にループで1つづつ判定する事以外の書き方の勉強とかですか?
もしくは記述する行数を減らしたい?(あまり意味ないと思うけど)
 
良い方法と言われても、何が目的かで良い悪いが決まります。
例えばセルの数が膨大なので早く処理するのが目的とかなら、記述的に1行で記述出来たとしても遅ければ悪いコードと言う事になりますよね。
逆にループで1つづつ判定しても早ければ良いコードと言う事になりますよね。
ですが質問の説明文とは外れてしまいます。
上記のような例のパターンがあったとしたら、何かおかしいですよね。
 
回答者に対して手法などで制限をかけたら、もしかしたら物凄く素晴らしい回答が出てきていたかも知れない可能性を逃してしまうかも知れませんよ。
 
回答者も有効な回答を考えるにしても、目的だけ提示して頂いて、やり方などは自由な方が考えやすいです。
 
1つづつループで見ない方法なら数式の一括代入とかでしょうか。

投稿日時: 17/09/13 09:46:54
投稿者: olive23804

Suzuさん、syさん
コメントありがとうございます。
 
最終的な目的を書きます。
86,400行 × 10列のデータは、指定のExcelファイルに書き出されます。
 
そこにボタンを1つ追加し、次のようなことをしたいと考えています。
とりあえず、代表的な例として2行分のみを記述します。
 
<実データ>
2017/09/12 00:00:00    1    9    5    4    5    10    1    8    3    1
2017/09/12 00:00:01    1    2    1    10    9    2    10    9    2    2
 
<加工データ>
下限=3、上限=8(可変です。シートで設定可能です。)
2017/09/12 00:00:00    0    0    5    4    5    0    0    8    0    0
2017/09/12 00:00:01    0    0    0    0    0    0    0    0    0    0
 
加工データは別シートに書き出しますが、2017/09/12 00:00:01 は上下限内のデータが1つも無いので、この行は加工データ用シートには書きません。
 
これを1つ1つのセルに対し、For文で回して上下限の値をチェックし加工データ用のシートに書き出すことは私にも組めますが、時間が掛かります。
また、こういう方法が一般的なのか(もっと何か良い方法があるのか)知りたく質問致しました。
 
最終的には、加工データ用シートのデータでヒストグラムを表示します。
ヒストグラムに関しては、マクロにするかどうするか思案中です。
とりあえず、ヒストグラムを作成するうえで必要なデータの抽出を今回は目的としています。
 
以上、よろしくお願い致します。
 

回答
投稿日時: 17/09/13 10:27:29
投稿者: Suzu

olive23804 さんの引用:

<実データ>
2017/09/12 00:00:00    1    9    5    4    5    10    1    8    3    1
2017/09/12 00:00:01    1    2    1    10    9    2    10    9    2    2
 
<加工データ>
下限=3、上限=8(可変です。シートで設定可能です。)
2017/09/12 00:00:00    0    0    5    4    5    0    0    8    0    0
2017/09/12 00:00:01    0    0    0    0    0    0    0    0    0    0
 
加工データは別シートに書き出しますが、2017/09/12 00:00:01 は上下限内のデータが1つも無いので、この行は加工データ用シートには書きません。

 
COUNTIS関数で良いのでは?
 
判定するセルがB列からK列とし、2行目の判定。
=COUNTIFS(B2:K2,">=3",B2:K2,"<=8")

回答
投稿日時: 17/09/13 21:55:38
投稿者: sy

目的は上下限値から外れた値を0にして、1〜10列目全てが0の行を省いて、別シートに転記したいと言う事ですね。
 
初めの上下限値から外れた値を0にする部分ですけど、提示して頂いた以下の2行のデータを84600行分コピーして

<実データ> 
2017/09/12 00:00:00    1    9    5    4    5    10    1    8    3    1 
2017/09/12 00:00:01    1    2    1    10    9    2    10    9    2    2 

以下の形にするのに
<加工データ> 
下限=3、上限=8(可変です。シートで設定可能です。) 
2017/09/12 00:00:00    0    0    5    4    5    0    0    8    0    0 
2017/09/12 00:00:01    0    0    0    0    0    0    0    0    0    0 

ループで、10列84600行全てに実行しても4秒くらいしかかかりませんでしたけど、それより短くしたいと言う事ですか?
フィルターオプションで予め全て0になる行を省いて、転記してから加工すればもっと短くなりますよね。
 
私の感覚ではループでも充分早いと思うのですが、どの程度の速さを求めてらっしゃるんですか?

回答
投稿日時: 17/09/13 22:30:16
投稿者: simple

私も普通に繰り返し処理を行えばよいと思います。
配列に読み込んで判定し、結果を一括してシートに書き込むなどということも
あるかも知れませんが、基本は繰り返し処理です。
 
配列操作が可能なある種の統計言語のように、
a[(a<=2) | (a>=5)] <- 0
といった簡単な書き方はVBA自体にはありません。
自信を持って繰り返し処理を行ってください。
 
ちなみに、0で良いかどうかは後続の処理に依存します。

回答
投稿日時: 17/09/13 23:48:43
投稿者: sy

simple さんの引用:
私も普通に繰り返し処理を行えばよいと思います。
配列に読み込んで判定し、結果を一括してシートに書き込むなどということも
あるかも知れませんが、基本は繰り返し処理です。

あっ!
私の4秒と言うのは、一応Variant配列に読込んでの処理でした。
for eachでセルのまま回すと28秒でした。
まぁでも1日の中で数十回と頻繁に実行するとかでもない限り、待てない遅さでもないとは思いますけどね。

投稿日時: 17/09/14 09:36:41
投稿者: olive23804

syさん、simpleさん
 
アドバイスありがとうございます。
自信を持って、loopし上下限のチェックをします!
 
今は、生データ(86,400行 × 10列)のシートが1枚だけなのですが、これが増えることが予想されているので、できれば今からその対応をしておこうと思い質問致しました。
 
どうもありがとうございます。