用水平定义的区域内的值填充空的空白单元格

时间:2018-08-29 15:07:00

标签: excel vba excel-vba

我正在尝试用0填充特定区域中的空白单元格。该区域应在当前工作簿中定义,但应在sheet2(而不是当前工作表)中定义。另外,应该填充的位置在列之间 当前区域中的BU:CQ(并非全部1亿行)。只是定义表BU和CQ之间的表的行数。我知道问题出在定义区域上...请参见下面的代码。 缺少什么?

Sub FillEmptyBlankCellWithValue()
    Dim cell As Range
    Dim InputValue As String

    On Error Resume Next
    InputValue = "0"
    For Each cell In ThisWorkbook.Sheets("Sheet2").Range(BU).CurrentRegion
      '.Cells(Rows.Count, 2).End(xlUp).Row
      If IsEmpty(cell) Then
        cell.Value = InputValue
      End If
    Next
 End Sub

我有这个肯定的代码,可以正常工作!但是我不选择!我想要指定表格和固定范围的东西。 现在,我的想法是将“选择”替换为所需的范围。 -在这种情况下,范围尤其应为1-BU:CQ之间; 2-从第2行开始; 3-一直向下直到最后一行(不为空=从A列到DE的表末尾)

 Sub FillEmptyBlankCellWithValue()
     Dim cell As Range
     Dim InputValue As String
     On Error Resume Next
     For Each cell In Selection
        If IsEmpty(cell) Then
           cell.Value = "0"
        End If
     Next
 End Sub'

PS:而且我还需要指定工作表,因为执行代码的按钮将在同一工作簿中,但不在同一工作表中。

3 个答案:

答案 0 :(得分:1)

使用SpecialsCells:

On Error Resume Next  'for the case the range would be all filled
With ws
    Intersect(.UsedRange, .Range("BU:CQ")).SpecialCells(xlCellTypeBlanks).Value = 0
End With
On Error GoTo 0

比循环快得多!

答案 1 :(得分:0)

尝试使用cells()引用,例如:

For i = cells(1,"BU").Column to cells(1,"CQ").Column
    cells(1,i).value = "Moo"
Next i

在当前代码中,您列出了 Range(BU),这是不合适的语法。请注意,Range()可用于命名范围,例如Range(“ TheseCells”),但实际的单元格引用被写为Range(“ A1”)等。对于Cell(),您可以使用Cells(row, col)。


编辑1

带有if语句,带有第二个循环:

Dim i as long, j as long, lr as long
lr = cells(rows.count,1).end(xlup).row
For i = 2 to lr 'assumes headers in row 1
    For j = cells(1,"BU").Column to cells(1,"CQ").Column
        If cells(i,j).value = "" then cells(i,j).value = "Moo"
    Next j
Next i

答案 2 :(得分:0)

首先,您应该使用以下方法引用工作表:

Set ws = Excel.Application.ThisWorkbook.Worksheets(MyWorksheetName)

否则,VBA将为您选择工作表,它可能是也可能不是您要使用的工作表。

然后使用它来指定特定工作表(例如ws.Rangews.Cells)上的范围。这是一种用于指定您正在处理的工作表的更好的方法。

现在提出您的问题:

我将使用以下语法引用范围:

Dim MyRange As Range
Set MyRange = ws.Range("BU:CQ")

我会像这样遍历整个范围:

编辑:我对此进行了测试,并且可以正常工作。显然,您将需要更改范围和工作表引用;我认为您有能力自己做。我没有为工作表创建变量,因为引用工作表的另一种方法是在属性窗口中使用工作表的(Name)属性,您可以将其设置为所需的值。这是一个免费的全局变量。

我在属性窗口中定义了testWS的位置:

enter image description here

Public Sub test()
    Dim MyRange As Range
    Dim tblHeight As Long
    Dim tblLength As Long
    Dim offsetLen As Long
    Dim i As Long
    Dim j As Long

    With testWS
        'set this this to your "BU:CQ" range
        Set MyRange = .Range("P:W")
        'set this to "A:BU" to get the offset from A to BU
        offsetLen = .Range("A:P").Columns.Count - 1
        'set this to your "A" range
        tblHeight = .Range("P" & .Rows.Count).End(xlUp).Row
        tblLength = MyRange.Columns.Count
    End With

    'iterate through the number of rows
    For i = 1 To tblHeight
        'iterate through the number of columns
        For j = 1 To tblLength
            If IsEmpty(testWS.Cells(i, offsetLen + j).Value) Then
                testWS.Cells(i, offsetLen + j).Value = 0
            End If
        Next
    Next

End Sub

之前:

enter image description here

之后(我很早就停止了它,因此它没有遍历文件中的所有行):

enter image description here

如果有更好的方法可以做到这一点,请告诉我。