2

Excelにユーザー定義関数があります。スプレッドシートのセルから数式関数として呼び出され、正常に機能します。

返される値に応じてセルの色を変更できるようにしたいと思います。基本的に、セルの色を変更することは機能の副作用です。

私は試した

Application.ThisCell.Interior.ColorIndex = 2

しかし、それは失敗します。

4

6 に答える 6

11

これは、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
于 2015-06-26T13:54:39.397 に答える
9

これはできません。ユーザー定義関数は、ワークブック/ワークシートなどの状態を変更できません。

条件付き書式を使用して、目的を達成します。

編集:これは実際の答えではなく、提案のようなものです。

于 2012-12-04T15:05:30.483 に答える
1

いいえ、Function()を使用してセルの色を変更することはできません。ただし、Sub()ルーチンで変更することはできます。

実行したいセルで関数を実行するSub()を作成し、各セルを実行した後、Ifステートメントを入力して、返される値に基づいて色を付けるかどうかを確認します。

于 2012-12-05T07:28:19.200 に答える
1

シートに変更が加えられた後に自動的に実行される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
于 2013-05-16T13:21:09.927 に答える
0
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
于 2017-08-27T03:43:19.897 に答える
0

私はこの方法を試しました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
于 2018-09-24T01:41:56.043 に答える