Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA基于变量选择范围_Excel_Vba - Fatal编程技术网

Excel VBA基于变量选择范围

Excel VBA基于变量选择范围,excel,vba,Excel,Vba,我有一段VBA代码,它从电子表格中获取数据并将其格式化为输入文件。这段代码循环遍历每个列标题,以确保它可以找到要查找的列,然后偏移1以离开标题行,然后将数据复制到另一个模板 但是,此工作表由多个用户使用,并且填充的行数可能不同,因此我设置了一个名为rowcount的变量。在本例中,我处理了5条记录,因此我尝试选择从活动单元格到行计数值(5)的范围,但我只停留在以下行: ActiveSheet.Range(ActiveCell, RowCount).Select 下面是这一部分的完整代码,我知道

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

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

ActiveSheet.Range(ActiveCell, RowCount).Select
下面是这一部分的完整代码,我知道我做的是错误的,但是任何通过谷歌搜索的结果都太具体了,我无法调整代码来为我工作

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
如果ActiveCell.Value=“Account Name”,则
ActiveCell.Offset(1,0)。选择
如果ActiveCell.Value为“”,则
范围(ActiveCell,RowCount)。选择
选择,复制
工作表(“输入”)。激活
ActiveSheet.Range(“C2”)。选择
Selection.Paste特殊粘贴:=xlPasteValues,操作:=xlNone,SkipBlank_
:=假,转置:=假
Application.CutCopyMode=False
工作表(“帐户详细信息”)。选择
如果结束
如果结束
对于有更多VBA知识的人来说,我相信这很容易,但我基本上是想突出显示Activecell并向下到变量,所以在本例中是A5:A10,复制,然后粘贴


提前感谢

使用
选择
激活
活动单元格
在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

目前在您的范围内,您只有activecell和行号

试着这样做:

ActiveSheet.Range(activecell.address &":" &cells(RowCount,ActiveCell.Column).address).select
或者直接使用:

ActiveCell.Resize(RowCount,1).Select
其中1是列数。

首先

 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
如果ActiveCell.Value=“Account Name”,则
ActiveCell.Offset(1,0)。选择
如果ActiveCell.Value为“”,则

调整大小(行数,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

嘿,这并不是对你问题的回答,但有一点值得注意:一般来说,避免使用诸如
ActiveCell
ActiveSheet
或甚至
之类的选择器是一种很好的做法。。这些通常会导致问题和各种超出范围的错误。尽可能避免在将来使用它们。更多关于如何替换它们的信息,请参见@Jeeped-由于未定义
RowCount
,我已确定这是一个编译错误,因此我对其进行了改进:)感谢所有答案,但Jeeped我成功地使其与resize一起工作。关于不使用select等也有很好的建议。我很好奇为什么这不是一个好的做法,所以我会在提供的链接上做一些阅读。您定义范围的单元格不合格@Jeeped,谢谢你的链接。我读了一本有趣的书,并(试图)加以应用。现在对吗?是的,看起来好多了。
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