したがって、基本的には、条件をチェックする数式を作成し、その条件が満たされている場合は、特定のテキスト行を別のセルに貼り付けます。値を貼り付けるセルに数式が存在しないように注意する必要があります。たとえば、値をB5に貼り付けたい場合、数式をセルB5に入れたくありません...
したがって、基本的には、条件をチェックする数式を作成し、その条件が満たされている場合は、特定のテキスト行を別のセルに貼り付けます。値を貼り付けるセルに数式が存在しないように注意する必要があります。たとえば、値をB5に貼り付けたい場合、数式をセルB5に入れたくありません...
回答:
次のアプローチでは、ここおよびここで説明する回避策を使用して、VBAで定義されたワークシート関数が別のセルの値を設定できるようにします。
カスタム関数は、グローバル変数にターゲットセルのアドレスとそのセルが設定される値を格納します。次に、ワークシートの再計算時にトリガーされるマクロがグローバル変数を読み取り、ターゲットセルを指定された値に設定します。
カスタム関数の使用は簡単です:
=SetCellValue(target_cell, value)
ここtarget_cell
で、ワークシート内のセルへの文字列参照(「A1」など)、またはそのような参照に評価される式です。これには、=B14
B14の値が「A1」であるような式が含まれます。この関数は、任意の有効な式で使用できます。
SetCellValue
値がターゲットセルに正常に書き込まれた場合は1を返し、そうでない場合は0を返します。ターゲットセルの以前の内容は上書きされます。
次の3つのコードが必要です。
SetCellValue
自分自身を定義するコードIsCellAddress
ことを確認するユーティリティ関数target_cell
。このコードは、ブックに挿入された標準モジュールに貼り付ける必要があります。モジュールは、リボンのタブVisual Basic
から選択することでアクセスできるVisual Basicエディターのメニューから挿入できますDeveloper
。
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
Application.Calculate
前にあなたはありませんApplication.EnableEvents = True
か?それ以外の場合、私の関数は94回計算されます。
セルB5に値「green」が含まれる場合、セル「C5」にテキスト「Text A」を表示するとします。
あなたはできる式のアプローチを使用しますが、式は、他のセルの値を変更することはできませんから、数式がセルC5に入力する必要があります。
=IF(ISNUMBER(FIND("green",B5)),"Text A","")
セルC5は、B5に「green」という単語が含まれている場合にのみ「Text 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
もちろん、条件と出力の配置は単なる例であり、要件に合わせて調整する必要があります。
数式とマクロアプローチの違いは
注:上記は単なる例です。要件、数値またはテキストを評価するかどうか、評価で大文字と小文字を区別するかどうか、評価ルールとは何か、結果を配置する場所などを定義する必要があります。