2016-09-06 72 views
3

我有几个应用程序在传统的VB6中编写,内嵌了提取代码以创建EXCEL提取。我们正在从Excel 2007迁移到Excel 2013,并且遇到了一些问题。我运行Windows 10. 2007年,这是我的声明和Set语句用来工作就好了... ...Excel 2013中的VB6提取

Option Explicit 
Dim xlApp As Excel.Application 
Dim xlBook As Excel.Workbook 
Dim xlSheetA As Excel.Worksheet 

这些我都在模块的顶部。

在我的功能是将数据写入提取我做到这一点...

Set xlApp = New Excel.Application 
Set xlBook = XlApp.Workbooks.Add 
Set xlSheetA = xlBook.Worksheets.Add 

当它到达XLBook - 它挂起来,一切都停止工作。我得到一个错误:

This action cannot be completed because the other program is busy. Choose "SwitchTo' to activate the busy program and correct the problem.

现在,在我跑我的提取物我要确保Excel未在后台运行,检查我去任务管理器 - >过程并删除它,如果它的存在。我究竟做错了什么?我应该如何更改我的代码?

编辑屏幕截图:屏幕显示不显示我在我的应用程序中的代码。这是一个新项目,只是为了展示我使用的所有代码。 code error

+0

有趣的是,访问没有给我任何问题。我打开了应用程序并在访问中运行了一些报告 - 2013年,一切都很顺利。 – BobSki

+2

为了澄清,代码是VB6应用程序中的VB6代码,引用了Excel对象模型?如果是这样的话,我认为[vba]和[excel-vba]标签是令人困惑的事情。 –

+0

另外,'xlApp','xlBook'和'xlSheetA'是模块范围的,并且在函数的作用域中被赋值并不正确。一个'Function'不应该有副作用,并且你正在改变全局状态(无论如何,模块状态)。在函数退出后留下带有悬挂对象引用的'xlSheetA','xlBook'和'xlApp'。此外 - 只是一个编码风格的小点,但使用'Private'而不是'Dim'来声明模块级别的变量将使您更清楚地指出私有字段。 –

回答

2

您的函数1位于私有子类中,应该作为函数调用。显示的代码和屏幕截图也有所不同。我已经创建了一个快速样本,它在Excel 2013中的工作非常完美。将该子功能更改为...

Option Explicit 

Dim xlApp As Excel.Application 
Dim xlBook As Excel.Workbook 
Dim xlSheetA As Excel.Worksheet 

Private Function function1() 

Set xlApp = New Excel.Application 
Set xlBook = xlApp.Workbooks.Add 
Set xlSheetA = xlBook.Worksheets.Add 

Set xlSheetA = xlBook.Sheets.Item(1) ''the sheet you want to use 

xlApp.Visible = True 

xlApp.ActiveSheet.Cells(1, 1).Value = "TEST" 

xlApp.Workbooks.Close 

MsgBox "Excel Done" 
End Function 

Private Sub Command3_Click() 

Call function1 
End Sub 

希望这会有所帮助。

编辑:见下面的截图,做工精细...

Open Excel

+1

此外,请确保你有最新的Microsoft Excel对象库引用,认为你提到你只有1。 –

+1

只是稍微澄清一点,开关错误与调用另一个子(而不是函数),而当前子仍在尝试执行一些进程或命令。 –

+0

以及代码的第一部分来自我的实际应用程序,截图是从我做一个全新的项目 - 显示到底发生了什么 - 更容易我这样做,因为我的代码在应用程序是在不同的地方 – BobSki

1

龙背我有类似的问题。不知道这是否与您的情况有关。 我的代码正在更新打开的excel,它有一个处于编辑模式的单元格。在尝试了很多可能性之后,我关闭了屏幕更新和可见性,直到代码完成。类似于 xlApp.ScreenUpdating = False xlApp.Visible = False

+0

这不幸没有帮助。我明白你在做什么。这里的问题是,一旦它在Office 2013中设置xlapp = new excel.application行 - 它并没有给它一个价值,在2007年,当我运行它,并击中该行 - xlAPP成为“MICROSOFT EXCEL”,当我用鼠标悬停在它上面,它2013年没有说什么。 – BobSki