Excelにユーザー定義関数があります。スプレッドシートのセルから数式関数として呼び出され、正常に機能します。
返される値に応じてセルの色を変更できるようにしたいと思います。基本的に、セルの色を変更することは機能の副作用です。
私は試した
Application.ThisCell.Interior.ColorIndex = 2
しかし、それは失敗します。
これは、VBA UDFが条件付き書式を使用するのではなく、シートの内容の色を変更する方法のデモンストレーションです。
両方のシートに同じ順序で並べ替えられた行と列がある限り、これは2つの別々のExcelシート間のすべてのセルの違いを比較します。
これを3番目のシートの必要な数のセルに追加して、次のデータを含む2つのシートの同じ2つのセル間の違いを検出できます。=DifferenceTest(Sheet1!A1,Sheet2!A1)
そして、次のようにVBAエディタに保存される関数:
Function DifferenceTest(str1 As String, str2 As String) As String
If str1 = str2 Then
Application.Caller.Font.ColorIndex = 2
Else
Application.Caller.Font.ColorIndex = 3
DifferenceTest = str1 & " vs " & str2
End If
End Function
これはできません。ユーザー定義関数は、ワークブック/ワークシートなどの状態を変更できません。
条件付き書式を使用して、目的を達成します。
編集:これは実際の答えではなく、提案のようなものです。
いいえ、Function()を使用してセルの色を変更することはできません。ただし、Sub()ルーチンで変更することはできます。
実行したいセルで関数を実行するSub()を作成し、各セルを実行した後、Ifステートメントを入力して、返される値に基づいて色を付けるかどうかを確認します。
シートに変更が加えられた後に自動的に実行されるvbaコードを作成できます。別のモジュールにコードを含める代わりに、シート自体にコードを埋め込む必要があります。
シートタブを右クリックし、[コードの表示]を選択して、次のコードを作成します。
Private Sub Worksheet_Change(ByVal Target As Range)
For Each cell In Range("A1:B8") 'change cell range as needed
Select Case cell.Value
Case 8
cell.Interior.ColorIndex = 4 'cell color becomes green when cell value is 8
Case ""
cell.Interior.ColorIndex = 1 'cell color becomes black when cell is empty
Case Is < 6
cell.Interior.ColorIndex = 7 'cell color becomes pink when cell value is smaller than 6
Case Else
cell.Interior.ColorIndex = 0 'all other cells get no color
End Select
Next cell
End Sub
Function HexToLongRGB(sHexVal As String) As Long
Dim lRed As Long
Dim lGreen As Long
Dim lBlue As Long
lRed = CLng("&H" & Left$(sHexVal, 2))
lGreen = CLng("&H" & Mid$(sHexVal, 3, 2))
lBlue = CLng("&H" & Right$(sHexVal, 2))
HexToLongRGB = RGB(lRed, lGreen, lBlue)
End Function
Function setBgColor(ByVal stringHex As String)
Evaluate "setColor(" & Application.Caller.Offset(0, 0).Address(False, False) & ",""" & stringHex & """)"
setBgColor = ""
End Function
Sub setColor(vCell As Range, vHex As String)
vCell.Interior.Color = HexToLongRGB(vHex)
End Sub
私はこの方法を試しましたEvaluate
が、うまくいきましたがすぐにクラッシュしました(2007)。ヘルプにはアドレスのキャッシュについて記載されているので、それが私のアプローチです。セルと色をコレクションに保存し、計算後に色を変更します。
Dim colorCells As New Collection
Function UDF...
UDF = <whatever>
color = <color for whatever>
colorCells.Add (Application.Caller)
colorCells.Add (color)
End Function
Sub SetColor()
While colorCells.Count <> 0
colorCells(1).Interior.Color = colorCells(2)
colorCells.Remove (1)
colorCells.Remove (1)
Wend
End Sub
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
SetColor
End Sub