Excel VBA宏:找到列中的第一个空单元格并自动填充它

时间:2012-09-11 17:45:28

标签: excel-vba excel-2003 vba excel

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

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

但是,此查询有时会为没有名称的状态提取显示“已分配”的某些行项目,因此表示列(A)中名称的相应单元格为空白。所以我用“Unknown”手动填写那些空单元格。

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

条件是:

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

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

  3. 这是我的代码:

    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   
    

3 个答案:

答案 0 :(得分:8)

这里没有必要循环,利用excels内置的方法,可以更快地执行。

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

答案 1 :(得分: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

答案 2 :(得分:1)

如果您只需要这样做几次就可以

  1. 将您使用的范围格式化为表格
  2. A列上的
  3. 过滤器仅显示“(空白)”
  4. B列过滤器上的
  5. 仅显示“assinged”
  6. 选择B列中的所有结果单元格
  7. alt + 仅选择可见的单元格
  8. F2
  9. 输入“unknown”
  10. ctrl + 输入
  11. 你的坏数据现在应该很好!

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