【问题标题】:Changing a positive numeric cell input into a negative numeric value in the same cell based on criteria in another cell根据另一个单元格中的条件将正数值单元格输入更改为同一单元格中的负数值
【发布时间】:2020-10-03 21:54:22
【问题描述】:

我想通过引用另一个单元格区域中的条件将一个区域中的正值单元格输入更改为负值。因此,例如单元格区域 A1:A10 包含值“B”或“S”。单元格区域 B1:B10 是输入数值的位置。根据已在相应单元格 A1:A10 中输入的数据,输入这些值时将其设为正值或负值。因此,在 B1 中输入任何正值或负值作为 1234 或 -1234,其中 A1 的值为“B”将导致 B1 显示 -1234。相反,如果在单元格 B1:B10 中输入任何正值或负值,并且 A 列中相应行的值为“S”,则 B 列中的值将始终为正值,无论原始输入是负值还是正值。

如果 A1:A10 范围内的特定单元格中没有与 B 列中的同一行对应的特定单元格,则应向用户显示一条消息,说“请在 A 列的相应行中输入一个值。

我是 VBA 编码的新手,到目前为止,我在查看其他帖子时已将以下代码拼凑在一起,但我不知道如何完成它才能成功工作。

非常感谢任何帮助。

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim A1 As Range
    Set A1 = Range("A1:A10")
    Dim A2 As Range
    Set A2 = Range("B1:B10")
    If Intersect(Target, A2) Is Nothing Then Exit Sub
    If IsText(Target, A1) Then
        If A1 = "S" Then
        Application.EnableEvents = False
            B1 = -B1
        Application.EnableEvents = True
    End If
End Sub

【问题讨论】:

  • A1 是整个单元格范围,因此比较 A1 = "S" 没有意义。 10 个元素的范围不是字符串。如果您想查找,请查看Range.Find(),如果"S" 在范围内。或者,遍历该范围内的单元格,依次将每个单元格与"S" 进行比较。此外,您的 IsText 没有意义。一方面,这是一个工作表函数,而不是 VBA 函数。另一方面,它需要一个参数,而不是两个。

标签: excel vba negative-number


【解决方案1】:

这应该是你需要的:

For 循环允许您一次更改多个列 B 值。
如果列 A 值不是“B”或“S”,不采取任何行动。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim B As Range, Intersection As Range, cell As Range
    Dim v As String
    Set B = Range("B1:B10")
    Set Intersection = Intersect(Target, B)

    If Intersection Is Nothing Then Exit Sub

    Application.EnableEvents = False
        For Each cell In Intersection
            v = cell.Offset(0, -1).Value
            If v = "B" Then
                cell.Value = -Abs(cell.Value)
            ElseIf v = "S" Then
                cell.Value = Abs(cell.Value)
            End If
        Next cell
    Application.EnableEvents = True
End Sub

【讨论】:

    【解决方案2】:

    就地工作表更改

    • 将整个代码复制到一个工作表模块中(例如Sheet1)。
    • 代码自动执行所有操作,此处无需运行任何内容。
    • 函数“获取”从单元格开始的列范围 在FirstRow 到最后一个非空单元格。
    • 代码自动修改B列中输入的值 取决于A 列中的值。

    守则

    Option Explicit
    
    Private Sub Worksheet_Change(ByVal Target As Range)
        Const Proc As String = "Worksheet_Change"
        On Error GoTo cleanError
    
        Const FirstRow As Long = 1
        Dim Criteria As Variant: Criteria = Array("S", "B", "")
        Dim Cols As Variant: Cols = Array(1, 2) ' or Array("A", "B")
    
        Dim rngS As Range: Set rngS = getColumnRange(Me, Cols(1), FirstRow)
        If rngS Is Nothing Then Exit Sub
        Dim rngT As Range: Set rngT = Intersect(Target, rngS)
        If rngT Is Nothing Then Exit Sub
        Dim ColOffset As Long
        ColOffset = Columns(Cols(0)).Column - Columns(Cols(1)).Column
    
        Application.EnableEvents = False
        Dim cel As Range
        For Each cel In rngT.Cells
            Select Case cel.offset(, ColOffset).Value
                Case Criteria(0): cel.Value = Abs(cel.Value)
                Case Criteria(1): cel.Value = -Abs(cel.Value)
                Case Criteria(2): cel.Value = "Please enter a value into cell '" _
                  & cel.offset(, ColOffset).Address(0, 0) & "'."
                Case Else ' Maybe the same as the previous!?
            End Select
        Next
    
    CleanExit:
        Application.EnableEvents = True
    
    Exit Sub
    
    cleanError:
        MsgBox "An unexpected error occurred in '" & Proc & "'." & vbCr _
           & "Run-time error '" & Err.Number & "':" & vbCr _
           & Err.Description, vbCritical, Proc & " Error"
        On Error GoTo 0
        GoTo CleanExit
    
    End Sub
    
    Function getColumnRange(Sheet As Worksheet, _
                            ByVal AnyColumn As Variant, _
                            Optional ByVal FirstRow As Long = 1) _
             As Range
        Dim rng As Range
        Set rng = Sheet.Columns(AnyColumn).Find("*", , xlValues, , , xlPrevious)
        If rng Is Nothing Then Exit Function
        If rng.Row < FirstRow Then Exit Function
        Set getColumnRange = Sheet.Range(Sheet.Cells(FirstRow, AnyColumn), rng)
    End Function
    

    【讨论】:

      猜你喜欢
      • 2018-01-16
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多