如何编写将特定值粘贴到不同单元格的 Excel 公式?

Rob*_*ies 8 worksheet-function cells microsoft-excel microsoft-excel-2010

所以基本上我想写一个公式来检查一个条件,如果满足该条件,那么我想将特定的文本行粘贴到不同的单元格中。我应该注意,我不希望公式存在于要粘贴值的单元格中。例如,如果我想将一个值粘贴到 B5 中,我不希望公式位于单元格 B5 中...

chu*_*uff 7

以下方法利用此处描述的变通方法启用 VBA 中定义的工作表函数来设置另一个单元格的值。

自定义函数将目标单元格的地址和该单元格要设置的值存储在全局变量中。然后,工作表重新计算时触发的宏读取全局变量并将目标单元格设置为指定值。

自定义函数的使用很简单:

  =SetCellValue(target_cell, value)
Run Code Online (Sandbox Code Playgroud)

其中target_cell是对工作表中单元格的字符串引用(例如,“A1”)或计算结果为此类引用的表达式。这包括一个表达式,例如=B14B14 的值是“A1”。该函数可用于任何有效的表达式。

SetCellValue如果值成功写入目标单元格,则返回 1,否则返回 0。目标单元格的任何先前内容都将被覆盖。

需要三段代码:

  • 定义SetCellValue自身的代码
  • 工作表计算事件触发的宏;和
  • 一个实用函数,IsCellAddress以确保它target_cell是一个有效的单元地址。

SetCellValue 函数的代码

需要将此代码粘贴到插入工作簿的标准模块中。该模块可以通过 Visual Basic 编辑器的菜单插入,该菜单可通过Visual BasicDeveloper功能区的选项卡中进行选择来访问。

  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)

IsCellAddress 函数的代码

可以将此代码粘贴到与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)


tey*_*lyn 2

假设如果单元格 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)

当然,输出的条件和位置只是一个示例,需要根据您的要求进行调整。

公式与宏观方法的区别在于

  • 使用公式方法,单元格 C5 将包含一个公式。如果用户不小心删除了公式,它提供的功能也将被删除。(不过,有一些方法可以解决这个问题)
  • 使用 VBA 宏,单元格 C5 将不会显示任何公式,并将逐字文本作为值,但更改设置需要 Excel VBA 知识。此外,使用 VBA 方法时,工作簿必须保存为启用宏的工作簿,并且用户必须允许宏或使文件成为可信文件。

注:以上只是一个例子。您需要定义您的需求,是否评估数字或文本,评估是否区分大小写,评估规则是什么,结果放置在哪里等。