所以我的代码工作正常,直到IT升级到Excel 2013和SDI界面。现在看起来Sheets.Add函数没有返回正确的工作表。模板将添加到正确的工作簿(Template1)中,但是当我使用返回的工作表时,它会在所有VBA代码运行之前引用活动工作簿中的工作表。
Public Function Worksheet_AddTemplate(TargetBook As Excel.Workbook, _
TemplateFile as String) As Excel.Worksheet
Dim ws As Excel.Worksheet
Debug.Print TargetBook.Name 'Output-->Template1
Set ws = TargetBook.Sheets.Add( _
After:=TargetBook.Sheets(TargetBook.Sheets.Count), _
Type:=TemplateFile)
Debug.Print ws.Parent.Name 'Output-->Book1
Set Worksheet_AddTemplate = ws
Set ws = Nothing
End Function
其他人可以通过Excel 2013验证您是否发生了这种情况,并且我在这里没有遗漏任何东西。
由于
P.S。我使用类似的例程来创建模板工作簿/第一张表,没有任何问题。
编辑:正在从加载项调用代码。这是我如何调用函数,或多或少(我已经简化了例程,因为它会太长了)
Private Sub ImportDataFile()
Dim wb As Excel.Workbook
Dim ws As Excel.Worksheet
Dim sUnit As String, sTemplateFile As String
Dim u As Integer, nUnits As Integer
Application.ScreenUpdating = False
Application.EnableEvents = False
' ...Some setup stuff that I wont bother you with
sTemplateFile = Environ("Temp") & "\Template1.xlt"
For u = 0 To nUnits - 1
If wb Is Nothing Then
Set wb = Workbook_NewTemplate(sTemplateFile)
Set ws = wb.Worksheets(1)
Else
Set ws = Worksheet_AddTemplate(wb, sTemplateFile)
End If
ws.range("H6") = sUnit
' More Loops & writing to cells
For i = 0 To g_Data(f).ItemCount - 1
' Blah, blah, blah
Next
Next
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
答案 0 :(得分:1)
我注意到如果我在创建工作簿和添加第二个工作表之间的任何地方添加2x DoEvents
,它将像以前一样工作。
另外,如果我在Worksheet_AddTemplate
函数中使用此代码,它似乎可以工作......
Set wb = Application.Workbooks.Add(Template:=TemplateFile)
Set ws = wb.Worksheets(1)
ws.Copy After:=TargetBook.Sheets(TargetBook.Sheets.Count)
Set ws = TargetBook.Sheets(TargetBook.Sheets.Count)