【问题标题】:If certain cells meet criteria, change targeted cell in excel vba如果某些单元格符合条件,请更改 excel vba 中的目标单元格
【发布时间】:2025-12-26 15:45:12
【问题描述】:

如果 A 列包含“RR”且 C 列不等于“备忘录”且 E 列不等于“Air”或“Printed”,则列 L=0。

然后后跟如果 A 列包含“RR”且 C 列不等于“备忘录”且 E 列等于“Air”或“Printed”,则 L= 列是 H*.1 列。

我相信我遇到了等于/不等于的问题。

Sub RRClean()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Dim myString As String
RowCount = WorksheetFunction.CountA(range("A:A"))

For i = 2 To RowCount
    myString = Trim(Cells(i, 2).Value)
    If InStr(myString, "RR") > 0 And .cell(i, 3) <> "Memo" And .cell(i, 7) <> "Air" Or .cell(i, 7) <> "Printed" Then
        Cells(i, 12).Value = 0
    End If
Next

For i = 2 To RowCount
    myString = Trim(Cells(i, 2).Value)
    If InStr(myString, "RR") > 0 And .cell(i, 3) <> "Memo" And .cell(i, 7) = "Air" Or .cell(i, 7) = "Printed" Then
        Cells(i, 12).Value = cell(i, 8) * 0.1
    End If
Next

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub

【问题讨论】:

  • 不知道为什么要在cell.cell 之间切换(顺便说一句,你错过了),但是在说cells 之后尝试添加.value
  • 1) cell 应该是 Cells。 2) 将. 放在Cells 之前没有With 块将不起作用。将With Activesheet 放在您的RowCount = ... 之前。然后在每个RangeCells 前面加上.。然后在你最后的next 之后输入End With
  • @findwindow 没用,但谢谢
  • @ScottCraner 感谢工作就像一个魅力
  • 如果您将鼠标悬停在评论的左侧,您将看到一个向上箭头。很高兴我能帮上忙。花点时间了解为什么需要这样做以及将 . 放在函数之前意味着什么

标签: vba excel criteria


【解决方案1】:

您的逻辑在处理时略有缺陷,并且E列不等于“Air”或“Printed””。如果一个单元格不是Air,它可能是Printed。如果它不是Printed,那么它可能是Air。您需要 And" 一样,E 列不等于“Air”,E 列不等于“Printed”

Sub Cmemo()
    With Worksheets("Sheet4")    '<~~ SET THIS WORKSHEET REFERENCE PROPERLY!!
        If .AutoFilterMode Then .AutoFilterMode = False
        With .Cells(1, 1).CurrentRegion
            .AutoFilter Field:=1, Criteria1:="*RR*"
            .AutoFilter Field:=3, Criteria1:="<>memo"
            .AutoFilter Field:=5, Criteria1:="<>Air", _
                        Operator:=xlAnd, Criteria2:="<>Printed"
            If CBool(Application.Subtotal(103, .Offset(1, 0).Cells)) Then
                With .Resize(.Rows.Count - 1, 1).Offset(1, 11)
                    .SpecialCells(xlCellTypeVisible) = 0
                End With
            End If
            .AutoFilter Field:=5, Criteria1:="Air", _
                        Operator:=xlOr, Criteria2:="Printed"
            If CBool(Application.Subtotal(103, .Offset(1, 0).Cells)) Then
                With .Resize(.Rows.Count - 1, 1).Offset(1, 11)
                    .SpecialCells(xlCellTypeVisible).FormulaR1C1 = "=rc[-4]/10"
                End With
            End If
        End With
        If .AutoFilterMode Then .AutoFilterMode = False
    End With
End Sub

使用AutoFilter Method,无需声明单个变量即可完成这两个操作。

【讨论】:

  • 感谢您的帖子。我现在没有时间,但明天一定会看看。
  • 是的,我明白你所说的逻辑,但它运作良好。不能告诉你你写的代码是否像我周末被锁定一样工作。
  • 逻辑有效,因为您首先执行 0。实际上,您将零在与前两个​​条件匹配的所有单元格中,因为第三个条件是全局匹配。然后,当下一轮将公式放入某些内容时,您会覆盖 一些 个 0。它有效,但不能依赖。如果您颠倒顺序并先执行公式,它们都会被 0 覆盖。
  • 刚刚测试了您的代码并且它运行但没有按照我提到的方式工作。我找不到你的代码的韵律或原因。
  • 将 Sheet4(或任何工作表名称)放在计算机屏幕的左侧。点击 [Alt]+[F11] 打开 VBE 并将其放在屏幕右侧,这样您就可以看到 Cmemo 子程序以及它后面的大部分工作表左边。将光标置于子程序内的任意位置,然后点击 [F8]。继续点击 [F8] 以逐行浏览该过程。观察左侧后面的工作表是否有明显变化,并弄清楚发生了什么或没有发生什么。
最近更新 更多