如何解决在Excel VBA中使用变量设置范围
我创建了一个for循环来检测在“ E7:AB7”范围内哪里出现空值。完成后,我想创建一个从E7到该空值的范围,以便它只能在该范围内复制和粘贴来自主表的数据。
例如,如果在X7中检测到空值,则范围必须为(“ E7:X7”)。 这是代码示例:
Sub Macro5()
For Each cell In Worksheets("Proof").Range("E7:AB7")
If IsEmpty(cell) Then
Dim Cval As Range
Set Cval = Worksheets("Proof").Range(cell.Address)
Exit For
End If
Next
Sheets("MasterSheet").Range("A3:AG5000").AdvancedFilter Action:= _
xlFilterCopy,CopyToRange:=Range("E7" & ":" & Cval),Unique:=False 'Here is where the dynamic range exists
End Sub
有人对如何将其应用于Range函数有想法吗? 谢谢!
解决方法
请使用下面的代码。
Private Sub Test()
Dim Rng As Range ' dynamic range in row 7
With Worksheets("Proof")
Set Rng = .Range(.Cells(7,"E"),.Cells(7,"E").End(xlToRight))
' use the line below to include the blank in the range
' Set Rng = .Range(.Cells(7,"E").End(xlToRight).Offset(0,1))
End With
' Debug.Print Rng.Address
Sheets("MasterSheet").Range("A3:AG5000").AdvancedFilter _
Action:=xlFilterCopy,_
CopyToRange:=Rng,_
Unique:=False 'Here is where the dynamic range exists
End Sub
Set Rng = .Cells(7,"E").End(xlToRight)
设置单个单元格的范围,该范围定义为从E7向右看的空白单元格之前最后使用的单元格。因此,从E7到该单元格的范围不包括空白单元格本身。因此,在您的示例中,如果E7本身为空白,则代码将崩溃,或者可能会设置范围D7:E7,而您都不希望这样做。因此,实际上,如您的代码建议的那样,您可能更希望在该区域中包含空白单元格。
您的代码CopyToRange:=Range("E7" & ":" & Cval)
有两个缺陷,其中至少一个被证明是致命的。一种是您在使用时计算范围。在我的代码中,范围是在使用前准备的,因此您可以在将其输入过滤器之前检查其地址。另一个缺陷是您没有指定应该在其上存在范围的工作表。因此,它将位于ActiveSheet上,该表可以是任何工作表。您可能会争辩说,我的代码也没有指定工作表。那不是完全正确的。尝试Debug.Print Rng.Worksheet.Name
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。