Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10945 / 13646 ツリー ←次へ | 前へ→

【18896】配列の最大値 にゃんぎょ 04/10/15(金) 17:43 質問[未読]
【18897】Re:配列の最大値 IROC 04/10/15(金) 17:45 回答[未読]
【18899】Re:配列の最大値 にゃんぎょ 04/10/15(金) 17:51 質問[未読]
【18900】Re:配列の最大値 IROC 04/10/15(金) 17:58 回答[未読]
【18901】Re:配列の最大値 にゃんぎょ 04/10/15(金) 18:00 お礼[未読]
【18902】Re:配列の最大値 Asaki 04/10/15(金) 18:01 回答[未読]
【18903】Re:配列の最大値 ichinose 04/10/15(金) 18:02 発言[未読]
【18904】Re:配列の最大値 Asaki 04/10/15(金) 18:24 発言[未読]
【18907】Re:配列の最大値 ichinose 04/10/15(金) 18:42 発言[未読]
【18909】Re:配列の最大値 Asaki 04/10/15(金) 22:06 発言[未読]
【18915】Re:配列の最大値 ichinose 04/10/16(土) 9:14 発言[未読]
【18991】Re:配列の最大値 Jaka 04/10/19(火) 9:43 発言[未読]
【19036】Re:配列の最大値 ichinose 04/10/19(火) 23:31 発言[未読]
【18905】Re:配列の最大値 にゃんぎょ 04/10/15(金) 18:30 お礼[未読]

【18896】配列の最大値
質問  にゃんぎょ  - 04/10/15(金) 17:43 -

引用なし
パスワード
   またまたお世話になりに伺いました。

配列の中のデータの最大値を取得するにはどうしたらよいのでしょうか。
過去ログに以下の例文がありました。

Dim Max_Value As Integer
Max_Value = WorksheetFunction.Max(Array(g, h, i, j, k, l, m, n))

しかし今回の配列の添え字は可変です。

Max_Value = WorksheetFunction.Max(Array())
                   ↑ここをどうしたらよいかわからない。
よろしくご指導お願いします。

【18897】Re:配列の最大値
回答  IROC  - 04/10/15(金) 17:45 -

引用なし
パスワード
   シートの出力したり、ループで処理する方法以外でということでしょうか?

【18899】Re:配列の最大値
質問  にゃんぎょ  - 04/10/15(金) 17:51 -

引用なし
パスワード
   ▼IROC さん:
>シートの出力したり、ループで処理する方法以外でということでしょうか?

返信ありがとうございます。
そうなのです。
できればループ処理ではない方法がいいのです。
なぜなら可変の添え字は200以上になる場合もあるので・・・
やっぱりループするしかないでしょうか。

【18900】Re:配列の最大値
回答  IROC  - 04/10/15(金) 17:58 -

引用なし
パスワード
   私は「シートに出力」「ループで処理」しか知らないですので
識者の回答を待ってみて下さい。

【18901】Re:配列の最大値
お礼  にゃんぎょ  - 04/10/15(金) 18:00 -

引用なし
パスワード
   ▼IROC さん:

いつもありがとうございます。
私もいろいろ試してがんばってみます。

【18902】Re:配列の最大値
回答  Asaki  - 04/10/15(金) 18:01 -

引用なし
パスワード
   こんばんは。

良く分からないんですが、
Max_Value = WorksheetFunction.Max(配列)
ではダメなのでしょうか?

【18903】Re:配列の最大値
発言  ichinose  - 04/10/15(金) 18:02 -

引用なし
パスワード
   ▼にゃんぎょ さん:
こんばんは。
>またまたお世話になりに伺いました。
>
>配列の中のデータの最大値を取得するにはどうしたらよいのでしょうか。
>過去ログに以下の例文がありました。
>
>Dim Max_Value As Integer
>Max_Value = WorksheetFunction.Max(Array(g, h, i, j, k, l, m, n))
>
>しかし今回の配列の添え字は可変です。
>
>Max_Value = WorksheetFunction.Max(Array())
>                   ↑ここをどうしたらよいかわからない。
>よろしくご指導お願いします。
'===================================================
Sub test()
  Dim a(1 To 10) As Long
  For i = 1 To 10
   a(i) = i
   Next
  '↑サンプル作成
  MsgBox WorksheetFunction.Max(a())
 
End Sub

とすればMaxは取得できますが、
配列を使用すると、添え字の上限がありますけどね

【18904】Re:配列の最大値
発言  Asaki  - 04/10/15(金) 18:24 -

引用なし
パスワード
   ichinose さん、こんばんは。

配列の上限はどれくらいなんでしょうかね。
Excelのヴァージョンにもよるのではないかと思いますが、
取り敢えず、2次元配列 20*256(要素数で5120)はいけました。
マシンスペックにもよるんでしょうか?

Win2000/Excel:2000

【18905】Re:配列の最大値
お礼  にゃんぎょ  - 04/10/15(金) 18:30 -

引用なし
パスワード
   ▼ichinose さん:

みなさん、ほんとうにありがとうございます!

>Sub test()
>  Dim a(1 To 10) As Long
>  For i = 1 To 10
>   a(i) = i
>   Next
>  '↑サンプル作成
>  MsgBox WorksheetFunction.Max(a())
> 
>End Sub
>


実は私も上記と同じコードで試して、"0"が返ってきてしまったので
こちらにヘルプをお願いしたしだいなのです。
おかしいなぁと、よくよく見てみたら、

dim arrN()

↑のように、型を宣言していなかったので、原因はこれか!と

dim arrN() as Long

にしたところ、ちゃんと値が返ってきました〜!

ほんとうに助かりました。
ありがとうございます!

【18907】Re:配列の最大値
発言  ichinose  - 04/10/15(金) 18:42 -

引用なし
パスワード
   ▼Asaki さん:
こんばんは。
>
>配列の上限はどれくらいなんでしょうかね。
>Excelのヴァージョンにもよるのではないかと思いますが、
>取り敢えず、2次元配列 20*256(要素数で5120)はいけました。
>マシンスペックにもよるんでしょうか?
>
>Win2000/Excel:2000
確認した環境は、Win98sec&Excel2000です。
'=================================================
Sub test()
  Dim a(1 To 5461) As Long
  For i = 1 To 5461
   a(i) = i
   Next
  MsgBox WorksheetFunction.Max(a())
 
End Sub
上記コードの5461でOK、5462でNGでした。
Transposeも有るんでしたよね配列の上限制限・・・。
似たような上限値だったと思いましたよ!!

【18909】Re:配列の最大値
発言  Asaki  - 04/10/15(金) 22:06 -

引用なし
パスワード
   こんばんは。
検証していただいたようですみません。
ありがとうございます。m(_ _)m

とりあえず、サポートで明言しているのは↓くらいのようで。

[XL2000]配列のサイズの制限について
http://support.microsoft.com/default.aspx?scid=kb;ja;416526

やはり、
基本的には使用可能メモリ依存
とあって、微妙ですね。。。

【18915】Re:配列の最大値
発言  ichinose  - 04/10/16(土) 9:14 -

引用なし
パスワード
   ▼Asaki さん:
おはようございます。

>
>とりあえず、サポートで明言しているのは↓くらいのようで。
>
>[XL2000]配列のサイズの制限について
>http://support.microsoft.com/default.aspx?scid=kb;ja;416526
基本的には使用可能メモリ依存
↑この配列制限の問題って、2000だけなんですね?
(以前、ここで確かJakaさんだと思いましたが、
 transpose絡みでこの事例を述べていたと思いました。
 その時みたのは、英語サイトでしたが。
 V3探そうとしたら、今現在、閲覧できませんでした)
 

excel2002では、
'================
Sub test()
  Dim a(1 To 65536) As Long
  For i = 1 To 65536
   a(i) = i
   Next
  MsgBox WorksheetFunction.Max(a())
 
End Sub

までokなんです(セル範囲を指定するときと同じですよね)。
(マシンスペックは2000のときと同じです。)
これは、match関数やtranspose関数も同じでした。
改善されたんでしょうねえ!!

といってもワークシート関数のセル範囲指定引数に
配列を使用するときには、配列数制限を考慮するということで・・・。

【18991】Re:配列の最大値
発言  Jaka  - 04/10/19(火) 9:43 -

引用なし
パスワード
   みなさま こんにちは。

よく昔の事を覚えていらっしゃる ichinoseさん こんにちは。

>(以前、ここで確かJakaさんだと思いましたが、
>transpose絡みでこの事例を述べていたと思いました。
>その時みたのは、英語サイトでしたが。
>V3探そうとしたら、今現在、閲覧できませんでした)

V3で、そんなこと書いたっけかな?
しかも、英語サイト...??
と思っていたら、
ああ、この時ねと思い出しました。
この時ね、と言っても過去ログは削除されていてもう見れないと思います。
(今確認してみようとしたら、V3とつながりませんでした。)

これは、コロスケさんです。
(私は、コロスケさんと違い、英語が全くと言っていいほど解りません。
 唯一、先見箱で書いた英語版ジャパニーズことわざだけ覚えてます。)

当時コロスケさんは、CSVの読み込みに「ReDim Preserve 配列」を使っちゃったんで、「transpose」の壁にぶち当たったみたいでした。
途中でコロスケさんのPCがぶっ壊れたとかで、私が配列を使ってCSVの読み込みに試行錯誤中だった事もありまして、代わりに回答させていただきました。
最終的な回答が私だったんで、コロスケさんとごっちゃになったようですね。

EXCEL97 & 2000 のワークシート関数「transpose」を使っての配列要素数の上限は、
5461個(1〜5461)までだったみたいでしたね!
(上限の個数忘れちゃったんで、前に自分でテストして出した個数ですが...。)

私は、「ReDim Preserve」で、大きな配列を値を保持しつつ拡張していくのは、コード的には書きやすそうでしたが、PCに負担がかかると思って頭に入れてなかったです。また、「transpose」に欠点がありまして...。


Dim StSt(1 to 10) As String
の配列に「0001」等を入れてある場合、

Range("A1:A10").value = StSt
だと、表示形式が標準でも文字列としてはいります。

「transpose」させるとエクセルに勝手に数字変換されてしまいます。

Sub tttt()
  Dim StSt(1 To 10) As String
  For i = 1 To 10
    StSt(i) = Format(i, "000")
  Next
  Range("A1:J1").Value = StSt
  Range("A2:A11").Value = Application.Transpose(StSt)
End Sub

【19036】Re:配列の最大値
発言  ichinose  - 04/10/19(火) 23:31 -

引用なし
パスワード
   ▼Jaka さん:
こんばんは。

>
>よく昔の事を覚えていらっしゃる ichinoseさん こんにちは。
あっはは、年とると、昔の事は、よく覚えているものなんです・・・。
昨日の事は、忘れるけど。年寄りって昔話が好きじゃない? あれと一緒?

>
>>(以前、ここで確かJakaさんだと思いましたが、
>>transpose絡みでこの事例を述べていたと思いました。
>>その時みたのは、英語サイトでしたが。
>>V3探そうとしたら、今現在、閲覧できませんでした)
>
>V3で、そんなこと書いたっけかな?
>しかも、英語サイト...??
>と思っていたら、
>ああ、この時ねと思い出しました。
>この時ね、と言っても過去ログは削除されていてもう見れないと思います。
>(今確認してみようとしたら、V3とつながりませんでした。)
>
>これは、コロスケさんです。
>(私は、コロスケさんと違い、英語が全くと言っていいほど解りません。
> 唯一、先見箱で書いた英語版ジャパニーズことわざだけ覚えてます。)
>
>当時コロスケさんは、CSVの読み込みに「ReDim Preserve 配列」を使っちゃったんで、「transpose」の壁にぶち当たったみたいでした。
>途中でコロスケさんのPCがぶっ壊れたとかで、私が配列を使ってCSVの読み込みに試行錯誤中だった事もありまして、代わりに回答させていただきました。
>最終的な回答が私だったんで、コロスケさんとごっちゃになったようですね。
そうだったんですか?

>
>EXCEL97 & 2000 のワークシート関数「transpose」を使っての配列要素数の上限は、
>5461個(1〜5461)までだったみたいでしたね!
>(上限の個数忘れちゃったんで、前に自分でテストして出した個数ですが...。)
↑これは、私も確認しました。

>私は、「ReDim Preserve」で、大きな配列を値を保持しつつ拡張していくのは、コード的には書きやすそうでしたが、PCに負担がかかると思って頭に入れてなかったです。また、「transpose」に欠点がありまして...。
>
>
>Dim StSt(1 to 10) As String
>の配列に「0001」等を入れてある場合、
>
>Range("A1:A10").value = StSt
>だと、表示形式が標準でも文字列としてはいります。
>
>「transpose」させるとエクセルに勝手に数字変換されてしまいます。
なるほど、上記の内容確認しました。
やりようはありますが、注意が必要ですね!!メモメモ・・・。

このご質問で2002では、Transpose関数やMatch関数、Max関数等が配列もセル範囲と
同じ数で使える事もわかりました。
収穫でした。

10945 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free