Rob*_*ies 8 worksheet-function cells microsoft-excel microsoft-excel-2010
所以基本上我想写一个公式来检查一个条件,如果满足该条件,那么我想将特定的文本行粘贴到不同的单元格中。我应该注意,我不希望公式存在于要粘贴值的单元格中。例如,如果我想将一个值粘贴到 B5 中,我不希望公式位于单元格 B5 中...
以下方法利用此处描述的变通方法启用 VBA 中定义的工作表函数来设置另一个单元格的值。
自定义函数将目标单元格的地址和该单元格要设置的值存储在全局变量中。然后,工作表重新计算时触发的宏读取全局变量并将目标单元格设置为指定值。
自定义函数的使用很简单:
=SetCellValue(target_cell, value)
Run Code Online (Sandbox Code Playgroud)
其中target_cell是对工作表中单元格的字符串引用(例如,“A1”)或计算结果为此类引用的表达式。这包括一个表达式,例如=B14B14 的值是“A1”。该函数可用于任何有效的表达式。
SetCellValue如果值成功写入目标单元格,则返回 1,否则返回 0。目标单元格的任何先前内容都将被覆盖。
需要三段代码:
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
Run Code Online (Sandbox Code Playgroud)
此代码必须包含在特定于您将在其中使用的工作表的代码中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
Run Code Online (Sandbox Code Playgroud)
可以将此代码粘贴到与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
Run Code Online (Sandbox Code Playgroud)
假设如果单元格 B5 包含值“green”,您希望在单元格 C5 中显示文本“Text A”。
您可以使用公式方法,但由于公式无法更改其他单元格中的值,因此需要将公式输入到单元格 C5 中。
=IF(ISNUMBER(FIND("green",B5)),"Text A","")
Run Code Online (Sandbox Code Playgroud)
如果 B5 包含单词“green”,单元格 C5 现在将仅显示“文本 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
Run Code Online (Sandbox Code Playgroud)
当然,输出的条件和位置只是一个示例,需要根据您的要求进行调整。
公式与宏观方法的区别在于
注:以上只是一个例子。您需要定义您的需求,是否评估数字或文本,评估是否区分大小写,评估规则是什么,结果放置在哪里等。