セルに貼り付けた自作関数での書式反映について

このQ&Aのポイント
  • VBで作成した関数で、日付に応じて曜日を返す処理を行っています。しかし、日曜日の場合に文字色を赤にする処理が反映されません。
  • 質問者は、Excelのセルに関数を貼り付けると曜日は正しく返ってくるが、日曜日の場合の赤色が反映されない問題に遭遇しています。
  • 質問者は、この問題に関してアドバイスを求めており、解決策を提案してもらいたいと思っています。
回答を見る
  • ベストアンサー

セルに貼り付けた自作関数での書式反映について

引数で日付を渡し、漢字の曜日一文字が返る関数をVBAで作成しました。 どうせなら日曜日の場合は文字の色を赤色にしようと思い、日曜日の場合だけ文字色を赤にする一文を追加しました。 が、セルにこの関数を貼り付けると曜日は返ってくるのですが、日曜日の場合の赤色が反映されません。 どなたかご教授いただければ嬉しいのですが、、、 宜しくお願い致します! OS:WindowsXP Excel:OfficeXP です。 以下に作成したマクロ関数を貼り付けます。 ********************************************************* Public Function week(d) As String  On Error GoTo err_week  Select Case Weekday(d)  Case vbSunday   week = "日"   Worksheets(Application.Caller.Worksheet.Name).Cells(Application.Caller.Row, Application.Caller.Column).Font.ColorIndex = 3  Case vbMonday   week = "月"  Case vbTuesday   week = "火"  Case vbWednesday   week = "水"  Case vbThursday   week = "木"  Case vbFriday   week = "金"  Case vbSaturday   week = "土"  Case Else   week = "×"  End Select Exit Function   err_week:  week = "ER"  Exit Sub 'End End Function *********************************************************

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

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.2

マクロと違い、ユーザー定義関数には制限があります。 http://support.microsoft.com/kb/170787/ja -----引用----- ワークシートのセル内の数式から呼び出されるユーザー定義関数では、Microsoft Excel の環境を変更できません。つまり、このような関数では次の処理が実行できません。 ・スプレッドシートでのセルの挿入、削除、または書式の設定。 ・別のセルの値の変更。 ・ブックでのシートの移動、名前の変更、削除、または追加。 ・計算方法や画面表示など、環境オプションの変更。 ・ブックへの名前の追加。 ・プロパティの設定およびほとんどのメソッドの実行。 -----引用----- 書式の変更は出来ないのでは? 今回の件は、条件付書式で代用出来ると思います。

nnnnnon
質問者

補足

どうもありがとうございます。 書式変更は無理って事ですね、、、 FormatConditionsを使えばって事でしょうか?

その他の回答 (4)

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

エクセルのFunction(ユーザー関数)は値を返すことができるだけで 書式を変更したり、行・列の削除挿入等全てができません。 今までユーザー関数を作って使った経験が無いから不思議に思うだけで、経験者には自明のことです。 そういうもんだと知ってください。 一般の他の言語の関数と違いがあります。 通常のワークシートの関数も書式や行列・挿入他できないのですが、このことを知らない初心者が、どうしたらよいかという質問をこのコーナーでしばしば見かけます。この関数の制約と軌を一にします。 SUBプロシージュアーは改めて(起動をかけないと)実行しないと処理結果が代わり・出ません。通常のエクセル関数はデータの変化に対してその点自動反映をします(注)が、この点不便ですが、イベントプロシジュアーででも賄わないと他に方法はないでしょう。 (注)その代わりワークシートで全使用関数の計算しなおしをやっている(という犠牲を払っている)ようです。関数使用のセルが増えると 処理速度への影響が無視できません。

nnnnnon
質問者

補足

>エクセルのFunction(ユーザー関数)は値を返すことができるだけで >書式を変更したり、行・列の削除挿入等全てができません。 この文言だけだと誤解を生むと思いますので、、 セルに貼り付けずに直接マクロ(Function)を実行するなら書式設定も行や列の挿入や削除は出来ますが、、、、、 関数をセルに貼り付ける使い方は普段はしていなかったのですが、貼り付けると普通に出来ていたことが出来なかったのでどうしてかなっ? と言う疑問になった次第です。 上のほうで教えていただいたMSのHPも実は見ていたのですが、できる筈だとの思い込み、どうすればできるかと言う視点で探していたものですからよく読んでいなかったと言う次第ですが、あらためて教えていただき、よく読んだら出来ないと書いてありました。  

回答No.4

呼び出す時にcell情報も渡してしまうのはどうでしょうか? Public Function week(d As Date, row As Long, column As Integer) As String ... Case vbSunday week = "日" ActiveSheet.Cells(row, column).Font.ColorIndex = 3 ... End Function にして、 =week(A1,ROW(),COLUMN()) で呼び出す。 または、 Public Function week(d As Date, row As Long, column As Integer, filename As String) As String ... Case vbSunday week = "日" Sheets(Mid(filename, InStrRev(filename, "]") + 1)).Cells(row, column).Font.ColorIndex = 3 ... End Function にして、 =week(A1,ROW(),COLUMN(),CELL("filename")) で呼び出す。

nnnnnon
質問者

補足

コメントありがとうございます。 実験はしていませんが http://support.microsoft.com/kb/170787/ja を読む限りは意図した使い方は出来ないかと、、、、 セルに貼り付けるときにrowとcolumnを引数で渡すと言うのも意図した 使い方とはちょっと違います、、、  

  • venzou
  • ベストアンサー率71% (311/435)
回答No.3

>書式変更は無理って事ですね、、、 リンク先のマイクロソフトの情報を信じれば、 そういう事になると思います。 >FormatConditionsを使えばって事でしょうか? VBAからではなく、普通のエクセルのメニューから、 「書式」→「条件付き書式」と言う意味で書きました。 自作関数が入力されているセルに、条件付き書式で、   セルの値が   次の値に等しい   ="日" として、書式を設定します。

nnnnnon
質問者

補足

  FormatConditionsを使って下記の様にしてみましたが撃沈しました、 --------------------------------------------------------    :  Dim r, c    :    :  Case vbSunday   r = Application.Caller.Row   c = Application.Caller.Column   week = "日"   Cells(r, c).FormatConditions.Delete   Cells(r, c).FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _    Formula1:="日"   Cells(r, c).FormatConditions(1).Font.ColorIndex = 3 -------------------------------------------------------- 言われるように普通に予めセルに設定しておくと言う事にしようと思います。 ご教授、ありがとうございました! <(_ _)>  

  • pbforce
  • ベストアンサー率22% (379/1719)
回答No.1

セルの指定方法が違いそうです。

nnnnnon
質問者

補足

Cells(Application.Caller.Row, Application.Caller.Column)の部分は 間違いなく呼び出し元のセルになっており、曜日もキッチリ返っているんですが、、、、、 rowとcolumnについては内容を確認して間違っていませんでした、、 R16C8に貼り付けたとき  Application.Caller.Rowは16に、  Application.Caller.Columnは8になっています

関連する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」の値も気になりますが、、、) 位置の取得方法を教えて下さい、よろしくお願いします。

  • 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 自作関数から特定のセルを参照して分岐

    以下のように、C列を参照して判断し、それに適した値を表示させる関数を作っています。 質問1:以下、どこが間違ってますでしょうか? 質問2:以下では、Columns(3)として参照していますが、列に名前を付けておき、それを関数から参照させることはできますでしょうか? Function test()  Select Case Worksheets("Sheet1").Columns(3).Value   Case "りんご"    test = "100円"   Case "みかん"    test = "150円"   Case "いちご"    test = "300円"   Case "すいか2"    test = "200円"  End Select End Function

  • 条件付書式でも色が変わらない

    カレンダー表示の「SUN」日曜日の所を赤く表示しようと思い 条件付書式でセルの値が次の値に等しいにして「SUN」 色を赤としたのですが色が変わりません 曜日表示はDATE関数で月を変えると自動で変わるようにしています ちなみに関数を使わないで表示すると色が変わります。 よろしくお願いします。

  • 自作関数から WndProc( ) を止める

    自作関数から WndProc( ) を止めるにはどうしたらいいんですか? LRESULT CALLBACK WndProc(…){  switch(msg){  case WM_COMMAND:   if(function f( ) == "END")return 0;   処理A;  break;  } } function f( ){  return "END" } こんな流れにしたいけど、WndProc( ) 内からでなく、 外から WndProc( ) を止めたいんです。 LRESULT CALLBACK WndProc(…){  switch(msg){  case WM_COMMAND:   function f( );   処理A;  break;  } } function f( ){  ? // WndProc( ) に return 0 とさせて 処理A を実行させない }

  • エクセルで、日曜日の表示を赤とする方法

    エクセル2002を使用しています。 縦行に年月日と曜日を表示させていますが 日曜日毎だけを赤文字にしたいのですが 自動的(数式でも可)で曜日を赤文字表示にするにはどうしたら よいでしょうか いままでは1週間分の日にちと曜日を縦に作り 日曜日を書式メニューのフォント欄で赤文字してする。 それをオートフィルを利用して転写(?)していました。 現在は年、月、日と別々の行を使用しているため オートフィルが旨くいかないケースが目立ち今回の疑問に遭遇しています。 IF関数でも結構ですし、数式があれば一番よいのですが 書式の関数などあるのか?とも思っています。 よろしくお願いします

  • EXCEL関数でメモ帳作成

    EXCEL関数初心者です。 添付ファイルのような月ごとのメモ帳を作成しています。 最初に見やすいように一行おきに緑色で塗りつぶしをしました。 土日に青、赤の色分けを条件付き書式で「=TEXT(B3,"aaa")="日”」 の関数で日曜日には赤、土曜日には青に塗りつぶしました。 他の曜日の最初の緑色が消えています。 緑色が消えないようにするにはどうしたらいいですか。

  • WEEKDAY関数と条件付き書式について

    EXCEL2010使用です。 B列に日付、C列に曜日の表を作成する場合、 WEEKDAY関数を使って 日付に対応する曜日を求めるのに、 例として曜日先頭セルがB4、種類を日曜日スタートに設定する場合、 「C4」セルに=WEEKDAY(B4,1)の関数を挿入、下方向にコピーします。 その後、日曜日の日付と曜日だけフォントの色を変更するため、 条件付き書式の「数式を使用して、書式設定するセルを決定」で、 数式を入力する場合、=WEEKDAY($B4)=1と入力しますが、 =WEEKDAY(B4,1)の「B4」と、=WEEKDAY($B4)=1の「$B4」の意味は分かるのですが、 なぜ「$B4」にしなければいけないのか?(この場合「B4」でも結果は同じです) どなたか教えてください。お願いします。

  • エクセル関数で教えてもらいたいです。会社のあるスケ

    エクセル関数で教えてもらいたいです。会社のあるスケジュール表をみたんですが、写真のようなweekdayという関数を使ってます。 これは私が書かれていたのを再現したものですが、日付が書かれているB列をC列でweekdayで読みにいって、数字じゃなく曜日を出していました。 しかも、土曜日は青色、日曜日と祝日は赤色になるようになんかしています。5列に対し色の反転を起こしてます。 マクロは使ってないと思います。 これどんなアルゴリズムでやってるんですか?

  • MS関数について

    MS()という関数をAccess97で作成しました。 Public Function MS(t) As String Select Case t Case "0" MS = "A" Case "1" MS = "B" Case Else MS = "" End Select End Function Access97からAccess2000への変換を行ったのですが、上記関数ではA,B,空文字を返さず、メッセージボックスで引数tを表示してしまいます。 OSはWinXP Proです。 まるで、msgbox()みたいな動きです。 色々調べましたが、MS()は予約されている訳ではないみたいでした。 調べ方が甘いのかもしれませんが、MS()関数について情報をお持ちの方、教えてください。

専門家に質問してみよう