EXCEL VBAのユーザ定義関数について


Function Test関数(引数1,引数2…)
If 条件 Then
処理A
Else
   処理B
End If
End Function

このようなユーザ定義関数を作っています。
あるセルにこの関数を入れたときに、処理Aならセルの文字色を赤、処理Bなら青にするVBAの記述がわからないので教えてください。

回答の条件
  • 1人2回まで
  • 登録:2008/10/16 18:02:02
  • 終了:2008/10/19 02:04:19

ベストアンサー

id:takerudayo No.1

takerudayo回答回数165ベストアンサー獲得回数292008/10/16 18:55:18

ポイント500pt

セルの色を変更する処理は以下の通りですが・・・


ActiveCell.Interior.ColorIndex = 3 'カーソルが居るセルの色を変更

Range("A1").Interior.ColorIndex = 5 'セルの場所を指定して色を変更

Range("A1").Interior.Color = RGB(255,0,0) 'その他の色指定方法


「あるセルにこの関数を入れたときに」とありますが、

セルにユーザが作成した関数をセットして処理できないと思います。


もしどうしてもVBAだということであれば、

VBAはボタンを配置してそのクリックイベントから起動するか

ワークシートのopenイベントなどに書いて起動する必要があると思います。



条件によってセルの色を変えたいだけであれば、

簡単な条件に限られますが・・・「書式」メニュー内の「条件付書式」を

使われたほうが良いかと思います。

id:capsuleq

参考になるご回答ありがとうございます。

>セルにユーザが作成した関数をセットして処理できないと思います。

というのは、上に挙げられた3種類のセル色変更の処理の指定先セルに

ユーザ定義関数が入力されたセルをセットできない、ということですよね?


>簡単な条件に限られますが・・・「書式」メニュー内の「条件付書式」を

条件付書式で解決できないので、この質問になりました。

具体的には、Test関数の引数1,2…にはそれぞれセル指定を入ります。

引数にはいったセルの中身(文字列)によって条件が分岐し、

処理AかBの2パターンで置換、編集した新しい文字列が

Test関数の結果になります。

そのときに、処理A、Bどちらになったかを文字色に反映して

確認できるようにしたいです。

検索した範囲では、

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

http://okwave.jp/qa4323402.html

が、近いと思うのですが、うまく組み込めません。

2008/10/17 09:54:42

その他の回答(3件)

id:takerudayo No.1

takerudayo回答回数165ベストアンサー獲得回数292008/10/16 18:55:18ここでベストアンサー

ポイント500pt

セルの色を変更する処理は以下の通りですが・・・


ActiveCell.Interior.ColorIndex = 3 'カーソルが居るセルの色を変更

Range("A1").Interior.ColorIndex = 5 'セルの場所を指定して色を変更

Range("A1").Interior.Color = RGB(255,0,0) 'その他の色指定方法


「あるセルにこの関数を入れたときに」とありますが、

セルにユーザが作成した関数をセットして処理できないと思います。


もしどうしてもVBAだということであれば、

VBAはボタンを配置してそのクリックイベントから起動するか

ワークシートのopenイベントなどに書いて起動する必要があると思います。



条件によってセルの色を変えたいだけであれば、

簡単な条件に限られますが・・・「書式」メニュー内の「条件付書式」を

使われたほうが良いかと思います。

id:capsuleq

参考になるご回答ありがとうございます。

>セルにユーザが作成した関数をセットして処理できないと思います。

というのは、上に挙げられた3種類のセル色変更の処理の指定先セルに

ユーザ定義関数が入力されたセルをセットできない、ということですよね?


>簡単な条件に限られますが・・・「書式」メニュー内の「条件付書式」を

条件付書式で解決できないので、この質問になりました。

具体的には、Test関数の引数1,2…にはそれぞれセル指定を入ります。

引数にはいったセルの中身(文字列)によって条件が分岐し、

処理AかBの2パターンで置換、編集した新しい文字列が

Test関数の結果になります。

そのときに、処理A、Bどちらになったかを文字色に反映して

確認できるようにしたいです。

検索した範囲では、

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

http://okwave.jp/qa4323402.html

が、近いと思うのですが、うまく組み込めません。

2008/10/17 09:54:42
id:slapshock No.2

slapshock回答回数264ベストアンサー獲得回数152008/10/16 23:09:30

ポイント50pt

以下で、出来るかと思います。

Function Test関数(引数1,引数2…)

  If 条件 Then

'文字を赤色にする

    ActiveSheet.Cells(r, c).Font.ColorIndex = 3

  Else

'文字を青色にする

    ActiveSheet.Cells(r, c).Font.ColorIndex = 5

  End If

End Function

*r,cはCELLの座標を入れてください。

id:capsuleq

>*r,cはCELLの座標を入れてください。

この部分をどうしたらよいのかが、自分では解決できずに知りたかったところです。

ご存知だったらよろしくお願いします。

2008/10/17 09:27:23
id:van-dine No.3

van-dine回答回数108ベストアンサー獲得回数112008/10/16 23:34:20

ポイント50pt
Function Test
  If 条件 Then
    Range("~").Font.Color = vbRed 'Font.ColorIndex = 3でも可
  Else
    Range("~").Font.Color = vbBlue 'Font.ColorIndex = 5でも可
End Function
||<<
です。
あと、コードをすっきりさせたければ、VBAのIIf関数を使って、
>|vb|
Function TestUseIIf
  Range("~").Font.Color = IIf(条件, vbRed, vbBlue)
  'IIf関数:条件が真なら2番目、偽なら3番目の引数が返る
End If

としてみるのもいいでしょう。

id:capsuleq

2番の方とおなじで、

>Range("~").

この部分をどうしたらよいのかが、自分では解決できずに知りたかったところです。

ご存知だったらよろしくお願いします。

2008/10/17 09:28:15
id:yyok No.4

yyok回答回数59ベストアンサー獲得回数32008/10/17 19:48:37

ポイント250pt

気になって私もいろいろと試してみたのですが。

結論しては暫定的に事故解決された方法、ユーザー定義関数と

条件付き書式の組合せしかないようです。

例えば関数定義は

Function Test関数(引数1,引数2…) as Integer

のようにして、セルの式にこの関数を入力。

そのセルの条件付き書式で戻り値を判定して色を変える、

という仕組みです。

関数の呼出元はApplication.Callerで判定出来そうなので、

Application.Caller.Interior.ColorIndex = 色指定

が出来れば良かったのですが。

セルの式に指定するユーザー定義関数は、戻り値を返す以外

のことは出来なさそうです。

例えばそのセルの書式を変更したり、そのセルの値を他の

セルに設定したりといった、戻り値を返す以外の、いわゆる

関数の副作用をさせることは出来ないようです

(副作用させる関数を作って式に入れると、エラーになります)。

このあたりの制約についてHELPやMSDNを調べてみましたが、

見つけることはできませんでした。

id:capsuleq

ありがとうございます。

>セルの式に指定するユーザー定義関数は、戻り値を返す以外

>のことは出来なさそうです。

が結論ですね。

コメントで紹介いただいている

http://support.microsoft.com/kb/170787/ja

が、オフィシャルな情報になりそうです。

じぶんの書き方が間違っているだけなのかと思ってした質問ですが

勉強になりました。

2008/10/19 01:56:03
  • id:capsuleq
    暫定的に自己解決しました。

    あたらしく、同じ条件式で、処理Aのかわりに「A」、処理Bのかわりに「B」を
    戻り値にするユーザ定義関数を設定し、
    条件つき書式にいれる…という方法です。

    よりよい方法があればと思いますので
    ひきつづき回答を募集します。
  • id:takerudayo
    1に対する回答です。
     失礼しました一部勘違いしていました。
     capsuleqさんが行いたいことは以下と認識しました。
    <br>
     A1を条件1のデータを入力するセルとする
     B1を条件2のデータを入力するセルとする
     C1にユーザ定義関数「=test(A1,A2)」と設定
    <br>
    この状況で関数にセルを渡す方法としては
    Rangeを使うと良いかと思います。

    Function test(条件用変数 As String,色を変えるセルの場所 As Range)
    色を変えるセルの場所.~
    End Function

    参考資料「http://www.atmarkit.co.jp/fwin2k/win2ktips/514exrng/exrng.html」
  • id:SALINGER
    >takerudayoさん
    そのとおりにして、実際にできましたか?

    >capsuleqさん
    自己解決したとおり普通、そういう処理は条件付書式で行います。
    ユーザー定義関数では、呼び出し元を特定することは Application.Callerで可能です。
    でも、ユーザー定義関数からセルの文字色など、書式の変更はできないのです。
    残念ながら、回答に上がっていることはどれもできません。
    http://support.microsoft.com/kb/170787/ja
  • id:takerudayo
    >SALINGERさん
    補足ありがとうございます。
    セルのデータを扱うならRangeと回答してしまいましたが、
    たしかに書式変更はできませんでした。
    このような制限があるんですね・・・。
  • id:taknt
    私もいろいろ試したけど、ダメだったから 回答しなかったけど、
    よく回答が集まったもんだなと感心していたところです。

  • id:capsuleq
    >SALINGERさん

    ご紹介のURIが結論ですね。
    ありがとうございます。

    >takerudayoさん

    再度のご回答ありがとうございました。

    >takntさん

    いろいろ試行錯誤していただいたとのこと、ありがとうございます。


    結論が出ましたのでしめます。
    たくさんのご回答ご意見ありがとうございました。
    助かりました。
  • id:taknt
    わざわざポイント、ありがとうございました。

    呼び出されたセルの色を4のものにする場合、以下のようにしてみましたが
    Range(Application.Caller.Address(False, False, xlA1)).Interior.Color = 4
    エラーもなく色も変わらず終了してしまいました。

    ま、アドレスの取得の仕方などは、参考になると思いますので、参考にしてみてください。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません