我知道这是一个非常基本的问题,但我仍在努力建立自己的VBA技能。我处于一种困境,我已经制作了一个我收到的各种报告的映射系统,这些报告放在编译的工作簿中。这些报告具有完全不同的格式等。我有一个复制/粘贴宏,它复制列并将它们放在编译的工作簿上的正确位置。
我遇到了很多重复/空行会搞砸我的宏的情况。我使用了两个VBA函数来解决这个问题,一个是“如果引用列为空白则删除行”:
Sub DeleteBlankARows()
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
Dim r As Long
For r = Cells(Rows.Count, 6).End(xlUp).Row To 1 Step -1
If Cells(r, 6) = "" Then Rows(r).Delete
Next r
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With End Sub
这将删除F列中的单元格为空的行
我还使用了复制/粘贴宏:
Sub CopyUntilBlank()
Dim last_row As Integer
last_row = Range("f1").End(xlDown).Row
Dim rng As Range
Set rng = Range("d2:d" & last_row)
For Each cell In rng.Cells
cell.Activate
If ActiveCell.Value = "" Then
ActiveCell.Value = ActiveCell.Offset(-1, 0).Value
End If
Next cell End Sub
这会复制并粘贴D列中的空白行,直到您点击非空白单元格,然后重新执行此操作,直到F列中的值范围为止。
这些宏对我来说效果很好,但因为我有这样的多个工作表,所以我想创建一个使范围动态化的单元格引用。例如:在DeleteBlankRows宏中,我希望单元格(r,6)中的列引用取决于sheet1中的单元格值 - 例如,如果工作表1上单元格A1中的值为2,它将更改列引用“2”(列B)。
我希望复制/粘贴宏也能发生同样的情况。我很确定这只是对A1.Value的一些引用,但我不知道如何正确地编写这样的东西。
感谢您的支持,在社区的全力支持下,我已经走了很长的路。
答案 0 :(得分:3)
使用您的第一个子代码的示例:
Sub DeleteBlankARows(colIndex as Long)
Dim colIndex as long
colIndex = Sheet1.Range("a1").value
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
Dim r As Long
For r = Cells(Rows.Count, colIndex).End(xlUp).Row To 1 Step -1
If Cells(r, colIndex) = "" Then Rows(r).Delete
Next r
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
End Sub
从您的问题中不清楚第二个子中的哪一列需要是动态的(或两者都是?)
编辑试试这个:
Sub CopyUntilBlank()
Dim last_row As Long, col1 as Long, col2 as Long
Dim rng as Range
col1 = Sheet1.Range("a2").value
col2 = Sheet1.Range("a3").value
last_row = Cells(1, col1).End(xlDown).Row
'This next line is better if there's any chance
' of blanks in this column
'last_row = Cells(Rows.Count, col1).End(xlUp).Row
With ActiveSheet
Set rng = .Range(.Cells(2, col2), .Cells(last_row, col2))
End With
For Each cell In rng.Cells
If cell.Value = "" Then
cell.Value = cell.Offset(-1, 0).Value
End If
Next cell
End Sub