こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Excelマクロで定義の関数実行結果が#VALUE

以前にマクロの記述について教えて頂いた件の再度の質問になります.
Excelマクロで複素数を扱う関数を下記HPから標準モジュールに
コピペしました.今度は正しくコピーできていると思います.
しかし,計算結果がどうしても「#VALUE!」となってしまいます.何故でしょうか?
どなたか助けて頂けませんか!

http://www.geocities.jp/tomtomf/denki/AC2/ac2.htm
http://www.geocities.jp/tomtomf/denki/AC1/ac1.htm

今回は関数定義の「 IMMULT」関数に関する部分に絞っています.
ここまで絞ってもエラーになるのは,単純な問題なのでしょうか?
行列の積を求めるマクロの手順にも問題はなさそうです.

Public Function IMPRODUCTa(ParamArray a()) As Variant
IMPRODUCTa = Application.Run("atpvbaen.xlam!IMPRODUCT", a)
End Function
Public Function IMSUMa(ParamArray a()) As Variant
IMSUMa = Application.Run("atpvbaen.xlam!IMSUM", a)
End Function
Public Function IMMULT(a As Range, b As Range) As Variant
Dim r1 As Integer, r2 As Integer, c1 As Integer, c2 As Integer, nn As Integer
Dim r As Integer, c As Integer
Dim cr As Integer, cc As Integer
Dim n As Integer
Dim mm() As Variant
r1 = a.Rows.Count
r2 = b.Rows.Count
c1 = a.Columns.Count
c2 = b.Columns.Count
If c1 = r2 Then
nn = c1
Else
Exit Function
End If
cr = r1
cc = c2
ReDim mm(1 To cr, 1 To cc)
For r = 1 To cr
For c = 1 To cc
mm(r, c) = 0
For n = 1 To nn
mm(r, c) = IMSUMa(mm(r, c), IMPRODUCTa(a.Cells(r, n), b.Cells(n, c)))
Next
Next
Next
IMMULT = mm
End Function

投稿日時 - 2019-02-06 22:29:09

QNo.9585332

困ってます

質問者が選んだベストアンサー

いろいろ試させていただきました。
Windows10(64bit) Excel2013 = IMMULT ⇒ #VALUE
Windows7(32bit) Excel2013 = IMMULT ⇒ #VALUE
Windows7(32bit) Excel2002
添付ファイルの結果になりました。
もちろんExcelのバージョンに合わせて
atpvbaen.xlam ⇒ atpvbaen.xla に訂正しております。

投稿日時 - 2019-02-07 10:33:22

お礼

watabe007さま,早々にご回答ありがとうございました.
頂いた情報から,これはマクロの記述が古いのかもしれないとExcel2016の入門書を購入し,構文をチェックしてみました.
誤り:IMPRODUCTa = Application.Run("atpvbaen.xla!IMPRODUCT", a) の様な事例はなく,ここの部分を
正解:IMPRODUCTa = Application.WorksheetFunction.ImProduct(a)
に変更してみたところ,ちゃんと動きました.
関数定義のマクロ本文ではなく前文が古い記載だったようです.
今回求めたい配列が15×17と大きいため手計算ではとても計算できないところでした.これで前に進めます.watabe007さまには前々から回答頂いてて,ホントにありがとうございます!!助かりました!!

投稿日時 - 2019-02-09 23:00:47

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問