
VBAの配列で頭を抱えています。
元々、WorksheetFunctionの引数に配列を入れて計算したかったのですが、原因不明のエラーで行き詰まっています。
Dim temp_array() As Variant
Dim a As Double
↓
※temp_array()という一時的な配列に、別の大きな配列の一部を切り出して代入
↓
a = WorksheetFunction.Average(temp_array())
という流れで、temp_array()に格納された数字の平均値を求めるという流れなのですが、
「実行時エラー'1004':
WorksheetFuntionクラスのAverageプロパティーを取得できません。」
となります。
配列の内容データがおかしいのかと思って、以下のようにエクセルシートに書き出して確認しても、データにおかしいところはありません。
For k = LBound(temp_array) To UBound(temp_array)
Cells(k, 1) = temp_array(k)
Next
ところが、書き出された数字(例えば、10,20,30,40,50とします)を
temp_array()=array(10,20,30,40,50)
として、全く同じ数字をtemp_array()に入れ直して、
a = WorksheetFunction.Average(temp_array())
とすると、今度は、エラーも出ずに期待した平均値が計算されて、aに代入されます。
色々、考えたのですが、何がおかしいのか全くお手上げです。
この怪奇現象について、何か思い当たる方がいたら、アドバイスいただけませんでしょうか?
No.1ベストアンサー
- 回答日時:
>※temp_array()という一時的な配列に、別の大きな配列の一部を切り出して代入
の部分が怪しいですね
次のマクロを実行してみてください
'値がすべて数字:エラーなし
Sub test1()
Dim aa() As Variant
[a1:c3].Value = [{10,20,30;40,50,60;70,80,90}]
aa() = Range("a1:c3").Value
MsgBox WorksheetFunction.Average(aa())
End Sub
'一部文字列:エラーなし
Sub test2()
Dim aa() As Variant
[a1:c3].Value = [{"a","b","c";40,50,60;70,80,90}]
aa() = Range("a1:c3").Value
MsgBox WorksheetFunction.Average(aa())
End Sub
'すべて文字列:実行時エラー'1004':・・・
Sub test3()
Dim aa() As Variant
[a1:c3].Value = [{"a","b","c";"d","e","f";"g","h","i"}]
aa() = Range("a1:c3").Value
MsgBox WorksheetFunction.Average(aa())
End Sub
'エラーがある場合:実行時エラー'1004':・・・
Sub test4()
Dim aa() As Variant
[a1:c3].Value = [{"=0/0",20,30;40,50,60;70,80,90}]
aa() = Range("a1:c3").Value
MsgBox WorksheetFunction.Average(aa())
End Sub
他のパターンもあるかもしれないが
主なものはこんなもんでしょう
参考までに
ありがとうございます。
おっしゃるとおりでした。
大きな配列から、WooksheetFunctionに入れる一時的な配列を切り出す処理を関数として書いています。
Variant型でないと配列としてやり取りができなかったので、Variant型にしていたのですが、見てみたら、何故か文字列として入っていました。
エクセルに書き出した時点で、文字データが数値データに変換されていたので、違いがわかりませんでした。
とても、一人では気がつかなかったので、大変助かりました。
ありがとうございます。
No.2
- 回答日時:
こんにちは。
#1の方が言われているように、
> ※temp_array()という一時的な配列に、別の大きな配列の一部を切り出して代入
↑この個所(処理内容)が問題かもしれません。
temp_arrray()は、Variant型で宣言されていますので、代入するデータの型、及び代入する
やり方によって、数値型(Integer、Long、Doubleなど)ではなく、例えば文字型(String)の
データとして値が格納されているかもしれません。
ですので、temp_array()の中身が 数値型以外 であった場合は、
a = WorksheetFunction.Average(temp_array())
の個所で、
「実行時エラー'1004':
WorksheetFuntionクラスのAverageプロパティーを取得できません。」
などのエラーが発生する可能性があると思われます。
実際、temp_array() の中身の型がどうなっているかは、「Visual Basic Editor」上で、
temp_array を「ウォッチ式」に追加しておいて、
マクロを実行
↓
エラーが発生し、エラーのダイアログが表示される
↓
ダイアログ上の「デバッグ」ボタンをクリック
↓
「Visual Basic Editor」が表示され、エラー個所がマークされブレークしている
↓
ウォッチウィンドウで、temp_array() の中身を確認
で、データの中身・データの型などが確認できると思います。
もしも、この確認で temp_array() の中身が数値型でなかった場合は、temp_array()
へのデータ代入処理を見直した方が良いかと思われます。
以上、見当違いの内容でしたらすみません。
#1さんともども、ありがとうございます。
原因がわかりました。
また、ウォッチ式の使い方を初めて知りました。
何分、VBAにチャレンジし始めて、1ヶ月ほどなので、デバッグツールをうまく使いこなせていません。
このエラーが解決しそうなのも、ありがたいのですが、
デバッグツールの使い方を勉強できたのも大収穫です。
重ねてお礼申し上げます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 6 2022/06/08 12:55
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2022/04/01 12:11
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- Visual Basic(VBA) 型が一致しませんとエラー 6 2023/07/06 20:14
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/08 09:08
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAの配列内容の確認
-
C言語の配列をPush(追加)する...
-
多次元配列の重複削除
-
C++ VS2005におけるイテレータ...
-
URLのサブドメインとドメイン部...
-
判定の仕方
-
foreachの間にテーブルの<TR>を...
-
配列をループでたくさん宣言し...
-
ネストが深い時のforeachはどう...
-
doxygenを使用する環境について
-
PHP 文字の出現回数
-
配列一致(要素順番は違うが内容...
-
file_existsでファイル名の部分...
-
String だと「 ByRef引数の型が...
-
csvの内容を行単位で削除したい
-
順位を付ける時のスコアの重複...
-
PHPで連想配列のプルダウンメニ...
-
OCI で、SELECT結果行数を取得...
-
漢字のソートについて
-
PHPのプルダウン式のジャンプ設...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語の配列をPush(追加)する...
-
行列
-
CArrayの要素としてCStringArra...
-
Texでの数式
-
CArrayのソート
-
読み(あ行~わ行)ごとに分け...
-
C言語 最大値と最小値を求めて...
-
PHPのmin関数、「1」以上の数値...
-
fgetc関数について
-
連想配列の文字コードを変換
-
C言語のchar ポインタ
-
STLのvectorで作った配列をメン...
-
C言語で全角文字の扱いについて
-
配列を指定した順序でソート
-
php で1から100までの素数の表...
-
delphi 2次元配列がわかりません
-
np.stack()とnp.array()の違い
-
verilogで、配列の一部をタスク...
-
array_intersectで空欄を比較し...
-
cakephpでのトランザクション処...
おすすめ情報