これは、質問者からの新しい情報の光の中で完全に書き直さ答えです。
私が正しく理解している場合は、セルの色を変更するカスタム関数を作成したいと考えています。カスタム関数のMicrosoftのヘルプから次のテキストは、あなたができないと言う:
カスタム関数で使用することができますVBAのキーワードの数は、あなたがマクロで使用できる数よりも 小さいです。カスタム機能では、 ワークシートの式に値を返すほか、別のVBAマクロまたは関数で使用される式以外の操作を行うことはできません。 たとえば、カスタム関数では、ウィンドウのサイズを変更したり、 セル内の数式を編集したり、 セル内のテキストのフォント、カラー、またはパターンオプションを変更することはできません。この種の「アクション」コードを関数 プロシージャに含めると、関数は#VALUE!を返します。エラー。
私はあなたの要件を満たす可能性のある2つの代替案を知っています。 3番目の選択肢は、後にインスピレーションのフラッシュの後に追加されました。
代替1:許容値
位置制限値を有することであるセルにカーソルのドロップダウンリストを提供します。ツールバーの[データ]を選択し、[検証]を選択します。データ検証フォームが表示されます。
まだ選択されていない場合は、[設定]タブを選択します。 [許可:]の下のボックスをクリックし、[リスト]を選択します。 [ソース]ボックスに「= $ A $ 1:$ A $ 10」と入力します。 ( "="が必要です。このセルのコピーを作成するには、$ sが重要です)。[OK]をクリックします。
ユーザーがカーソルをそのセルに置くと、許可された値を入力するか、リストから許可された値を選択できます。他の値を入力しようとすると、エラーメッセージが表示されます。データ検証フォーム内の他のタブでは、ヘルプメッセージと独自のエラーメッセージを入力できます。
元のボックスに$ sがあるため、元のセルとその検証を他のセルにコピーできます。
オルタナティブ2:条件付き書式
許可された値が範囲であれば、条件付き書式は、要件を満たしています。たとえば、許可される範囲が10〜20であるとします。
ツールバーの[書式]を選択し、条件付き書式を選択します。
条件1のボックスが表示されます。 「間」は既に表示されています。右側のボックスには10と20を入力します。
[条件2のボックスを表示するには、[追加]をクリックします。[より小さい]で置換]を選択し、次のボックスに10と入力します。 OK。
[条件3の置換え]を表示するには、[追加]をクリックします。次のボックスに20と入力します。[書式]をクリックします。色をクリックします。赤を選択します。 [OK]をクリックします。
[OK]をクリックして条件付き書式設定を受け入れます。
ユーザーは、細胞内に好きなものを入力することができますが、それはあなたが望むようにあなたがフォーマットされたセルのように多くのコピーを作成することができます
10〜20である場合を除き、それが赤になります。
ワークシートの変更イベント
私が前のイベントを考えているはずです。私はこれがまさにあなたが望むものだと信じています。
VBAエディタ内では、通常、プロジェクトエクスプローラは画面の左側に表示されます。表示されていない場合は、Ctrl+R
をクリックします。
選択した値を制御するワークシートの行を右クリックします。 View Code
をクリックします。
コード領域はワークシートになりますが、それ以外の場合は空白になります。この領域にはさまざまなルーチンを配置できますが、関連するルーチンはワークシート・イベント・ルーチンです。これらは、ワークシートのアクティブ化または非アクティブ化などのイベントが発生するたびに呼び出されるルーチンです。必要なイベントは、ユーザーがセルを変更するたびに呼び出されるChangeです。このルーチンの魅力は、あなたが望むものを何でもすることができるということです。
ワークシートのコード領域に、以下のWorksheet_Changeルーチンをコピーして貼り付けます。
このパラメータは、ユーザが変更したセルのアドレスです。
TgtRngListには、パトロールする範囲のリストが設定されています。これをC1:C1000、F1:F1000、A1に設定しました。これを巡回する範囲に変更する必要があります。
OKValueListは、パトロールされた範囲の許容値のリストに設定されます。彼らはどこかのシートの中にあるかもしれませんが、私はここでそれらを定義する方が簡単だと思います。あなたが望むものにリストを変更してください。
変更されたセルがパトロールされた領域の1つにあるかどうかをチェックします。そうであれば、許可された値があるかどうかチェックされます。そのチェックの結果、セルが黒または赤に設定されます。
Option Explicit
Sub Worksheet_Change(ByVal ChangedCell As Range)
' This routine is called whenever the user changes a cell.
' It is not called if a cell is changed by Calculate
Dim ColChanged As Integer
Dim InxOV As Integer
Dim InxTR As Integer
Dim OKValueList() As Variant
Dim Patrolled As Boolean
Dim RowChanged As Integer
Dim TgtColLeft As Integer
Dim TgtColRight As Integer
Dim TgtRngPartList() As String
Dim TgtRngList() As Variant
Dim TgtRngPart As String
Dim TgtRowBottom As Integer
Dim TgtRowTop As Integer
Dim ValueChanged As String
Dim ValueOK As Boolean
' Fill TgtRngList withe ranges that are to be patrolled by this routine
TgtRngList = Array("C1:C1000", "F1:F1000", "A1")
' Fill OKValueList with the permitted values for these cells.
OKValueList = Array("V1", "V2", "V3", "V4", "V5", _
"V6", "V7", "V8", "V9", "V10")
ColChanged = ChangedCell.Column
RowChanged = ChangedCell.Row
Patrolled = False
For InxTR = LBound(TgtRngList) To UBound(TgtRngList)
TgtRngPartList = Split(TgtRngList(InxTR), ":")
' Decode top left of range
TgtRngPart = TgtRngPartList(LBound(TgtRngPartList))
TgtRowTop = Range(TgtRngPart).Row
TgtColLeft = Range(TgtRngPart).Column
If LBound(TgtRngPartList) = UBound(TgtRngPartList) Then
' There is no colon so single cell range
TgtRowBottom = TgtRowTop
TgtColRight = TgtColLeft
Else
TgtRngPart = TgtRngPartList(UBound(TgtRngPartList))
TgtRowBottom = Range(TgtRngPart).Row
TgtColRight = Range(TgtRngPart).Column
End If
If RowChanged >= TgtRowTop And RowChanged <= TgtRowBottom And _
ColChanged >= TgtColLeft And ColChanged <= TgtColRight Then
' This is a patrolled cell
Patrolled = True
Exit For
End If
Next
If Patrolled Then
With ActiveSheet
ValueChanged = .Cells(RowChanged, ColChanged).Value
' Check value against permitted list
ValueOK = False
For InxOV = LBound(OKValueList) To UBound(OKValueList)
If ValueChanged = OKValueList(InxOV) Then
ValueOK = True
Exit For
End If
Next
If ValueOK Then
' Set cell black
.Cells(RowChanged, ColChanged).Font.Color = RGB(0, 0, 0)
Else
' Set cell red
.Cells(RowChanged, ColChanged).Font.Color = RGB(255, 0, 0)
End If
End With
End If
End Sub
これが役に立ちます。
表示されている関数は何も返しません... VLOOKUP()のようなワークシート式を使用しているだけで構いませんか?関数(ワークシートから呼び出されたとき)は、シートを変更することはできません。呼び出し元のセルにのみ値を返すことができます。色を追加する必要がある場合は、条件付き書式設定を使用できます。 –
私は数式を訂正しました。私は機能がシートを変更できないことを知らなかった。条件付き書式設定として、Subとして機能を追加する方が便利かどうかはわかりません。私は普通のユーザーが物事を変えることができないようにしたいが、仕事場をpwで保護したくない。 – Pragabhava