我将尝试尽可能地保持这个并且仍然充分解释,这里是:)
我搜索了论坛,我的VBA文献,但找不到办法去做我正在尝试的事情。
我有一个包含rowTotal> = 60行的电子表格。这些行在每列的单元格中都有文本数据,或者行是空白的,并且设置了图案和颜色索引。
我需要一个宏来选择所有非空行。
我首先尝试循环遍历列A的单元格(如果列A中的单元格具有文本数据,则应选择其行),检查activecell.value
<>空。
这是jist(伪代码和代码的混合):
Range("A1").Select
loop to end
if activeCell.value <> empty then
stringVar = stringVar + cstr(activeCell.row) + ":" + cstr(activeCell.row) + ","
end if
end loop
stringVar = Left(stringVar, (Len(stringVar) - 1))
Range(stringVar).Select
如果我有10行,第2行和第8行有数据,stringVar
会解析为:"2:2, 8:8"
。
Range(stringVar).Select
与撰写Range("2:2, 8:8").Select
。
如果范围内的行数是&lt; = 45,这没有问题。但是,只要包含数据的行数超过45,代码就会在Range(stringVar).Select
上失败。
我尝试了宏录制器并使用Union
方法解决了这个问题。所以我想,“自我,你可以用Union()来完成这个。万岁的MacroRecorder。”但是,唉,我的喜悦是疏忽
我以为我可以将一个大字符串拆分成一个或多个字符串;这些较小的弦中的每一个都将低于上述45限制。然后我可以使用Union()将所有范围(这些较小的字符串)组合到一个所需的范围内。
然而,在我知道其中有多少 45&gt;之后,我必须在代码执行期间实时“构建”我的Union()代码。字符串我有。
任何人都知道如何获取工作表并只选择包含数据的行;这相当于具有一系列非连续行,其中选择的行数超过45行。
答案 0 :(得分:7)
无需循环 - 使用SpecialCells
对于A列,仅使用:
Set rng1 = Columns("A").SpecialCells(xlCellTypeConstants).EntireRow
代替。
Sub QuickSet()
Dim rng1 As Range
On Error Resume Next
Set rng1 = Cells.SpecialCells(xlCellTypeConstants).EntireRow
On Error GoTo 0
If Not rng1 Is Nothing Then
MsgBox "Your working range is " & rng1.Address(0, 0)
Else
MsgBox "No constants found"
End If
End Sub
答案 1 :(得分:2)
我首先建议你尝试使用Autofilter。如果您使用的是Excel 2010(以及2007年的问题,但我无法检查),这就像选择数据,选择“数据”选项卡,然后单击“过滤”一样简单。使用第一列中的下拉框,取消选择“空白”。
Excel 2003中的“数据/过滤器”菜单选项下存在完全相同的功能。不过,我真的记不清楚了。你必须进行实验,或谷歌。
如果不起作用:
Sub it()
Dim cell As Range
Dim selectRange As Range
For Each cell In ActiveSheet.Range("A:A")
If (cell.Value <> "") Then
If selectRange Is Nothing Then
Set selectRange = cell
Else
Set selectRange = Union(cell, selectRange)
End If
End If
Next cell
selectRange.Select
' selectRange.EntireRow.Select 'If you want to select entire rows
End Sub
答案 2 :(得分:1)
刚刚使用了这段代码并且它起了作用 - 一直在跟踪所有其他excel论坛,但找不到任何简化的内容。
我还补充说,所选行被复制并粘贴到另一张表格中的下一个空行,如果有人发现这有用的话。
Sub copypaste1()
'Find rows that contain any value in column A and copy them
Dim cell As Range
Dim selectRange As Range
For Each cell In ActiveSheet.Range("A:A")
If (cell.Value <> "") Then
If selectRange Is Nothing Then
Set selectRange = cell
Else
Set selectRange = Union(cell, selectRange)
End If
End If
Next cell
selectRange.EntireRow.Select
selectRange.EntireRow.Copy
'Paste copied selection to the worksheet 'mega' on the next blank row
Sheets("mega").Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial _
Paste:=xlPasteValues
End Sub