如何捕获单元格地址作为变量并在VB代码中使用?

时间:2013-03-22 21:14:30

标签: excel variables excel-vba cell vba

需要一个代码段;如果有一位善良的大师可以提供帮助,请。我需要在XL VBA中表达以下光标移动顺序。

在单元格A1中输入公式后(Col-A否则为空),我需要将公式复制到A1:AN范围内的所有单元格,其中N是表格的最后一行。

我录制了一个宏来执行以下操作(下面的代码):

1)输入公式(在单元格A1中)

2)复制公式

3)右转到B1

4)转到Col-B中最后一个填充的单元格[使用Ctrl + Down](查找最后一行的最简单方法)

5)左转到Col-A

6)从当前选择所有单元格到A1

7)将公式粘贴到选择

我需要帮助的部分是一种在步骤5中将单元格地址捕获为变量的方法,以便我可以在一系列具有可变行数的文件上使用此宏。

这是录制的宏。在此示例中,表中的最后一行是7952。

Sub test()
    ActiveCell.FormulaR1C1 = "=LEFT(RC[1],3)"
    ActiveCell.Select
    Selection.Copy
    ActiveCell.Offset(0, 1).Range("A1").Select
    Selection.End(xlDown).Select
    ActiveCell.Offset(0, -1).Range("A1").Select
    Range(Selection, Selection.End(xlUp)).Select
    ActiveCell.Offset(-7951, 0).Range("A1:A7951").Select
    ActiveCell.Activate
    ActiveSheet.Paste
End Sub

3 个答案:

答案 0 :(得分:0)

我不确定你的结尾单元格是否总是相同,这意味着你可能想要“取消”硬编码行,但你可以试试这个。

Sub test()
    Range(Cells(1, 1), Cells(7951, 1)) = "=LEFT(RC[1],3)"
End Sub

如果你总是根据B栏中使用的行数在A栏中放置方程式,你可以试试这个。

Sub test()
    ' dimension the variable type
    Dim lastRow As Long
    ' select cell "B1"
    Cells(1, 2).Select
    ' jump to the last consecutive row in column B
    Selection.End(xlDown).Select
    ' collect the row number into a variable
    lastRow = ActiveCell.Row
    ' paste the equation into the variable length range
    Range(Cells(1, 1), Cells(lastRow, 1)) = "=LEFT(RC[1],3)"
End Sub

答案 1 :(得分:0)

请将以下代码复制到工作表中。

Private Sub Worksheet_Change(ByVal Target As Range)

    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual


    If Target.Address = "$A$1" And Target.Count = 1 And Target.HasFormula Then

        Dim lastRow As Long
        lastRow = Range("A65000").End(xlUp).Row

        Dim rng As Range
        Set rng = Range("A2:A" & lastRow)

        '        Target.Copy
        '        rng.PasteSpecial xlPasteFormulas

        'OR
        '  rng.Formula = Target.Formula

       ' OR

        rng.FormulaR1C1 = Target.FormulaR1C1

    End If

    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
End Sub

答案 2 :(得分:0)

感谢Todd和user2063626,

我决定采用更简单的方法。我只需要获取最后一行以设置我的选择区域;在要写入的实际值中不使用最后一行的编号。要操纵的文件是平的ascii导出;列布局是常量,只有行数是可变的。

将公式写入A1后,我向下移动B列并一次测试一个单元格的值;如果为TRUE,则将公式复制到左侧相邻单元格;如果为FALSE,则结束流程。

Sub FillClientCodes()

    Range("A1").Select
    ActiveCell.FormulaR1C1 = "=LEFT(RC[1],3)"
    ActiveCell.Select
    Selection.Copy
    ActiveCell.Offset(0, 1).Select
    ActiveCell.Offset(1, 0).Select
CheckCell:
    ActiveCell.Activate
    If ActiveCell.Value <> 0 Then
        ActiveCell.Offset(0, -1).Select
        ActiveCell.Activate
        ActiveSheet.Paste
        ActiveCell.Offset(0, 1).Select
        ActiveCell.Offset(1, 0).Select
        GoTo CheckCell
    Else: GoTo EndOfData
    End If
EndOfData:

End Sub

它不优雅 - 它运行速度比单个选择和粘贴慢 - 但它可以工作,它将适用于我需要处理的所有文件。再次感谢。