Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


386 / 13645 ツリー ←次へ | 前へ→

【80680】ユーザー関数からセルの背景色の変更 いびき 19/4/3(水) 17:54 質問[未読]
【80681】Re:ユーザー関数からセルの背景色の変更 γ 19/4/3(水) 18:38 回答[未読]
【80683】Re:ユーザー関数からセルの背景色の変更 γ 19/4/4(木) 6:21 回答[未読]
【80687】Re:ユーザー関数からセルの背景色の変更 γ 19/4/8(月) 22:07 質問[未読]
【80682】Re:ユーザー関数からセルの背景色の変更 マナ 19/4/3(水) 20:23 発言[未読]
【80684】Re:ユーザー関数からセルの背景色の変更 よろずや 19/4/4(木) 13:03 回答[未読]
【80691】Re:ユーザー関数からセルの背景色の変更 よろずや 19/4/10(水) 16:21 回答[未読]

【80680】ユーザー関数からセルの背景色の変更
質問  いびき  - 19/4/3(水) 17:54 -

引用なし
パスワード
   ユーザー定義関数を作成しています。
当該の関数を実行しているセルの背景色を変更しようとすると関数の実行が停止し、セルには「#VALUE!」が表示されます。

Application.ThisCell.Interior.Color = RGB(0,255,0)

ウォッチから上記オブジェクトへ変更を行うと
実行時エラー'1004':
が表示されます。

Application.ThisCell.Font.Color
の変更は可能です。

変更方法の判る方がいらっしゃいましたらご教授いただけないでしょうか。
よろしくお願いします。

【80681】Re:ユーザー関数からセルの背景色の変更
回答  γ  - 19/4/3(水) 18:38 -

引用なし
パスワード
   ユーザー定義関数で書式を変更することは
仕様上できません。
マクロを使って一括操作するなどの方法を
取ってください。

【80682】Re:ユーザー関数からセルの背景色の変更
発言  マナ  - 19/4/3(水) 20:23 -

引用なし
パスワード
   ▼いびき さん:

どのような関数なのか、具体的に説明できますか。
試してみたコードでもよいです。

Changeイベントとか、条件付き書式では、できないのでしょうか。

【80683】Re:ユーザー関数からセルの背景色の変更
回答  γ  - 19/4/4(木) 6:21 -

引用なし
パスワード
   補足です。
あ、そうですね、条件付き書式の利用が良いでしょうね。
・単に、Rangeを引数に、Boolean値を返すユーザー関数を作成しておいて、
・その関数を使った式を条件付き書式の「ルール」で指定し、
・書式(塗りつぶし)部分は条件式書式に委ねる
ことで、万事目出度しということになるでしょう。

既に指摘いただいているように、
上記で不明なら、現在のユーザー定義関数を提示してもらえば回答可能ですね、

ちなみに、書式変更ができない仕様という点に関しては、
下記のMicrosoft社の作成記事を参照のこと。
「Excel のユーザー定義関数の制限について」
ht tps://support.microsoft.com/ja-jp/help/170787/description-of-limitations-of-custom-functions-in-excel
関数型プログラミング言語としてのExcelユーザー関数は、値を返すことが本務であって、
書式などはいわゆる「環境」に属すものであり、それを変更することは「副作用」とみなされるので、
言語仕様としてできないことになっているものと思います。
この制約はExcelのVersionには依存しない原則的なものだと思います。

【80684】Re:ユーザー関数からセルの背景色の変更
回答  よろずや  - 19/4/4(木) 13:03 -

引用なし
パスワード
   ' ThisWorkbookモジュール
Option Explicit

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
  Call test(Sh)
End Sub

' 標準モジュール
Option Explicit
Dim Dic1 As Object ' Scripting.Dictionary

Function CellColor(Value, ColorIndex)
  CellColor = Value
  If Dic1 Is Nothing Then
    Set Dic1 = CreateObject("Scripting.Dictionary")
  End If
  If Dic1.Exists(Application.Caller.Address(External:=True)) Then
    Dic1.Item(Application.Caller.Address(External:=True)) = ColorIndex
  Else
    Dic1.Add Application.Caller.Address(External:=True), ColorIndex
  End If
End Function

Sub test(Sh) 'マクロ一覧に出さないために引数を付加
Dim Address As Variant
  For Each Address In Dic1.Keys
    Range(Address).Interior.ColorIndex = Dic1.Item(Address)
    Dic1.Remove Address
  Next Address
End Sub

【80687】Re:ユーザー関数からセルの背景色の変更
質問  γ  - 19/4/8(月) 22:07 -

引用なし
パスワード
   いびき さんだけに、まだ眠っているのでしょうか。
起きていたら、返事くらいしてくださいな。

【80691】Re:ユーザー関数からセルの背景色の変更
回答  よろずや  - 19/4/10(水) 16:21 -

引用なし
パスワード
   ' ThisWorkbookモジュール
Option Explicit

Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
  Call test2(Sh)
End Sub

' 標準モジュール
Option Explicit
Dim Dic1 As Object ' Scripting.Dictionary

Function InteriorColor(Value)
  InteriorColor = Value
  test1 Array("Interior.Color", RGB(0, 255, 0))
End Function

Sub test1(arg)
  If Dic1 Is Nothing Then
    Set Dic1 = CreateObject("Scripting.Dictionary")
  End If
  If Dic1.Exists(Application.ThisCell.Address(External:=True)) Then
    Dic1.Item(Application.ThisCell.Address(External:=True)) = arg
  Else
    Dic1.Add Application.ThisCell.Address(External:=True), arg
  End If
End Sub

Sub test2(Sh) 'マクロ一覧に出さないために引数を付加
Dim Address As Variant
  For Each Address In Dic1.Keys
    Select Case Dic1.Item(Address)(0)
      Case "Interior.Color"
        Range(Address).Interior.Color = Dic1.Item(Address)(1)
    End Select
    Dic1.Remove Address
  Next Address
End Sub

これで、当該の関数を実行しているセルの背景色を変更できます。

いびきかいてないで返事してよね。

386 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free