Excel VBA質問箱 IV

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

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


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

【68903】worksheetfunctionについて tomr25 11/4/26(火) 10:07 質問[未読]
【68904】Re:worksheetfunctionについて neptune 11/4/26(火) 12:18 発言[未読]
【68908】Re:worksheetfunctionについて tomr25 11/4/26(火) 17:01 お礼[未読]
【68911】Re:worksheetfunctionについて neptune 11/4/26(火) 17:55 回答[未読]
【68905】Re:worksheetfunctionについて UO3 11/4/26(火) 12:45 発言[未読]
【68907】Re:worksheetfunctionについて tomr25 11/4/26(火) 17:00 お礼[未読]
【68906】Re:worksheetfunctionについて SK63 11/4/26(火) 12:55 発言[未読]
【68909】Re:worksheetfunctionについて tomr25 11/4/26(火) 17:02 回答[未読]
【68910】Re:worksheetfunctionについて SK63 11/4/26(火) 17:43 発言[未読]
【68912】Re:worksheetfunctionについて tomr25 11/4/26(火) 18:08 回答[未読]
【68925】Re:worksheetfunctionについて SK63 11/4/28(木) 1:38 発言[未読]
【68927】Re:worksheetfunctionについて tomr25 11/4/28(木) 8:34 お礼[未読]
【68928】Re:worksheetfunctionについて SK63 11/4/28(木) 10:04 お礼[未読]
【68931】Re:worksheetfunctionについて momo 11/4/28(木) 18:56 発言[未読]
【69010】Re:worksheetfunctionについて tomr25 11/5/9(月) 15:47 お礼[未読]

【68903】worksheetfunctionについて
質問  tomr25  - 11/4/26(火) 10:07 -

引用なし
パスワード
   Excel2010を使用しています.
マクロにて,single配列にデータを格納してworksheetfunctionでmaxやmodeを使うと,配列の要素数が65535を超えると「実行時エラー13,型が一致しません」というエラーがでます.
できれば関数を使いたいのですが,良い対応手段があれば教えてください.

【68904】Re:worksheetfunctionについて
発言  neptune  - 11/4/26(火) 12:18 -

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

宣言を含め再現できるソースをUPした方が良いアドバイスを受けられますよ。

【68905】Re:worksheetfunctionについて
発言  UO3  - 11/4/26(火) 12:45 -

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

こちら、2003ですが、同様になります。
(以下のTest1はOK,Test2はエラー。)
まぁ、配列は領域と同じと考えた時、少なくともxl2003の行数で
65537は、ありえないのでエラーとなるのも、うなずけるのですが
これが2010でも同じということですね。

う〜ん・・・WorkSheetFunctionクラスのMax関数の中身が
2010でも、2003のロジックのままとか・・・?
シート上でA列に、65537行分、値をいれて、=Max(A1:A65537) とやると
どうなりますか?

Sub Test1()
  Dim v(1 To 65536) As Single
  Dim i As Long
  For i = 1 To UBound(v)
    v(i) = i
  Next
  
  MsgBox WorksheetFunction.Max(v)
  
End Sub

Sub Test2()
  Dim v(1 To 65537) As Single
  Dim i As Long
  For i = 1 To UBound(v)
    v(i) = i
  Next
  
  MsgBox WorksheetFunction.Max(v)
  
End Sub

>Excel2010を使用しています.
>マクロにて,single配列にデータを格納してworksheetfunctionでmaxやmodeを使うと,配列の要素数が65535を超えると「実行時エラー13,型が一致しません」というエラーがでます.
>できれば関数を使いたいのですが,良い対応手段があれば教えてください.

【68906】Re:worksheetfunctionについて
発言  SK63  - 11/4/26(火) 12:55 -

引用なし
パスワード
   ▼tomr25 さん:
>Excel2010を使用しています.
>マクロにて,single配列にデータを格納してworksheetfunctionでmaxやmodeを使うと,配列の要素数が65535を超えると「実行時エラー13,型が一致しません」というエラーがでます.
>できれば関数を使いたいのですが,良い対応手段があれば教えてください.

LONGでは、いけないのでしょうか??

参考

ht tp://www.asahi-net.or.jp/~ef2oinue/vba_k/sub04_050_09.html
ht tp://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_050_06.html

【68907】Re:worksheetfunctionについて
お礼  tomr25  - 11/4/26(火) 17:00 -

引用なし
パスワード
   UO3さん

検証ありがとうございます.
Excel2003のロジックの可能性はありますよね.

ちなみに,セルに値をいれてシート上で関数を使うのには
問題ありません.

とりあえず,他の方法を検討したいと思います.

ありがとうございました.

▼UO3 さん:
>▼tomr25 さん:
>
>こちら、2003ですが、同様になります。
>(以下のTest1はOK,Test2はエラー。)
>まぁ、配列は領域と同じと考えた時、少なくともxl2003の行数で
>65537は、ありえないのでエラーとなるのも、うなずけるのですが
>これが2010でも同じということですね。
>
>う〜ん・・・WorkSheetFunctionクラスのMax関数の中身が
>2010でも、2003のロジックのままとか・・・?
>シート上でA列に、65537行分、値をいれて、=Max(A1:A65537) とやると
>どうなりますか?
>
>Sub Test1()
>  Dim v(1 To 65536) As Single
>  Dim i As Long
>  For i = 1 To UBound(v)
>    v(i) = i
>  Next
>  
>  MsgBox WorksheetFunction.Max(v)
>  
>End Sub
>
>Sub Test2()
>  Dim v(1 To 65537) As Single
>  Dim i As Long
>  For i = 1 To UBound(v)
>    v(i) = i
>  Next
>  
>  MsgBox WorksheetFunction.Max(v)
>  
>End Sub
>
>>Excel2010を使用しています.
>>マクロにて,single配列にデータを格納してworksheetfunctionでmaxやmodeを使うと,配列の要素数が65535を超えると「実行時エラー13,型が一致しません」というエラーがでます.
>>できれば関数を使いたいのですが,良い対応手段があれば教えてください.

【68908】Re:worksheetfunctionについて
お礼  tomr25  - 11/4/26(火) 17:01 -

引用なし
パスワード
   neptuneさん

もっとものご意見ありがとうございます.

他の方がソースをUPしていただいたので,
ほぼ同じ内容でしたので割愛させていただきます.

よろしくお願いします.

▼neptune さん:
>▼tomr25 さん:
>
>宣言を含め再現できるソースをUPした方が良いアドバイスを受けられますよ。

【68909】Re:worksheetfunctionについて
回答  tomr25  - 11/4/26(火) 17:02 -

引用なし
パスワード
   SK63さん

LONGでやってみたのですが,同じ結果でした.

ご意見ありがとうございます.

▼SK63 さん:
>▼tomr25 さん:
>>Excel2010を使用しています.
>>マクロにて,single配列にデータを格納してworksheetfunctionでmaxやmodeを使うと,配列の要素数が65535を超えると「実行時エラー13,型が一致しません」というエラーがでます.
>>できれば関数を使いたいのですが,良い対応手段があれば教えてください.
>
>LONGでは、いけないのでしょうか??
>
>参考
>
>ht tp://www.asahi-net.or.jp/~ef2oinue/vba_k/sub04_050_09.html
>ht tp://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_050_06.html

【68910】Re:worksheetfunctionについて
発言  SK63  - 11/4/26(火) 17:43 -

引用なし
パスワード
   ▼tomr25 さん:
>SK63さん
U03さんのをさんこうにして見ました要素が0〜なのでエラー
となったようです,Dim(0 to 65536)だとエラーが出ます。


Sub Test2()
  Dim v(1 To 65536) As Single
  Dim i As Long
  For i = 1 To UBound(v)
    v(i) = i
  Next
 
  MsgBox WorksheetFunction.Max(v)
 
End Sub

【68911】Re:worksheetfunctionについて
回答  neptune  - 11/4/26(火) 17:55 -

引用なし
パスワード
   ▼tomr25 さん:
多分Max関数の扱える要素数に制限があるような気がします。
65536個まで?

関数は自作すればどうでしょう?

【68912】Re:worksheetfunctionについて
回答  tomr25  - 11/4/26(火) 18:08 -

引用なし
パスワード
   SK63さん

1〜65536だと要素数は65535なのでOKなのだと思います.
1〜65537でやると要素数によるエラーが出ると思います.

よろしくお願いします.

▼SK63 さん:
>▼tomr25 さん:
>>SK63さん
>U03さんのをさんこうにして見ました要素が0〜なのでエラー
>となったようです,Dim(0 to 65536)だとエラーが出ます。
>
>
>Sub Test2()
>  Dim v(1 To 65536) As Single
>  Dim i As Long
>  For i = 1 To UBound(v)
>    v(i) = i
>  Next
> 
>  MsgBox WorksheetFunction.Max(v)
> 
>End Sub

【68925】Re:worksheetfunctionについて
発言  SK63  - 11/4/28(木) 1:38 -

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

max関数が規定以上の場合は、分割して動作させることですかね〜

1〜60000と60001〜120000で出した数値をMaxするとどの様なコードが
出来上がるでしょうか??

最終行を探すコード(65536から上へ)
GYOmax= ActiveSheet.Range("$A$65536").End(xlUp).Address

if GYOmax<60000 thne
 '60000以下なので分割しない
else
 ’以上なので分割する
end if

【68927】Re:worksheetfunctionについて
お礼  tomr25  - 11/4/28(木) 8:34 -

引用なし
パスワード
   SK63さん

ご検討ありがとうございます.
Maxの場合は問題ないような気がしますが,
MODE関数などは影響がありそうな・・・

状況に応じて,関数処理を自作することを検討します.

ちなみに,Microsoftとかに報告すると改善検討してくれんですかね?

とにかく,ありがとうございました!!

▼SK63 さん:
>▼tomr25 さん:
>
>max関数が規定以上の場合は、分割して動作させることですかね〜
>
>1〜60000と60001〜120000で出した数値をMaxするとどの様なコードが
>出来上がるでしょうか??
>
>最終行を探すコード(65536から上へ)
>GYOmax= ActiveSheet.Range("$A$65536").End(xlUp).Address
>
>if GYOmax<60000 thne
> '60000以下なので分割しない
>else
> ’以上なので分割する
>end if

【68928】Re:worksheetfunctionについて
お礼  SK63  - 11/4/28(木) 10:04 -

引用なし
パスワード
   ▼tomr25 さん:
>SK63さん
>
>ご検討ありがとうございます.
>Maxの場合は問題ないような気がしますが,
>MODE関数などは影響がありそうな・・・
>
この辺りまでのデータ量になると、
DataBaseの方が便利で早くなってくるのではとも思います。

【68931】Re:worksheetfunctionについて
発言  momo  - 11/4/28(木) 18:56 -

引用なし
パスワード
   ▼tomr25 さん:
2007で少し検証してみました。

65537以上の要素数の配列    → NG
65537以上のセルのValue     → NG
65537以上のRangeオブジェクト → OK

という結果でした。
コードで言うと

Sub test()
Dim Ans As Double
Dim tbl(1 To 65537, 1 To 1) As Single
Dim i As Long
Randomize
For i = 1 To UBound(tbl)
 tbl(i, 1) = Rnd * 100
Next i
On Error Resume Next
 '### 単純に配列で処理
 Ans = WorksheetFunction.Max(tbl)
 If Err.Number > 0 Then
  MsgBox "エラーです"
  Err.Clear
 Else
  MsgBox Ans
 End If
 '### セルに書きだして処理
 With Worksheets("Sheet1").Range("A1").Resize(UBound(tbl))
  .Value = tbl
  Ans = WorksheetFunction.Max(.Cells)
 End With
 If Err.Number > 0 Then
  MsgBox "エラーです"
  Err.Clear
 Else
  MsgBox Ans
 End If
On Error GoTo 0
End Sub

こんな感じ。
一旦セルに書きだしてRangeオブジェクトを範囲としてあげればOKですね。

関数自作なら、MAXは単純にループで作れると思いますし
MODEもDictionaryなんか使えば簡単に作れると思います。
場合によっては最初に変数に入れる段階で答えを作れちゃいますね?

【69010】Re:worksheetfunctionについて
お礼  tomr25  - 11/5/9(月) 15:47 -

引用なし
パスワード
   momoさん

詳細な検証をありがとうございます!!
自作関数もありだったのですが,できればと思い相談させてもらっていました.

自作関数やデータの扱いなど,方法を考えてみます.

ありがとうございました!

▼momo さん:
>▼tomr25 さん:
>2007で少し検証してみました。
>
>65537以上の要素数の配列    → NG
>65537以上のセルのValue     → NG
>65537以上のRangeオブジェクト → OK
>
>という結果でした。
>コードで言うと
>
>Sub test()
>Dim Ans As Double
>Dim tbl(1 To 65537, 1 To 1) As Single
>Dim i As Long
>Randomize
>For i = 1 To UBound(tbl)
> tbl(i, 1) = Rnd * 100
>Next i
>On Error Resume Next
> '### 単純に配列で処理
> Ans = WorksheetFunction.Max(tbl)
> If Err.Number > 0 Then
>  MsgBox "エラーです"
>  Err.Clear
> Else
>  MsgBox Ans
> End If
> '### セルに書きだして処理
> With Worksheets("Sheet1").Range("A1").Resize(UBound(tbl))
>  .Value = tbl
>  Ans = WorksheetFunction.Max(.Cells)
> End With
> If Err.Number > 0 Then
>  MsgBox "エラーです"
>  Err.Clear
> Else
>  MsgBox Ans
> End If
>On Error GoTo 0
>End Sub
>
>こんな感じ。
>一旦セルに書きだしてRangeオブジェクトを範囲としてあげればOKですね。
>
>関数自作なら、MAXは単純にループで作れると思いますし
>MODEもDictionaryなんか使えば簡単に作れると思います。
>場合によっては最初に変数に入れる段階で答えを作れちゃいますね?

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