エクセルVBAで関数を定義しているがうまくいかない

このQ&Aのポイント
  • エクセルでVBAを使用して、セルの変更時に関数が起動するようにする方法について学んだが、うまくいかない。
  • VBAの関数を標準モジュールに定義し、セルA1に関数を入力したが、#Valueと表示されて関数が動作しない。
  • なぜVBAの関数が動作せず、#Valueが表示されるのか教えてください。
回答を見る
  • ベストアンサー

エクセル 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のプロシージャが動かないのはなぜでしょうか。教えてください。

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

エクセルの関数は値を返すのに、(具体的には関数名に計算結果を 返す) 関数名であるmykansuについて mykansu= がないのはどうしたことですか。 どうもSubプロシージュアー的なことを考えていて、他言語の関数 (サブルーチン)とごっちゃになってませんか。 エクセルユーザー関数の値は(通常基本は)1つです。 処理(複数セルに対しcells(i,6)="yes)のようなことはできません。 エクセルの!、(本かWEBの)ユーザー定義関数の解説部分を読んでください。

yamutya
質問者

お礼

ご指摘ありがとうございました。 確かに関数定義としては変ですね。 裏技的な方法で成立するのかと トライしてみましたが 見当違いだったようです。 やはり worksheet_changeで 実行するのが正当なのですね。

関連するQ&A

  • EXCEL VBAのRangeプロパティについて

    EXCEL VBAのRangeプロパティについて 下の2つのプログラムで表示されるメッセージは、 プロシージャAは"$B$1" プロシージャBは"$A$1" なのですが、Rangeプロパティはどういう使われ方をしているのでしょうか? お教えくださいませ。 ・プロシージャA Sub test1() Cells(1, 2).Activate MsgBox ActiveCell.Range("A1").Address End Sub ・プロシージャB Sub test2() Cells(1, 2).Activate MsgBox ActiveSheet.Range("A1").Address End Sub

  • エクセル2000のVBAのcutメゾット

    エクセル2000でセルを他のセルの文字から検索し検索されたセルを特定の場所にコピーし貼り付けるのを空欄になるまで繰り返すVBAを作りました。 Dim a As Range Dim b As Long b = 1 Do Until Cells(2 + b, 5).Value = "" Cells(2 + b, 5).Select Set a = Range("B:B").Find(what:=Cells(2 + b, 5).Value) a.Select Selection.Copy Cells(2 + b, 8).PasteSpecial xlAll Cells(2 + b, 5).Select b = b + 1 Loop なんですが、これだとちゃんと起動するのに「copy」を「cut」に変更したら、「pastespecial」でデバックが発生し止まってしまいます。 どちらかというと、コピーより切り取りして貼り付けたい(んで、残ったセルを検索しメッセージボックスで表示出せたい)のですが、このVBAだとcutメゾットは使えないのでしょうか? また使えるのならば「pastespecial」でなければ、何を使って貼り付ければよいのでしょうか?

  • Excel : 関数内からセルを更新したい

    実行環境は Excel 2000 です。 新規ブックに、 標準モジュールを追加し、 Function Test()   Cells(2, 2) = "OK"   Test = 2 End Function という関数を追加します。 Sheet1 の、 セル「A1」に「10」を入れます。 セル「A2」に「=Test() + A1」 セル「A1」を変更すると、 関数「Test()」が呼び出されます。 このとき、コードのように、B2 のセルに「OK」を 表示させたいのですが、 「アプリケーション定義またはオブジェクト定義のエラーです。(1004)」 のエラーが発生してできません。 マクロやボタンなどのイベントプロシージャでは可能なのですが、上記のようにセルに組み込んだ関数が、 更新により実行された場合はできないのでしょうか? (Cells の指定を Workbooks(1).Worksheets(1).Cells(2, 2) としてもダメでした) (「書式」→「セル」→「保護」→「ロック」はチェックされていません) すみませんが、よろしくお願い致します。

  • excel vbaについてです

    VBA初心者で、暇な時にいろいろためしています。 以下のマクロを組んだのですが、エラーがでてうまくいきません。 どこがいけないのかご指摘願います。 Sub ather() Dim A As Range Dim B As Range Dim i As Integer With ThisWorkbook.Worksheets("Sheet1") For i = 1 To 30 Set A = Cells(i, 1) Set B = Cells(1, i) If Not .Range(A).Interior.ColorIndex = vbYellow Then GoTo port10 If Not .Range(B).Interior.ColorIndex = vbRed Then GoTo port10 .Range(B).Offset(, 1).Value = "○" port10: Next i End With End Sub イメージとしてはセルの塗りつぶしが黄色で、かつ右隣のセルの塗りつぶしが赤の時に、 赤色セルの右隣のセルに○を表示させようとしているのですが。。。 こうしたらいいんじゃない?といったアドバイスもお願いします(-人-)

  • エクセルVBAでセル選択するコードが変

    エクセルのワークシートでVBAでセル選択するコードで理解に苦しむことがあります。 通常、Cells(2, 1)はセル番地で言えばA2セル Cells(4, 1)はセル番地で言えばA4セルです。 しかし、 With .Range("B5:B15")でくくれば  .Cells(2, 1)はセル番地で言えばB6セルだと思います。 .Cells(4, 1) はセル番地で言えばB8セルだと思います。 ところが下記のコードを動かすと、なぜかC10:C12が選択されてしまいます。 この理屈がわかりません。 Sub test02()   With Sheets("Sheet1")     With .Range("B5:B15")       .Range(.Cells(2, 1), .Cells(4, 1)).Select     End With   End With End Sub なお、 .Range(.Cells(2, 1), .Cells(4, 1)).Selectを .Range(“A2:A4”).Selectに書きかえると、希望のB6:B8が選択されます。

  • VBAに関する種々の質問

    VBAに関していくつか質問させて下さい。 ・ファンクションプロシージャでは Function Fun(x) ・・・ End Function という形で関数を定義しますが、この関数の中でこれとは別の関数を定義して使いたい場合にはどうすれば良いのでしょうか? Function Fun(x) ・・・ Function Fun2(x) ・・・ End Function ・・・ End Function みたいに入れ子状にすれば良いのでしょうか? ・Range()を使って、 Range(A1)*Range(A2)+Range(B1)*Range(B2)+・・・ ということは出来ないのでしょうか?こういうのはCellsを使うしかないのでしょうか? ・Int()で整数であるということ定義出来ますが、浮動小数点であるdouble()というのが効かないのはなぜなのでしょうか? Dim as doubleだと効くのですが。 何卒よろしくお願い致します。

  • VBAの変数の定義について

    いつもお世話になっております。 VBAでの変数の定義についてお尋ねします。 VBAの勉強を始めたばかりの超初心者です。 I.チェック:A列とC列の和をE列に記載してその正誤を判定。 II.リセット:E列をクリアし、A列、C列の数字をランダムに置き換える。 という練習問題のコードを私が書いたものです。 以下について質問させていただきます。 (1)下記はモジュールレベルでの変数の宣言になると思いますが、変数の定義?例えば、最終値 = Range("A4").End(xlDown).Rowはそれぞれのプロシージャで定義しなければならないのでしょうか? (2)モジュールレベルでの変数の宣言は,Dimではなく、Privateでやるべきなのでしょうか? (3)何か指摘事項があれば、教えてください。 超初歩的な質問で、申し訳ありませんが、よろしくお願いいたします。 Option Explicit Dim i As Integer '処理用カウンタ変数 Const 初期値 As Integer = 4 '表の最初 行 Dim 最終値 As Integer '表の最終 行 Sub チェック() 最終値 = Range("A4").End(xlDown).Row '表の最終行番号を取得 For i = 初期値 To 最終値 Step 1 If Cells(i, 1).Value + Cells(i, 3).Value = Cells(i, 5).Value Then 'A列+B列 Cells(i, 5).Font.Color = vbBlue '回答が正ならフォントを青 Else Cells(i, 5).Font.Color = vbRed '回答が誤ならフォントを赤 End If Next i End Sub Sub リセット() 最終値 = Range("A4").End(xlDown).Row '表の最終行番号を取得 For i = 初期値 To 最終値 Step 1 Cells(i, 5).ClearContents '回答をクリア Cells(i, 5).Font.Color = vbBlack '回答のフォントを黒 Cells(i, 1).Value = Int(Rnd * 100) 'A列にランダムな数値 Cells(i, 3).Value = Int(Rnd * 100) 'C列にランダムな数値 Next i End Sub

  • Excel VBA 選択した範囲の1行目に色を付けたい

    VBA初心者です。 セルB4~F15に表が作成されています。 プロシージャを実行して、セルB5~F15にブルー。表1行目のセルB4とF4のみに赤の色を付けるというコードを記述したいのです。 以下のように記述しました。 Sub セルに色()    Range("B4").Select    ActiveCell.CurrentRegion.Select    Selection.Interior.ColorIndex = 8    Selection.Range(Cells(1, 1),Cells(1,5)).Interior.ColorIndex = 3 End Sub Rangeでは連続シートになるため、Unionに変更してみましたが、 Unionはオブジェクトがサポートされていない旨のエラーが出ました。 どのように記述すればよいでしょうか? どうぞよろしくお願いいたします。

  • Excel VBA TREND関数について

    VBAにて6次近似の計算をするためのプログラムを組んでいるのですが【コンパイルエラー:不正な文字です】 と言われてしまいます。 6次近似の計算式の記載方法を教えて下さい。 よろしくお願い致します。 尚、現状は以下の通りです。 ============================== Dim i As Long Dim deg As Double Cells(i, 10).Value =Application.WorksheetFunction.Trend(Range(Cells(i, 1),Cells(i + 5, 1)), Range(Cells(i, 8), Cells(i + 5, 8)))^{1,2,3,4,5,6}, deg^{1,2,3,4,5,6}, 1) ===============================

  • エクセルのユーザー定義関数で(VBA)

    エクセルのVBAで、セルに「=SheetName」と書き込めば、その関数を書き込んだセルが属するシート名をセルに代入さるようなユーザー定義関数を作りたいと考えています。 で、標準モジュールに Public Function SheetName(test) SheetName = ????? End Function と、書き込んでふと止まりました。 ユーザー定義関数を書き込んだシートの名前ってどうやって取得すればいいのでしょうか?VBでいうSenderみたいなのってあるんでしょうか? どなたか?詳しい方教えて頂けないでしょうか? 宜しくお願いいたします。

専門家に質問してみよう