2014-07-03 81 views
0

我有以下代码循环不断复位

Sub Split_data() 

' Split_data 

Dim iCtr As Long 
Dim Total As Long 
Dim Iterations As Long 
Dim FilePath As String 

' Save path for new files 
FilePath = "C:\DataFiles" 

' Create folder to store files 
If FileFolderExists(FilePath) Then 
    ' Delete first row with obsolete data 
    Rows("1:1").Select 
    Selection.Delete Shift:=xlUp 
Else 
    MkDir (FilePath) 
    ' Delete first row with obsolete data 
    Rows("1:1").Select 
    Selection.Delete Shift:=xlUp 
End If 

Total = Range("A1", Range("A1").End(xlDown)).Count 
Iterations = Application.WorksheetFunction.RoundUp(Total/2, 0) 

' Generate the files 
For iCtr = 1 To Iterations 
    Generate_Files iCtr, FilePath 
Next iCtr 

End Sub 

本身工作正常,除了1件事的代码,我已经完成了我的那一刻For循环,我的柜台神秘复位为1和它不断循环。

所以,如果我得到5行,它循环3次,iCtr值应该正常上升,但一旦第3次循环完成,它突然跳回到1并开始全部。

因此,任何人看到ZHY,因为我已经试过做的时候几次一步一步,但我找不到它ZHY跳码的回1

休息,如果它的事项:

Function Generate_Files(iCtr As Long, FilePath As String) 
' 
' Generates files which contain copied data of first copied x rows after which these rows are deleted 
' 

' Create variables 
Dim wb1 As Excel.Workbook 
Dim wb2 As Excel.Workbook 
Dim ws1 As Worksheet 
Dim ws2 As Worksheet 
Dim x As Integer 
Dim CurrPath As String 

' Stop screen flickering 
Application.ScreenUpdating = False 

' Initialise variables 
Set wb1 = ActiveWorkbook 
Set ws1 = Worksheets(1) 

    ' Create new workbook 
Set wb2 = Workbooks.Add(1) 

wb2.Activate 
Sheets(1).Name = "data" 
Set ws2 = Worksheets("data") 

' Set path of created file 
CurrPath = ThisWorkbook.FullName 

' Copy data from wb1 
wb1.Activate 
ws1.Select 
Rows("1:2").Select 
Selection.Copy 

' -!- 
' Copy done afterwards to prevent issues with copied values disappearing from copy clipboard while creating new file 
' -!- 

' Activate wb2 
wb2.Activate 
ws2.Select 

' Paste data in wb2 
Range("A1").Select 
ActiveSheet.Paste 
Application.CutCopyMode = False 

' Remove first x lines from original file 
wb1.Activate 
Rows("1:2").Select 
Selection.Delete Shift:=xlUp 

' Save & close wb2 
wb2.Activate 
ActiveWorkbook.SaveAs ("C:\DataFiles\Split Data" & iCtr) 
ActiveWorkbook.Close 

Application.ScreenUpdating = True 

End Function 



Public Function FileFolderExists(strFullPath As String) As Boolean 

On Error GoTo EarlyExit 
If Not Dir(strFullPath, vbDirectory) = vbNullString Then FileFolderExists = True 

EarlyExit: 
On Error GoTo 0 
End Function 
+0

很奇怪。你可以尝试用For循环中的断点来看循环开始时'Iterations'是否正确显示5而不是3,并且它在某种程度上不会改变。唯一的其他解释是,代码抛出一些错误,并退出没有任何显示在第三次迭代 – hnk

回答

1

试图声明你的函数是这样的:

Function Generate_Files(ByVal iCtr As Long, ByVal FilePath As String) 
' the rest of the function definition 

默认的参数的VBA FunctionSubByRef,这意味着调用的函数/子程序可以调用函数/子程序修改参数。 ByVal将阻止这一点。

后来编辑

另一种方法是强制编译器传递给ByVal在调用函数的参数转换:

For iCtr = 1 To Iterations 
    Generate_Files (iCtr), FilePath 
Next iCtr 

的解释here

+0

这似乎已修复它,但我仍然觉得它很奇怪,因为我不改变任何被调用的函数中的任何一个的值。但是,有些事情再一次没有意义。但是,非常感谢。 – Firefox333

+0

@ Firefox333我看到实际上这个函数并没有改变'iCal',我只是认为你没有粘贴整个代码。 –

0

尝试在循环未执行之前或之后确认该代码。可能再次调用整个Split_data函数,或者某种函数递归导致此函数的多个实例立即执行。尝试在循环之前和之后输出一些调试文本,并确保它只进入一次。

+0

我试着添加一个'MsgBox'显示我的计数器的值。这样可行。但是,当我删除'MsgBox'函数时,它将从无限循环开始。 – Firefox333

+0

我认为把MsgBox放在循环中,尽管对于一个目的有帮助,但不会公开可能被递归调用或不止一次调用Split_data的潜在问题。在循环之前尝试一个MsgBox仍然是值得的,如果它出现不止一次,你可以得出结论:循环没有重新开始,而是开始了另一个循环的副本。 – BlueMonkMN