sub不会遍历第二个if语句vba

时间:2014-09-20 20:25:18

标签: excel vba excel-vba

真的希望有人可以帮助我。所以我有以下代码。独立代码本身可以正常工作,但是在执行脚本时,它只会循环通过第一个条件。我想要它做的是每次循环所有代码。我认为这是一件我想念的小事,但我似乎无法找到解决方案。

Sub Copypre()
Dim i As Integer
Dim n As Integer

 For i = 2 To 10

'Checks the number of entries in the "Pre" table, to make sure that there are no spaces between the lines

 On Error Resume Next
    n = Worksheets("Pre").Range("A2:A6000").Cells.SpecialCells(xlCellTypeConstants).Count
        If n = Null Then
            n = i

'Goes through the different sheets to find all "pre" values and paste them in the "Pre" sheet

    If ThisWorkbook.Sheets("273").Range("A" & i).Value = "Pre" Then

        Range(Cells(i, 1), Cells(i, 3)).Select
        Selection.Copy
        Sheets("Pre").Select
        Range("A" & n).Select
        ActiveSheet.Paste
        Sheets("2736").Select

                 End If
            End If
         Next i
    End Sub

3 个答案:

答案 0 :(得分:1)

您的代码存在一些问题,但主要问题可能是If n = Null永远不会成立,因为整数不能为Null。您可以将其更改为If n = 0

需要考虑的几件事情:

错误处理:请尽快使用On Error GoTo 0恢复正常的错误处理。这样您就知道(假设工作簿中没有工作表"2736")您的代码正在尝试选择不存在的工作表。

范围参数:在使用Range(和Cells)参数时未指定工作表时要小心。当您在所选择的不同工作表之间切换回第四个和第四个时,会发生一个更改,您可能无法跟踪Range从哪个工作表返回数据。考虑声明每个工作表,然后复制您的范围,如:

Dim w273 As Worksheet
Set w273 = ThisWorkbook.Sheets("273")
w273.Range(w273.Cells(i, 1), w273.Cells(i, 3)).Copy

答案 1 :(得分:0)

循环可以使用长列数据快速消耗时间,我怀疑您的代码被大量编辑。尝试使用这种替代方法将块复制到目标工作表。

Sub Copypre()
    With Sheets("273").Cells(1, 1).CurrentRegion
        .AutoFilter
        .Columns(1).AutoFilter field:=1, Criteria1:="=Pre"
        If CBool(Application.Subtotal(103, .Offset(1, 0))) Then
            .Offset(1, 0).Resize(, 3).Copy _
              Destination:=Sheets("Pre").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
        End If
        .AutoFilter
    End With
End Sub

所有这些都可以在没有单一变量声明的情况下完成。

附录:

关于您的原始问题,整个if "pre"/copy/paste部分嵌套在if n = Null内,因此只有在n = Null为真时才能达到该部分。如果没有要计算的.SpecialCells(xlCellTypeConstants) n 将被分配其默认值(例如 0 )。 不等于 Null ,因此永远不会满足条件。要检查代码,请添加以下行。

On Error Resume Next
n = Worksheets("Pre").Range("A2:A6000").Cells.SpecialCells(xlCellTypeConstants).Count
Debug.Print "n is " & n

运行后,使用Ctrl+G打开立即窗口。如果Pre!A2:A6000中没有非公式值,您应该看到n is 0

答案 2 :(得分:0)

感谢分配所有建议。空技巧奏效了!我对VBA来说是全新的,所以从专家那里得到一些技巧和窍门很不错。我将尝试使代码更简单,如Jeeped所提到的,因为这不是很优雅。关于床单,我完全可以理解这种困惑,我也已经解决了这个问题。它现在有效,看起来像这样:

Sub Copypre()

    Dim i As Integer
    Dim n As Integer

    For i = 2 To 5000
        ' Checks the number of entries in the "Pre" table, to make sure that there are no spaces between the lines

        On Error Resume Next
        n = Worksheets("Pre").Range("A2:A6000").Cells.SpecialCells(xlCellTypeConstants).Count

        ' Goes through the different sheets to find all pre values and paste them in the "Pre" sheet
        If ThisWorkbook.Sheets("2736").Range("A" & i).Value = "Pre" Then

            Sheets("2736").Select
            Sheets("2736").Range(Cells(i, 1), Cells(i, 3)).Select
            Selection.Copy
            Sheets("Pre").Select
            Range("A" & (n + 2)).Select
            ActiveSheet.Paste
            Sheets("2736").Select

            Sheets("2736").Select
            Range(Cells(i, 5), Cells(i, 6)).Select
            Selection.Copy
            Sheets("Pre").Select
            Range("E" & (n + 2)).Select
            ActiveSheet.Paste
            Sheets("2736").Select

        End If
    Next i
End Sub