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