Excel 2013 - 根据行/单元格值填充零

时间:2015-05-19 22:11:41

标签: excel vba excel-vba

我正在努力清理Access数据库的时间表,而且我在清理数据方面遇到了问题。

我在第一列中有一个带有名称的时间表,之后的所有列,从C到M(左右)都有几个小时。我想要实现的是,当宏在第一列中找到一个名称时,它会选择该行中的列,找到没有小时数的单元格,并用零填充它们

Dim r As Integer
Dim c As Range

    For r = 2 To 15 Step 1
        If Cells(r, 1).Value <> "" Then
            Range(Cells(r, 3), Cells(r, 10)).Select
        End If
    Next

    For Each c In Selection
        If IsEmpty(c) Then
            c.Value = 0
        End If
    Next

我正在尝试根据输入了命名的单元格循环并用零填充行。我遇到的问题是单元格只填充在电子表格的姓氏/行中。宏似乎正在跳过除最后一行之外的所有内容。

我只是在学习VBA,所以也许我只是在语法中遗漏了一些东西。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

问题在于,在开始填写0之前,您将继续进行下一个选择,一直到最后一行。尝试对您的代码进行此修改:

Dim r As Integer
Dim c As Range

For r = 2 To 15 Step 1
    If Cells(r, 1).Value <> "" Then
        Range(Cells(r, 3), Cells(r, 10)).Select
    End If
    For Each c In Selection
        If IsEmpty(c) Then
            c.Value = 0
        End If
    Next c
Next r

使用此方法,在进入下一个选择/行之前填写0。

注意:由于它可能导致的问题,我避免使用.select / Selection,所以如果一行不包含名称,我不确定是否会收到错误消息。如果您希望避免此潜在错误,请尝试以下操作:

Dim r As Integer
Dim c As Range
Dim c2 As Range

For r = 2 To 15 Step 1
    If Cells(r, 1).Value <> "" Then
        Set c2 = Range(Cells(r, 3), Cells(r, 10))
    End If
    For Each c In c2
        If IsEmpty(c) Then
            c.Value = 0
        End If
    Next c
Next r

顺便说一句,您是否从Range(Cells(r, 3), Cells(r, 10))中删除了工作簿和工作表名称以简化帖子?我很惊讶你能够毫无错误地使用它。如果是这样,你显然必须重新使用它们才能使我的代码正常工作。

答案 1 :(得分:0)

可能,

Sub Button1_Click()
    Dim Rws As Long, Rng As Range
    Rws = Cells(Rows.Count, "A").End(xlUp).Row
    Set Rng = Range(Cells(2, 1), Cells(Rws, 1)).SpecialCells(xlCellTypeConstants)
    Rng = 0
End Sub

答案 2 :(得分:0)

您想要获取所有空白单元格并将其变为零。

Sub zeroed_hours()
    Dim rw As Long
    With Sheets("Sheet1")    '<-set this worksheet reference properly!
        For rw = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
            If CBool(Len(.Cells(rw, 1))) Then 'found a name!
                'C:M on this row
                .Cells(rw, 3).Resize(1, 11).Replace what:="", replacement:=0, lookat:=xlWhole
            End If
        Next rw
    End With
End Sub

这将遍历A列中的单元格。如果它找到一个值(长度大于零的值),那么它将用该零替换该行上C:M中的所有空白单元格。