Excel VBA基于变量选择范围

时间:2018-06-01 10:26:54

标签: excel excel-vba vba

我有一段VBA代码,它从电子表格中获取数据并将其格式化为输入文件。此代码循环遍历每个列标题,以确保它可以找到它要查找的列,然后偏移一个以从标题行中取出,然后将数据复制到另一个模板。

但是这个工作表被多个用户使用,并且填充的行数可能会有所不同,因此我设置了一个名为rowcount的变量。在这个例子中,我正在处理我有5条记录,所以我试图选择从活动单元格到行计数值(5)的范围,但我只是停留在以下行:

ActiveSheet.Range(ActiveCell, RowCount).Select

以下是此部分的完整代码,我知道我所做的是错误的,但通过Google进行的任何搜索都会产生过于具体的结果,我无法调整代码以便为我工作。

If ActiveCell.Value = "Account Name" Then
           ActiveCell.Offset(1, 0).Select

           If ActiveCell.Value <> "" Then
                ActiveSheet.Range(ActiveCell, RowCount).Select
                Selection.Copy
                Sheets("Input").Activate
                ActiveSheet.Range("C2").Select
                Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                 :=False, Transpose:=False
                Application.CutCopyMode = False
                Worksheets("Account Details").Select
           End If

        End If

对于拥有更多VBA知识的人,我确信它很简单,但我实际上是在尝试突出显示Activecell,然后是变量,所以在这种情况下A5:A10,复制,然后粘贴。

提前致谢

5 个答案:

答案 0 :(得分:3)

使用SelectActivateActiveCell在VBA中不被视为良好做法。见How to avoid using Select in Excel VBA

然而,学会避免这些需要时间。因此,在您的代码中更改此行:

ActiveSheet.Range(ActiveCell, RowCount).Select

对此:

ActiveSheet.Range(ActiveCell, Cells(Rows.Count, ActiveCell.Column)).Select

如果你声明并设置正确rowCount,那么这是一个可能的选择:

Dim rowCount As Long: rowCount = 5
ActiveSheet.Range(ActiveCell.Column, rowCount).Select

答案 1 :(得分:2)

或者只是使用:

ActiveCell.Resize(RowCount,1).Select

其中1是列数。

答案 2 :(得分:2)

首先是你的,

 If ActiveCell.Value = "Account Name" Then
       ActiveCell.Offset(1, 0).Select

       If ActiveCell.Value <> "" Then
            ActiveCell.RESIZE(RowCount, 1).Select   '<~~ resize to the # of rows
            Selection.Copy
            Sheets("Input").Activate
            ActiveSheet.Range("C2").Select
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
             :=False, Transpose:=False
            Application.CutCopyMode = False
            Worksheets("Account Details").Select
       End If

 End If

现在没有Select,Activate或ActiveCell

dim c as variant
with worksheets("sheet1")  'you should know what worksheet you are starting out on
    c = application.match("Account Name", .rows(4), 0)
    if not iserror(c) then
        if .cells(5, c).Value <> "" then
            workSheets("Input").Range("C2").resize(RowCount, 1) = _
               .cells(5, c).resize(RowCount, 1).value
        end if
    end if
end with

How to avoid using Select in Excel VBA

答案 3 :(得分:1)

At the moment in your range you have just the activecell and row number.

Try something like this:

ActiveSheet.Range(activecell.address &":" &cells(RowCount,ActiveCell.Column).address).select

答案 4 :(得分:1)

不要选择要复制的范围;实现这样的事情应该为你做的工作:

Sub Test()
Dim RNG As Range
If ActiveCell.Value = "Account Name" Then
    With ActiveSheet
        Set RNG = .Range(.Cells(ActiveCell.Row + 1, ActiveCell.Column), ActiveSheet.Cells(.Cells(ActiveSheet.Rows.Count, ActiveCell.Column).End(xlUp).Row, ActiveCell.Column))
    End With
    RNG.Copy Sheets("Input").Range("C2")
End If
End Sub