• ベストアンサー

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) としてもダメでした) (「書式」→「セル」→「保護」→「ロック」はチェックされていません) すみませんが、よろしくお願い致します。

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

  • ベストアンサー
回答No.1

できないはずですが、次のようにすればできるそうです。(dummyは適当な文字列)(ウチのExcel2000ではこれでできましたが...) Sheet1.Hyperlinks.Add(Sheet1.Cells(2, 2), "dummy", , , "OK").Delete (もちろん推奨はしません)

参考URL:
http://tllsp.hp.infoseek.co.jp/howto/kowaza/kowaza.htm
clavia
質問者

お礼

ありがとうございました。 試してみたところできました。 リンクを張って、それを消すのですね。 ただし、重いですね。 数十箇所のレベルで、重さを体感します。 やはり、関数内から変えること自体を考えないといけないようですね。

その他の回答 (1)

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

エクセルVBAのFunctionプロセジュアの原則に反することをいたいと思っていると言う気がします。 エクセルのFunctionプロセジュアの中では、関数式を入れるセルに値を設定する他のこと、例えば他のセルに値を設定したり(本件)書式を設定したり、セル(行・列)を抹消したり、挿入追加したりは出来ないようである。値を返すことだけに特化して、それらはSubプロセジュアによって行いなさいという役割分担だと思う。本来原初的にはメモリはグローバルに値を設定取得出来るものであるが、CPUやOSや言語の仕組みでそれらをさせないようにすることが行われる。メリットが大きいからである。さてその原因とは(1)循環計算など収拾がつかなくなることを避ける(2)Subプロセジュアと役割分担(3)そう決めただけのこと(4)その他のどれか判らないが(2)が大きいと思う。 (1)イベントプロセジュアとして分ければ似たことは出きる。下記では特定の関数で変ったのでなくても反応するので不完全ですが。 Private Sub Worksheet_Change(ByVal Target As Range) Cells(2, 2) = "OK" End Sub (2)Functionプロセジュアの中でSubプロセジュアで置換えてもだめでした。 Function test1(a) 'Cells(2, 2) = "ok" 'test2 test1 = 2 End Function Sub test2() Cells(2, 2) = "ok" End Sub (3)変数を新たに使って値を設定し加工は可能 Function test1(a) 'Cells(2, 2) = "ok" 'test2 w = 2 test1 = w End Function VBAのFunctionプロセジュアは、VBのFunctionプロセジュアとは違いがあるようです。セル全体に亘ってその関数が使われているかのチェックと再計算が行われるなどが特殊性です。

clavia
質問者

お礼

ありがとうございました。 私も循環の問題でできないようにしているのかな、と思いました。 でも、セルに数式を入れるときに、循環参照のエラーは出ますよね?あのようなエラーは発生してくれれば、、、 また、試してはないのですが、 フラグを立てて、Worksheet_Change イベントによる処理もできないことはないような気がしました。

関連するQ&A

  • 関数が書かれているセル位置を知りたいのですが、、、

    実行環境は Excel 2000 新規ブックに、 標準モジュールを追加し、 Function Test()   Test = 2 End Function という関数を追加します。 Sheet1 の、 セル「A1」に「10」を入れます。 セル「A2」に「=Test() + A1」 セル「A1」を変更すると、 関数「Test()」が呼び出されます。 このとき、ActiveCell は「A1」を指しますが、 関数「Test()」の位置を知りたいのです。 「No.720361 質問:Excel VBA でFunctionプロシジャがどのセルから呼び出されたか知る方法」では Application.Caller で出来ているようですが、Test() 内で「TypeName(Application.Caller)」とすると、「Double」や「Error」が返ってきます。 (この「Double」の値も気になりますが、、、) 位置の取得方法を教えて下さい、よろしくお願いします。

  • エクセルVBAで他のbookのセルcellsで参照

    エクセルVBAで他のbookのセルの値(一定の範囲)を参照したいのですが、変数を使いたいため、cellsを使用したいのですがうまくいきません。方法はないでしょうか。 下記に例を示します。 rangeを使用すればすべてok((2)(5))(この場合はset文を使用しなくてもok(5))。同じbookならcells使用ok(4)。 他のbookをcells文使用する方法はないでしょうか(もちろんできれば、Thisbookの方もcellsを使用したい)。 よろしくお願いします。 sub test() Dim ThisBook As Workbook Dim Workbook2 As Workbook 'マクロを実行しているワークブック Set ThisBook = ThisWorkbook '他のワークブック Set Workbook2 = Workbooks("test11.xlsx") ' 'ThisBook.Worksheets(1).Range("A1:B2").Value = Workbook2.Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value  '(1)だめ 'ThisBook.Worksheets(1).Range("A1:B2").Value = Workbook2.Worksheets(1).Range("a1:b2").Value '(2) OK 'Workbooks("test1.xlsm").Worksheets(1).Range("A1:B2").Value = Workbooks("test11.xlsx").Worksheets(1).Range(Cells(1, 1), Cells(2, 2)).Value '(3) だめ 'Workbooks("test1.xlsm").Worksheets(1).Range("A1:B2").Value = Workbooks("test1.xlsm").Worksheets(1).Range(Cells(3, 3), Cells(4, 4)).Value  '(4)だめ 'Workbooks("test1.xlsm").Worksheets(1).Range("A1:ii8000").Value = Workbooks("test11.xlsx").Worksheets(1).Range("a1:ii8000").Value  '(5) ok End Sub

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

  • セルから呼び出したプロシージャ内でセルの塗りつぶし

    初めて質問させていただきます 宜しくお願い致します セルから呼び出したプロシージャ内からセルの塗りつぶしを 実行しても塗りつぶしが有効になりません たとえば A1のセルに10を入力 B1のセルに=TEST(A1) と入力 マクロのモジュール内に Public Function TEST(tmp_No As Integer) As Integer TEST = tmp_No * 25 '(1)ここから If TEST = 250 Then    'Msgbox "チェック用MSG"    Cells(1, 1).Interior.ColorIndex = 38 End If '(2)ここまで End Function というファンクションプロシージャがあるとします 引数で10を持って行ってるので10×25で TESTが250になりB1には計算結果として 250と問題なく表示されています しかし (1)~(2)のセルの塗りつぶしは実行されません 仮にチェック用のメッセージボックスのコメント を外すとキチンとメッセージボックスは 表示されます また、塗りつぶしダケのマクロを作成し Public Sub cell_paint()    Cells(1, 1).Interior.ColorIndex = 38 End Sub 実行すると、これも問題なく動作しますので EXCELの設定ではないと判断しています セルから呼び出したプロシージャの時 だけ、動作しないようなのですが なぜでしょうか? 他の方法で回避可能でしょうか? ※実際には塗りつぶしの判定方法が  20個あり、条件付書式では対応出来ないので  マクロで処理を試みてます 宜しくお願い致します

  • 自作関数からのセル操作

    お世話になります。 ExcelVBAで以下のような自作の関数を作成し、実行するとA1に”hoge”が入力されます。 <自作関数> function hoge() thisworkbook.worksheets("sheet1").range("A1").value = "hoge" end function しかし、ワークシート上のセル”A2”に「=hoge()」と入力してEnterとするとエラーになってA1には何も入力されません。 VBAで作った関数をワークシート上で関数として使う場合、任意のセルのプロパティを変更することはできないのでしょうか? よろしくお願いします。

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

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

  • Excel:自作のセル関数でエラーが発生

    Win2K、Excel97-2000-2002を使用しております。 以下のような関数を作成しました。 Public Function sss() As Boolean  On Error GoTo aaa   Range("A1").Value = "TEST"  sss = True Exit Function aaa:  MsgBox Err.Description  sss = False End Function これをSheet1のB1セルで呼びましたところ、 Rangeへのセットのところで以下のようなエラーが発生します。 「アプリケーション定義またはオブジェクト定義のエラーです。」 同関数をイミディエイトウインドウで実行しましたところ、正常に動きます。 セルの内容を変更するようなメソッドをセル関数として呼ぶことはしてはいけないのでしょうか。 御教授、御鞭撻の程、よろしくお願いいたします。

  • excelのファイルとセル値を書き出したい

    excel2003を利用しています。 とあるフォルダにある excelファイル名(自分自身のファイルを除く) を全て書き出して、 且つ A1セルの値をB列に書き出すことを、やろうとvbaを作ってみましたが。 最後のファイルのA1セルを書きだすところで、エラーになっていまい そこだけ空白になってしまいます。※写真参照 記述は以下の通りです。どのように修正すればよいか 教えていただけないでしょうか? また他にもっと優れた記述があれば、そちらも教えて欲しいです。 よろしくお願いします。 Sub test() Dim buf As String, cnt As Long Dim Path As String Path = ThisWorkbook.Path & "\" buf = Dir(Path & "*.xls") cnt = 2 Do While buf <> "" If buf <> ThisWorkbook.Name Then cnt = cnt + 1 Cells(cnt, 1) = buf buf = Dir() Workbooks.Open Filename:=Path & "\" & buf MsgBox Workbooks(buf).Worksheets(1).Range("A1").Value Cells(cnt, 2) = Workbooks(buf).Worksheets(1).Range("A1").Value Workbooks(buf).Close End If Loop End Sub

  • ユーザー定義関数で、選んだセルの下のセルの参照方法

    簡単なユーザー定義関数を作っています。 Function TEST(氏名) TEST = End Function 氏名のセルを選んで、その下のセルの値を参照したいのですが、どのようにしたら良いのでしょうか? OFFSET関数を使いたくも、選んだ氏名のセルをどう使うのかわかりません。 宜しくお願いします。

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

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

専門家に質問してみよう