Excel VBA强化脆弱的功能

时间:2018-08-29 03:09:18

标签: excel vba excel-2016

我创建了一个电子表格,用于跟踪我妻子的学生数据。有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版本经过配置,因此每次打开文件时都必须启用内容。

1 个答案:

答案 0 :(得分:0)

您可能正在处理损坏的文件。 Look at the workbooks.open method.在腐败负载下,有一些选项可能会有所帮助。试试这个,尝试一下是否其他情况在您的情况下效果更好。

Set wb_td = Workbooks.Open(Filename:=file_name, UpdateLinks:=False, ReadOnly:=False, corruptload:=xlRepairFile)