• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA上で定義された関数のワークシート上での実行)

VBA上で定義された関数のワークシート上での実行

このQ&Aのポイント
  • VBA上で定義された関数をワークシート上で使用する際にうまくいかない問題が発生しています。
  • マクロ上では正しく計算が行われるが、セル上ではうまく計算されないようです。
  • マクロ上で定義した構造体をセル上で使用することができない可能性があります。

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

たいして詳しくないので推測&取り敢えずの対策ですが。 >そもそも、マクロ上で定義した構造体を、セル上で用いようとする.. セル上で、というより「ユーザー定義型をワークシート関数の『戻り値』にできない」、 という事ではないかと推測します。 ワークシート関数として =setComplex(2,3) で返されたものが評価(?)できないのかな。 例えば数式バーで=absComplex(setComplex(B6,C6))の一部であるsetComplex(B6,C6)を選択して F9キーで検証しようとしても配列でもないから、答えの返りようがないんですよね。 Function test(x As Double, y As Double) As Double   test = absComplex(setComplex(x, y)) End Function ..な感じで内包してあげれば =test(B6,C6) のように使えますが、これだと『マクロ上で定義した構造体を、セル上で用い』るとは言えない?

tkajte0804
質問者

お礼

回答のご意見、どうもです。 > 「ユーザー定義型をワークシート関数の『戻り値』にできない」、 > という事ではないかと推測します。 うすうす、そのような気がしていました。 ただ、ソフトの仕様に関する事なので、個人レベルで調べることもできず、 ここで質問してみました。 ソフトの内部仕様に、ある程度、調べられればいいんですけどね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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

  • エクセルマクロで定義した関数が動きません

    以前にマクロの記述について教えて頂いた件の続きになります. ご指導頂いたとおりExcelマクロで複素数を扱う関数を下記HPから 標準モジュールにコピペしました.今度は正しくコピーできたと思いますが, 実行するとエラーになります. 標準の組込み関数を用いて「実数」の行列を計算すれば正しく 計算できますが,当然ながら「複素数」は計算できません. この「複素数」を扱う新しく定義した関数が動かない理由, 「End if に対するifブロックがありません」とか 計算結果が「#VALUE!」となってしまうのは何故でしょうか? マクロの記述内容はほとんど理解できないのですが, どなたか助けて頂けませんか! ちなみにエクセルは2016版です. http://www.geocities.jp/tomtomf/denki/AC2/ac2.htm http://www.geocities.jp/tomtomf/denki/AC1/ac1.htm 以下はコピー定義した「 IMMULT」関数と「 IMINVERS」関数のマクロです. 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 Public Function IMINVERS(a As Range) As Variant Dim n As Integer, n1 As Integer, n2 As Integer Dim r1 As Integer, r2 As Integer, c As Integer Dim max As Variant Dim i As Integer Dim m() As Variant Dim inm() As Variant Dim rr As Integer, cc As Integer Dim no As Integer, ex As Variant n1 = a.Rows.Count n2 = a.Columns.Count n = n1 ReDim inm(1 To n1, 1 To n2) For rr = 1 To n1 For cc = 1 To n2 If rr <> cc Then inm(rr, cc) = 0 Else inm(rr, cc) = 1 'End If Next Next ReDim m(1 To n1, 1 To n2) m = a If n1 <> n2 Then IMINVERS = False Exit Function End If For r1 = 1 To n max = m(r1, r1) no = r1 If r1 < n Then For i = r1 + 1 To n If IMABSa(m(i, r1)) > IMABSa(max) Then max = m(i, r1) no = i End If Next If (r1 <> no) Then For i = 1 To n ex = m(r1, i) m(r1, i) = m(no, i) m(no, i) = ex Debug.Print m(r1, i), m(no, i) ex = inm(r1, i) inm(r1, i) = inm(no, i) inm(no, i) = ex Next End If End If max = m(r1, r1) For i = 1 To n m(r1, i) = IMDIVa(m(r1, i), max) inm(r1, i) = IMDIVa(inm(r1, i), max) Next For r2 = 1 To n If r1 <> r2 Then max = m(r2, r1) For i = 1 To n m(r2, i) = IMSUBa(m(r2, i), IMPRODUCTa(m(r1, i), max)) inm(r2, i) = IMSUBa(inm(r2, i), IMPRODUCTa(inm(r1, i), max)) Next End If Next Next IMINVERS = inm End Function

  • VBAでのユーザ定義関数の返り値

    VBAでのユーザ定義関数の返り値をエクセルのセルに表示させる際、 色を変更して表示するにはどうすれば良いのでしょうか? つきのような関数のerrorの時だけ赤色にしたいのです。 functin test(ss as double) if ss >10 then test=ok else test =error! end if end function

  • VBAのマクロをシート内の式で使いたい

    VBAで、マクロの関数をエクセルの式で使うことは可能でしょうか? 引数や戻り値の制約も知りたいです。 引数はExcel側ではセル値B1とかになりますが、VBA側では何か対策でもあるのでしょうか? 'VBA public function test(byval a as integer, byval b as integer) as integer test = a + b end function 'エクセル側 C1セルに以下の式 =test(A1, B1)

  • ユーザー定義関数でシート名を取得したい

    例えば、以下のユーザー定義関数で Public Function Test(A As Range) Test=A.Address End Function AにアクティブシートのセルA1~セルB2を指定すると「$A$1:$B$2」という値が帰ってきますが、 別のシートのセルA1~セルB2を指定しても、「$A$1:$B$2」という値が帰ってきます。 シート名が抜けてしまっているのですが、シート名はどのようにしたら取得できますか?

  • VBA DLLワークシート関数配列引数について

    こんばんわ Cで書かれたDLLをワークシートで呼んで計算に使用しているのですが 配列を引数に取る関数にワークシートの値(B1:B5みたいな感じ)を渡したいのですが渡せなくて困っています。 VBAのFunctionから呼んでデバックをかけてみたら、たとえば「B1:B5」を渡すとRangeオブジェクトとして渡されているみたいなんですがこれをなんとか配列として渡したいです。 ↓DLLの関数例です __declspec(dllexport) LONG __stdcall SumTest(LONG *p, LONG psize) { LONG i = 0; LONG Rtn = 0; for(i = 0; i < psize; i++) { Rtn = Rtn + p{i]; } return Rtn; } こんな感じのをセルA1に「=SumTest(B1:B5,5)」にすると「#Value」と表示されています。 ↓デバックに使用したVBAのFunction Function Test(p As Variant, ByVal psize As Long) As Long Test = SumTest(p, psize) End Function 配列を引数に取らないものは、正常に呼べるので問題ないです。

  • エクセル VBAで関数を定義したけれどもうまくいかない

    以前ここで教えていただいた方法ですが、 セルB1からB100までのいずれかを変更した際に プロシージャが起動する方法として まず VBAで標準モジュールに 関数を定義して Function mykansu(dum As Range) for i=1 to 100 if cells(i,2)=1 then cells(i,6)="yes" next i End Function そしてexcelシートでセルA1に =mykansu(B1:B100) とやれば、B列の変更を加えたらプロシージャが起動する と教えていただきました。 しかし A1に #Value と出たきりでVBAのプロシージャが動かないのはなぜでしょうか。教えてください。

  • 配列を返すVBAユーザー定義関数の書き方

    VBAで、商と余りを返す整数割算のユーザー定義関数を書こうとしています。セルA1に割られる数、B1に割る数が書いてあり、C1とD1に「=xdiv("A1:B1")」をCtrl+Shift+Enterで入力します。C1に商、D1に余りを返すようにしたいと思ってます。 以下のように書いてみたのですが、戻り値の書き方がどうもよくわかりません… Function xdiv(ByRef d() As Integer) As Integer   ............. End Function よろしくお願いします。

  • エクセル 複数シート( VLOOKUP ユーザー定義関数

    複数シート(範囲)を指定できるVLOOKUP関数をユーザー定義で作りたいと思ってます。下記のコードではうまく動かないので教えてください。 Function VLOOKUPM(検索値 As Variant, 対象シート As String, 対象セル As Range, 列番号 As Integer) As Variant Dim i As Integer Dim r As Range Dim sh As Variant Application.Volatile sh = Split(対象シート, ",") For i = 0 To UBound(sh) Set r = Sheets(sh(i)).Range(対象セル) If 検索値 = r Then VLOOKUPM = r.Offset(0, 列番号) Exit Function End If Next End Function

  • Excelユーザー定義関数が書き込まれているセルアドレス

    Excelのユーザー定義関数で、自分自身が書き込まれているセルのアドレスって取得出来るのでしょうか? 例えば、 Function test(MyString As String) As String test = "入力された文字は、「" & MyString & "」です" End Function とユーザー定義関数を作り A1のセルに =test("てすと") と書くと 入力された文字は、「てすと」ですと出てきます。 そこで、ユーザー定義関数のなかで、ユーザー定義関数を呼び出した式が入力されている(上記の例ですと、「A1」)アドレスを取得する方法ってありますか? どなたか、詳しい方いらっしゃいましたら教えてください。