【发布时间】:2016-03-28 16:10:04
【问题描述】:
我创建了一个在单击按钮上启动的脚本,因此它从路径和格式加载 CSV 文件,然后保存它。因为我有来自 1...10000 的文件,所以我制作了 1.txt 等文件。 我遇到的问题是当它开始时一切正常,但是在 10-13 个文件之后它给出错误并且 excel 关闭。以下是我正在使用的代码。请在我做错的地方帮助我。我认为我在尝试 redim 的数组中犯了错误,但是那个给了我同样的错误。这是我放置在按钮上以启动进程的子程序。由于我有数千个文件,所以请建议我解决方案。
Sub WorkbooksLoop()
' get the list of filenames
Dim pageStart As Integer
Dim pageEnd As Integer
pageStart = CInt(Cells(3, "C").Value) ' getting from cell of excel sheet
pageEnd = CInt(Cells(4, "C").Value) ' getting from cell of excel sheet
Dim Filenames(44) As String ' variable I know there are 44 files
For j = pageStart To pageEnd
Filenames(j) = CStr(j) + ".txt"
Next j
On Error GoTo NoFilenames
Dim controllerwb As Workbook
Set controllerwb = ActiveWorkbook
Dim wb As Workbook
Dim fname As Variant
Dim rootPath As String
rootPath = ThisWorkbook.Path
rootPath = rootPath & "\"
For Each fname In Filenames
' Make the controller active
controllerwb.Activate
On Error Resume Next
' If activate fails, then the workbook isn't open
Workbooks(fname).Activate
' If activate fails, then the workbook isn't open
If Err <> 0 Then
OpenFile (rootPath & fname)
Set wb = ActiveWorkbook
wb.Activate
' Otherwise, workbook is already open, refer to it by name
Else
OpenFile (rootPath & fname)
Set wb = ActiveWorkbook
End If
' do something to the open workbook my process to format sheet
deletingRowsColumns
ledgerSetup
resizeColumns
columnLines
columnAlignments
mergeTitles
settingNames
wb.Close
Next fname
NoFilenames:
End Sub
【问题讨论】:
-
您对
On Error Resume Next的不当使用可能会隐藏在调用过程中发生的错误,例如deletingRowsColumns、ledgerSetup等。 -
我建议在
End If语句之后 立即添加On Error GoTo 0。这将恢复正常的错误处理,并帮助识别任何其他调用过程中的错误。 -
还要考虑描述错误出现在哪一行,以及您收到的具体错误消息。
-
另外,当调试器启动时,看看它是否是同一个工作簿,这会导致错误。是文件夹循环中的错误还是正在调用的其他代码?这是另一个遍历文件夹的例子。Loop through folder
-
另外:(1)不要依赖
ActiveWorkbook。始终获取打开或创建工作簿时获得的工作簿对象。 (2) IF 语句的(Err <> 0)和(Err = 0)部分都在做同样的事情(工作簿不需要处于活动状态) (3) 我在任何地方都看不到保存。 (4)在FOR循环前放一个Debug.Print pageStart & " - " & pageEnd(5)在deletingRowsColumns前放一个Debug.Print wb.name(6)写死前Excel报的错误
标签: vba excel csv excel-2007