2

我有生成所选列的平面文本文件的

问题是该过程需要一段时间,因为通常单击列字母并突出显示整个列,包括所有未使用的单元格。

当找到第一个空行时,如何让宏停止处理?

这是我的代码。

Sub testlist()
Open "C:\Users\gaum\Desktop\Work\NCL\testlist.lst" For Output As #1
For NR = 1 To Selection.Rows.Count
For NC = 1 To Selection.Columns.Count
ExpData = Selection.Cells(NR, NC).Value
If IsNumeric(ExpData) Then ExpData = Val(ExpData)
If IsEmpty(Selection.Cells(NR, NC)) Then ExpData = ""
If NC <> NumCols Then
If Not ExpData = "FilePath" Then Print #1, ExpData
End If
Next NC
Next NR
Close #1
End Sub

如果我有多个选择,即 ctrl 并左键单击各个单元格,我也能够让宏产生输出,它目前只输出第一个突出显示。

非常感谢

4

2 回答 2

1

既然你问了两个不同的问题,我将分别解决它们。

遇到空白行时停止处理的最简单方法是在第二个For..Next循环之前添加检查。问题是如何检查。检查整个范围是否为空的最简单方法是使用CountA工作表函数。

If WorksheetFunction.CountA(Range(NR & ":" & NR).EntireRow) = 0 Then Exit For

以上将基本上使用工作表函数CountA并计算范围内非空白单元格的数量(CountA在这里使用很重要,因为Count工作表函数只会计算数字单元格而不是非数字单元格,而CountA除了空白之外的任何单元格都会计算在内。使用WorksheetFunction对象获得的另一个好处是,Range如果您只想检查几列而不是整行,只需指定特定Range而不使用.EntireRow.


下一个问题是如何处理多个选定的范围。类的另一个成员Selection称为Areas,它应该为您提供所需的功能。 Areas是一个集合,其中包含您所做的每个单独选择范围的范围。

您可以使用选择的从 1 开始的索引来独立引用每个选择范围:

NumAreaRows = Selection.Areas(1).Rows.Count 'gets the number of rows in the first selected range
NumAreaCols = Selection.Areas(2).Columns.Count 'gets the number of columns in the second selected range

因此,您可以将两者都放在您的解决方案中:

Sub testlist()
    Open "C:\Users\gaum\Desktop\Work\NCL\testlist.lst" For Output As #1

    For NA = 1 To Selection.Areas.Count
        For NR = 1 To Selection.Areas(NA).Rows.Count

            If WorksheetFunction.CountA(Range(NR & ":" & NR).EntireRow) = 0 Then Exit For

            For NC = 1 To Selection.Areas(NA).Columns.Count
                ExpData = Selection.Areas(NA).Cells(NR, NC).Value
                If IsNumeric(ExpData) Then ExpData = Val(ExpData)
                If IsEmpty(Selection.Areas(NA).Cells(NR, NC)) Then ExpData = ""
                If NC <> NumCols Then
                    If Not ExpData = "FilePath" Then Print #1, ExpData
                End If
            Next NC
        Next NR
    Next NA
    Close #1
End Sub

CountA此处的函数和语句的放置Exit For允许您独立循环遍历每个选定的范围,如果您在其中一个范围中有空白行,它将不会完全退出。

于 2013-07-15T09:15:58.087 回答
0

鉴于此过程需要一段时间,您最好不要停止在空白单元格处,并完全删除低效的范围循环。下面的代码

  • 使用变体数组而不是范围
  • 删除多余的两步IF测试(如果ExpData是数字,它也不能"FilePath"

代码

Sub testlist()
Dim X
Dim lngCnt As Long
X = Selection
If IsEmpty(X) Then Exit Sub
Open "C:\Users\gaum\Desktop\Work\NCL\testlist.lst" For Output As #1
For lngCnt = 1 To UBound(X)
If Len(X(lngCnt, 1)) = 0 Then Exit For
If IsNumeric(X(lngCnt, 1)) Then Print #1, Val(X(lngCnt, 1))
Next
Close #1
End Sub
于 2013-07-13T05:15:10.067 回答