我有一段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,复制,然后粘贴。
提前致谢
答案 0 :(得分:3)
使用Select
,Activate
和ActiveCell
在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
答案 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