首页 文章

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

提问于
浏览
5

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

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

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

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

So the conditions are:

  • 列(A)中的空白单元格

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

This is my Code:

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 回答

  • 2

    欢迎来到SO .

    试试这个代码 . 它会更快一点,应该得到你想要的 .

    Update :使代码更加防弹!

    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
    
  • 1

    没有必要在这里循环,利用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
    
  • 8

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

    • 将您使用的范围格式化为表格

    • 在A列过滤器上仅显示"(Blanks)"
      列B上的

    • 过滤器仅显示"assinged"

    • 选择B列中的所有结果单元格

    • 按alt:仅选择可见单元格

    • 按F2

    • 类型"unknown"

    • 按ctrl进入

    你的坏数据现在应该是好的!

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

相关问题