我正在尝试用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:而且我还需要指定工作表,因为执行代码的按钮将在同一工作簿中,但不在同一工作表中。
答案 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.Range
或ws.Cells
)上的范围。这是一种用于指定您正在处理的工作表的更好的方法。
现在提出您的问题:
我将使用以下语法引用范围:
Dim MyRange As Range
Set MyRange = ws.Range("BU:CQ")
我会像这样遍历整个范围:
编辑:我对此进行了测试,并且可以正常工作。显然,您将需要更改范围和工作表引用;我认为您有能力自己做。我没有为工作表创建变量,因为引用工作表的另一种方法是在属性窗口中使用工作表的(Name)属性,您可以将其设置为所需的值。这是一个免费的全局变量。
我在属性窗口中定义了testWS的位置:
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
之前:
之后(我很早就停止了它,因此它没有遍历文件中的所有行):
如果有更好的方法可以做到这一点,请告诉我。