- 締切済み
EXCEL VBA 2次元配列に格納された値の最小値を調べたい
いつもお世話になっております。 ブックAのマクロからブックBのデータを以下のように配列に入力しています。 myData = Workbooks("ブックB.xls").Worksheets("temp").Range("A1:G1000") 配列myDataに格納された値の最小値を調べたいのですが、myDataに格納されているデータは数値だけではなく、日付、時間も含まれます。 数値のみが含まれるのはmyDataの3~6列です。 myDataが数値のみの配列の場合、 WorksheetFunction.Min(myData) で配列全体を調べることが出来るのは分かったのですが、今回の場合は日付、時間が含まれるため「型が一致しません」というエラーがでて、最小値を求めることが出来ませんでした。 WorksheetFunction.Minを使って特定の列(今回の場合3~6列)に格納されている数値の最小値を調べることは出来るのでしょうか。 3~6列を別の配列に格納すればそれで解決なのですが、出来れば変数をmyDataだけで済ませたいと思っています。 また、WorksheetFunction.Minを使わないでfor文を使う方法も考えつきましたが、できればWorksheetFunction.Minなどの関数を使ってスマートにやりたいと思っています。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >関数を使ってスマートにやりたいと思っています。 よく質問で、「スマート」という言葉が出てきますが、私は意味が良く分からないです。「スリム」というなら意味は分かりますが、それは、良いときと悪いときがあります。 コードに合理性があって、エラーを吐かなければそれで良いとすればよいと思います。ベテランの人のコードは、単に論理性と合理性の追求だけであって、それ以上のものを求めているわけではありません。しょせん、VBAマクロの、マクロという意味は、タスクを実行するという意味を含んでいるので、仕事をしなければマクロではない、という結果論でしかありません。それと、関数も、中身は人の作ったプログラミングです。単に、作られた言語の違いでしかありません。 コードですが、myData で、配列を使うのでしょうか? Dim r As Range Dim ret As Double Set r = Workbooks("ブックB.xls").Worksheets("temp").Range("C1:F1000") ret = WorksheetFunction.Min(r) で良いと思うのです。 それに、時間であろうが、日付であろうが、日付型は、すべて数値型ですから、それ自体ではじかれることはありません。時間や日付のセルを省くなら、ループで探すしかないと思います。範囲内に、エラー値があれば、プロパティエラーが発生します。 「型が一致しません」 そのエラーは、おそらく、基本的に、配列の変数の型の問題だろうと思います。 ワークシートの2次元配列を受けるなら、 Dim myData As Variant ということです。
- hana-hana3
- ベストアンサー率31% (4940/15541)
>スマートにやりたいと思っています。 myData をどのように利用するのか解りませんが、スマートにやりたいと言うなら、意味の異なる部分まで取り込まない事だとおもいます・・・。 myMin = WorksheetFunction.Min(Workbooks("ブックB.xls").Worksheets("temp").Range("C1:F1000"))
お礼
回答、ありがとうございます。 WorksheetFunction.Minを使って特定の列に格納されている数値の最小値を調べることが出来るかどうかが知りたかったのですが、どうやらそういう方法はないようですね。 スマートにと言うなら、hana-hana3様が仰るように余計なものを取り込まなければいいんですよね。 質問をする前に、私はプログラミングに対する考え方から直した方がいいようですね。 申し訳ありませんでした。
お礼
回答、ありがとうございます。 私の稚拙な文章で不快な思いをされたようで申し訳ありませんでした。 myDataで配列を使う理由は、今回の質問と関係ない部分でループ処理をするためです。 ループ内でいちいちブックBへアクセスすると速度低下を招くと考えたからです。 今回の質問の、2次元配列に格納された値の最小値を知りたいというのは私がやりたいと思っていることのごく一部分に過ぎません。 hana-hana3様へのお礼でも書きましたが、私はプログラミングに対する考え方から直さないといけませんね。 お騒がせいたしました。