したがって、基本的には条件をチェックする数式を記述し、その条件が満たされた場合は、特定のテキスト行を別のセルに貼り付けます。値を貼り付けたいセルに数式を入れたくないので注意してください。たとえば、B5に値を貼り付けたい場合、セルB5に数式を入れたくありません...
次のアプローチは、説明されている here および here の回避策を利用して、VBAで定義されたワークシート関数が別のセルの値を設定できるようにします。
カスタム関数は、ターゲットセルのアドレスとそのセルに設定する値をグローバル変数に格納します。次に、ワークシートが再計算されるときにトリガーされるマクロがグローバル変数を読み取り、ターゲットセルを指定された値に設定します。
カスタム関数の使用は簡単です。
=SetCellValue(target_cell, value)
ここで、target_cell
は、ワークシート内のセルへの文字列参照(「A1」など)またはそのような参照として評価される式です。これには、=B14
などの式が含まれ、B14の値は「A1」です。関数は任意の有効な式で使用できます。
SetCellValue
は、値がターゲットセルに正常に書き込まれた場合は1を返し、それ以外の場合は0を返します。ターゲットセルの以前の内容は上書きされます。
3つのコードが必要です。
SetCellValue
自体を定義するコードIsCellAddress
は、target_cell
が有効なセルアドレスであることを確認します。このコードは、ワークブックに挿入された標準モジュールに貼り付ける必要があります。モジュールは、リボンのDeveloper
タブからVisual Basic
を選択してアクセスするVisual Basic Editorのメニューから挿入できます。
Option Explicit
Public triggerIt As Boolean
Public theTarget As String
Public theValue As Variant
Function SetCellValue(aCellAddress As String, aValue As Variant) As Long
If (IsCellAddress(aCellAddress)) And _
(Replace(Application.Caller.Address, "$", "") <> _
Replace(UCase(aCellAddress), "$", "")) Then
triggerIt = True
theTarget = aCellAddress
theValue = aValue
SetCellValue = 1
Else
triggerIt = False
SetCellValue = 0
End If
End Function
このコードは、SetCellValue
を使用するワークシートに固有のコードに含める必要があります。これを行う最も簡単な方法は、Home
ビューでワークシートのタブを右クリックし、View Code
を選択して、表示されるエディターペインにコードを貼り付けることです。
Private Sub Worksheet_Calculate()
If Not triggerIt Then
Exit Sub
End If
triggerIt = False
On Error GoTo CleanUp
Application.EnableEvents = False
Range(theTarget).Value = theValue
CleanUp:
Application.EnableEvents = True
Application.Calculate
End Sub
このコードは、SetCellValue
コードと同じモジュールに貼り付けることができます。
Function IsCellAddress(aValue As Variant) As Boolean
IsCellAddress = False
Dim rng As Range ' Input is valid cell reference if it can be
On Error GoTo GetOut ' assigned to range variable
Set rng = Range(aValue)
On Error GoTo 0
Dim colonPos As Long 'convert single cell "range" address to
colonPos = InStr(aValue, ":") 'single cell reference ("A1:A1" -> "A1")
If (colonPos <> 0) Then
If (Left(aValue, colonPos - 1) = _
Right(aValue, Len(aValue) - colonPos)) Then
aValue = Left(aValue, colonPos - 1)
End If
End If
If (rng.Rows.Count = 1) And _
(rng.Columns.Count = 1) And _
(InStr(aValue, "!") = 0) And _
(InStr(aValue, ":") = 0) Then
IsCellAddress = True
End If 'must be single cell address in this worksheet
Exit Function
GetOut:
End Function
セルB5に値「green」が含まれている場合、セルC5にテキスト「テキストA」を表示するとします。
can数式アプローチを使用しますが、数式は他のセルの値を変更できないため、数式をセルC5に入力する必要があります。
=IF(ISNUMBER(FIND("green",B5)),"Text A","")
セルC5は、B5に「緑」という単語が含まれている場合にのみ「テキストA」を表示します。
このような式は、多くの条件で機能するように構築できます。特定の状況について支援を受けるためには、要件を定義する必要があります。
C5に数式を設定したくない場合は、VBAアプローチを使用することもできます。セルB5が変更されるたびに実行されるワークシート変更イベントを実行するには、値を手動で編集するか、値を貼り付けます。
そのようなマクロの例は、
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B5")) Is Nothing Then
If InStr(1, Target, "green", vbTextCompare) Then
Target.Offset(0, 1) = "Text A"
End If
End If
End Sub
もちろん、出力の条件と配置は単なる例であり、要件に合わせて調整する必要があります。
式とマクロアプローチの違いは
注:上記は一例です。数値またはテキストを評価するかどうか、評価で大文字と小文字を区別するかどうか、評価ルールとは何か、結果を配置する場所など、要件を定義する必要があります。
条件が満たされているかどうかを確認するには、一部のセルにIF式を記述して、「別のセルの特定のテキスト行」を更新します。結果のセルには、次のように、式の値のみが含まれ、その値を生成した式は含まれません。
作業セル(例:J5)=IF(A1="yes","Specific line of text","")
結果セル(B5など)=J5
したがって、条件が満たされた場合(A1 = "yes")、B5には「特定のテキスト行」が含まれます。それ以外の場合は空白のままです。
注:
変数値を持つセルには、通常、その値を更新し続けるためのある種の数式が含まれます。
値を作成している実際の数式を誰にも知られたくない場合は、数式を他のセルに入力して値を生成し、結果のセルにコピーすることができます。 B5。
値を生成した数式を非表示にする、またはB5が参照するセルを非表示にする(値を更新する必要があるかどうかをチェックし続ける)には、次を参照してください。
https://support.office.com/en-us/article/display-or-hide-formulas-f7f5ab4e-bf24-4efc-8fc9-0c1b77a5356f
同じ効果を達成できるその他の関数には、CHOOSE、HLOOKUP、LOOKUP、VLOOKUPがあります。