2014-09-20 87 views
0

真的希望有人能帮助我。所以我有以下代码。独立代码本身可以很好地工作,但是在执行脚本时,它只能通过第一个条件循环。我希望它做的是每次循环遍历所有的代码。我认为这是我错过的一件小事,但我似乎无法找到解决方案。sub不会循环通过第二条语句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 
+1

目前尚不清楚源工作表是否被命名为* 273 *或* 2736 *。 – Jeeped 2014-09-20 21:15:32

+0

很难弄清楚你的问题是什么,但是你肯定有一些错误的代码,如果'n = null'。 'n'被定义为一个整数,不能为空。你应该改变你的测试为'If n = 0'。也许这会解决你的问题。 – DeanOC 2014-09-20 21:16:56

+0

你如何从一张纸到另一张纸(如果这是你想要的)? – pnuts 2014-09-20 21:18:54

回答

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将被分配其默认值(例如,)。 不等于因此条件从未满足。要检查您的代码,请添加以下行。

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

+0

但是OP似乎想要处理多个表单? – pnuts 2014-09-20 21:34:13

+0

@pnuts =是的,工作表名称有些不明确之处。我推断这只不过是一个错字,但我可能在这一点上是错误的。 – Jeeped 2014-09-20 21:47:35

+0

同意可能会或可能不会是一个错字,但我正在考虑评论“通过不同的工作表...” – pnuts 2014-09-20 21:49:22

1

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

一对夫妇的事情要考虑:

错误处理:随时回到正常的错误,尽快与On Error GoTo 0处理。这样你就会知道(假设你的工作簿中没有工作表"2736"),你的代码试图选择一个不存在的工作表。

Range参数:要当心当使用Range(和Cells)参数时,不指定片材。当您在选择的不同工作表之间切换回来和第四次时,会发生一些变化,您可能会疏忽跟踪Range从中返回数据的工作表。考虑申报每个工作表,然后复制你的范围,如:

Dim w273 As Worksheet 
Set w273 = ThisWorkbook.Sheets("273") 
w273.Range(w273.Cells(i, 1), w273.Cells(i, 3)).Copy 
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