5

我在电子表格中有两列,列 (A) 和列 (B)。

列 (A) 包含从查询中提取的名称(例如 Brian、Bob、Bill 等),列 (B) 包含三种状态之一(已分配、进行中或待定)。

但是,此查询有时会针对没有名称的状态拉出一些显示“已分配”的行项目,因此表示列 (A) 中名称的相应单元格是空白的。所以我用“未知”手动填充那些空单元格。

我想要做的是创建一个宏来查找列 (A) 中的每个空单元格,如果其右侧的单元格包含单词“Assinged”,则填写单词“Unknown”。

所以条件是:

  1. 列 (A) 中的空白单元格

  2. 右侧对应的单元格(B 列)包含单词“assinged”

这是我的代码:

Private Sub CommandButton2_Click()

    For Each cell In Columns("A")
        If ActiveCell.Value = Empty And ActiveCell.Offset(0, 1).Value = "Assigned" Then ActiveCell.Value = "Unknown"
    Next cell

End Sub   
4

3 回答 3

8

此处无需循环,利用 excel 内置方法执行得更快。

Private Sub CommandButton2_Click()

    Application.ScreenUpdating = False

    With ActiveSheet.UsedRange
        .AutoFilter Field:=1, Criteria1:=""
        .AutoFilter Field:=2, Criteria1:="Assigned"

        If WorksheetFunction.CountBlank(.Columns(1)) > 0 Then
            If .Columns(1).SpecialCells(xlCellTypeVisible).Count > 1 Then
                .Columns(1).SpecialCells(xlCellTypeBlanks).Value = "Unknown"
            End If
        End If

        .AutoFilter
    End With

    Application.ScreenUpdating = True

End Sub
于 2012-09-11T21:52:45.987 回答
2

欢迎来到 SO。

试试这个代码。它会工作得更快一些,应该可以得到你想要的。

更新:使代码更加防弹!

Private Sub CommandButton2_Click()

Dim cel As Range, rngFind As Range, rngFilter As Range
Dim wks As Worksheet

Set wks = Sheets("sheet1")

With wks

    '-> Error check to make sure "blanks" exist
    Set rngFind = .Range("A1:A" & .Range("B" & Rows.Count).End(xlUp).Row).Find("", lookat:=xlWhole)

    If Not rngFind Is Nothing Then

        Set rngFilter = .Range("A1:B" & .Range("B" & Rows.Count).End(xlUp).Row)

        rngFilter.AutoFilter 1, "="

        '-> Error check to make sure "assigned" exists for blank cells
        Set rngFind = .Columns("B:B").SpecialCells(xlCellTypeVisible).Find("Assigned", lookat:=xlWhole)

        If Not rngFind Is Nothing Then
        '-> okay, it exists. filter and loop through cells

            rngFilter.AutoFilter 2, "Assigned"

            Set rngFind = Intersect(.UsedRange, .UsedRange.Offset(1), .Columns(1)).SpecialCells(xlCellTypeVisible)

            For Each cel In rngFind

                If cel.Offset(0, 1).Value = "Assigned" Then cel.Value = "Unknown"

            Next cel

        End If

    End If

End With


End Sub
于 2012-09-11T17:56:53.563 回答
1

如果你只需要这样做几次,你可以

  1. 将您使用的范围格式化为表格
  2. 在 A 列过滤器上仅显示“(空白)”
  3. 在 B 列过滤器上仅显示“assinged”
  4. 选择 B 列中的所有结果单元格
  5. alt+:仅选择可见单元格
  6. F2
  7. 输入“未知”
  8. ctrl+enter

您的不良数据现在应该是好的!

显然这是一个非基于 vba 的解决方案,但如果您可以避免编码,它可能是最好的。

于 2012-09-11T19:13:02.697 回答