我创建了一个电子表格,用于跟踪我妻子的学生数据。有2个版本,主版本和教师版本。唯一的区别是教师版本隐藏了几个选项卡和按钮。
每天结束时,她都会收集教师版本,并使用附加到按钮的宏将其数据合并到主版本中。定期导致Excel崩溃。似乎试图将USB记忆棒上的工作簿合并是使其崩溃的一种可靠方法,但是还有其他情况我还没有确定。
她没有足够的技术来逐步检查代码,直到代码被炸毁为止,而我在做代码时却不能在那里。
先前对代码进行强化的尝试包括摆脱Activesheet或Activeworkbook的任何实例,并且始终使用对工作表的直接引用(即Sheet1,但重命名为有意义的名称-在下面的示例中为“ merge”)。
下面的函数LoadTeacherData被每个工作簿合并调用一次。它所做的就是将现有记录复制到教师的“数据”选项卡上,将它们复制到主合并选项卡,然后从源中删除它们。我认为,当崩溃时,它是在选择要加载的文件后立即进行的。
Sub LoadTeacherData()
Dim wb_td As Workbook
Dim td As Worksheet
Dim newdata As Range
With Application.FileDialog(msoFileDialogOpen)
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "Excel files", "*.xlsm"
If .Show = -1 Then
file_name = .SelectedItems(1)
Else
Exit Sub
End If
End With
Application.ScreenUpdating = False
Set wb_td = Workbooks.Open(Filename:=file_name, UpdateLinks:=False, ReadOnly:=False)
If wb_td Is Nothing Then
MsgBox "Unable to open file, check path", vbOKOnly
Exit Sub
End If
file_name = wb_td.Name
Set td = wb_td.Worksheets("data")
row = LastRow(td, "C")
col = LastCol(td, 1)
Set newdata = td.Range("a2", td.Cells(row, col))
newdata.Copy Destination:=Merge.Cells(LastRow(Merge, "C") + 1, 1)
newdata.Clear
MsgBox (row - 1 & " records merged")
wb_td.Close
ThisWorkbook.Activate
ThisWorkbook.Save
Application.ScreenUpdating = True
End Sub
Function LastRow(ByRef ws As Worksheet, ByVal colname As String)
LastRow = ws.Range(colname & ws.Rows.Count).End(xlUp).row
End Function
Function LastCol(ByRef ws As Worksheet, ByVal rownum As Long)
LastCol = ws.Cells(rownum, ws.Columns.Count).End(xlToLeft).Column
End Function
我怀疑打开文件时它与权限有关。她的excel版本经过配置,因此每次打开文件时都必须启用内容。
答案 0 :(得分:0)
您可能正在处理损坏的文件。 Look at the workbooks.open method.在腐败负载下,有一些选项可能会有所帮助。试试这个,尝试一下是否其他情况在您的情况下效果更好。
Set wb_td = Workbooks.Open(Filename:=file_name, UpdateLinks:=False, ReadOnly:=False, corruptload:=xlRepairFile)