【问题标题】:Use Cell Value Reference in VBA to determine range在 VBA 中使用单元格值引用来确定范围
【发布时间】:2015-03-03 05:21:50
【问题描述】:

我知道这是一个非常基本的问题,但我仍在努力培养我的 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 宏中,我希望根据 sheet1 中的单元格值确定 Cells(r,6) 中的列引用 - 例如,如果工作表 1 上的单元格 A1 中的值为 2,它将改变列对“2”的引用(B 列)。

我希望复制/粘贴宏也能发生同样的情况。我很确定这只是对 A1.Value 的一些引用,但我不知道如何正确编写这样的东西。

感谢您的支持,在社区的所有支持下,我已经走了很长一段路。

【问题讨论】:

    标签: vba excel reference range


    【解决方案1】:

    一个使用你的第一个子的例子:

    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
    

    【讨论】:

    • 谢谢,我没有为第二个子添加细节,因为一旦我知道了参考的方法/语法,我希望能弄清楚其余的 :).. 谢谢!我会尝试并回复您。
    • 仅供参考 - 在您的第二个子中,您可以删除 cell.Activate 行,然后在任何有 ActiveCell 的地方使用 cell。使用 VBA 时很少需要激活或选择范围。
    • 谢谢,我实际上正在努力在第二个子上进行更改(第一个效果很好)。我也希望它是动态的,在这种情况下,我有一个对 last_row "Range("F1").End(xlDown).Row" 的单元格引用和另一个对 "rng=Range("d2:d" & last_row) "
    • 太棒了!!!!我也喜欢您的建议,即更改列中的空白单元格。经过测试,效果非常好!再次感谢!
    猜你喜欢
    • 2020-02-09
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    相关资源
    最近更新 更多