在VB.net中执行Excel中的事件,主程序被初始化
问题描述:具体的需求比较复杂,我就不说了,在出现问题后,我将问题进行了排查,最后发现问题所在,并简化程序如下:
1、新建一个Visual Basic.NET的窗口项目,然后在项目中引用了Excel。
2、然后在主程序启动时创建了一个新的Excel程序,为了执行Excel关闭的事件,添加了一个新的Workbook以用来引发Excel的Application.WorkbookBeforeClose事件
3、测试时一共执行三步操作: 先点击主程序窗口,此时立即窗口中显示:
在主程序中:123
在testclass类中:123
4、然后点击关闭Excel程序,此时立即窗口中显示:
在testclass类的WorkbookBeforeClose事件中:0
说明:在调试时,发现在提取Form1.WillReNew属性值时,会再次进入类Form1,对其中的每一个属性值进行初始化!!!
我猜测问题的关键词可能与“线程”有关。
5、最后再点击主程序窗口,此时立即窗口中显示:
在主程序中:123
在testclass类中:123
问题就是:
为什么在第4步时要对Form1进行初始化(类似于重新声明了一个Form1的对象),这样我就没法在这个事件中对原来的主程序Form1进行相关操作了。
而第5步又说明原来的Form1的对象还是存在的。
代码如下:
1.在窗口类Form1:
******************************************************
2、在类testclass中:
****************************************
1、新建一个Visual Basic.NET的窗口项目,然后在项目中引用了Excel。
2、然后在主程序启动时创建了一个新的Excel程序,为了执行Excel关闭的事件,添加了一个新的Workbook以用来引发Excel的Application.WorkbookBeforeClose事件
3、测试时一共执行三步操作: 先点击主程序窗口,此时立即窗口中显示:
在主程序中:123
在testclass类中:123
4、然后点击关闭Excel程序,此时立即窗口中显示:
在testclass类的WorkbookBeforeClose事件中:0
说明:在调试时,发现在提取Form1.WillReNew属性值时,会再次进入类Form1,对其中的每一个属性值进行初始化!!!
我猜测问题的关键词可能与“线程”有关。
5、最后再点击主程序窗口,此时立即窗口中显示:
在主程序中:123
在testclass类中:123
问题就是:
为什么在第4步时要对Form1进行初始化(类似于重新声明了一个Form1的对象),这样我就没法在这个事件中对原来的主程序Form1进行相关操作了。
而第5步又说明原来的Form1的对象还是存在的。
代码如下:
1.在窗口类Form1:
******************************************************
Imports Microsoft.Office.Interop.Excel
Public Class Form1
Private ReNew As Integer
Public Property WillReNew As Integer
Get
Return ReNew
End Get
Set(value As Integer)
ReNew = value
End Set
End Property
Dim b As testclass
Private Sub Form1_Click(sender As Object, e As EventArgs) Handles Me.Click
Debug.Print("在主程序中:" & Me.WillReNew)
'第一次点击时返回123,第二次点击时还是返回123
Call b.test()
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
ReNew = 123 '对Form1的WillReNew属性进行初始化,为123。
b = New testclass
b.application = New Application
b.application.Visible = True
b.application.Workbooks.Add()
End Sub
End Class
2、在类testclass中:
****************************************
Imports Microsoft.Office.Interop.Excel
Public Class testclass
Private WithEvents app As Application
Public Property application As Application
Get
Return app
End Get
Set(value As Application)
app = value
End Set
End Property
Public Sub test()
Debug.Print("在testclass类中:" & Form1.WillReNew)
' '第一次点击时返回123,第二次点击时还是返回123
End Sub
' 出现问题的事件
Private Sub refresh(wkbk As Workbook, ByRef cancel As Boolean) _
Handles app.WorkbookBeforeClose
Debug.Print("在testclass类的WorkbookBeforeClose事件中:" & Form1.WillReNew)
'这里Form1.WillReNew返回integer的初始值0,
'在调试中发现它进入Form1中对其每一个属性或域值进行了初始化
'(类似于重新声明了一个Form1的对象)
'猜测可能是线程的问题,因为下一次点击窗口时还是能返回123
End Sub
End Class
...全文
相关推荐
vb.net 编程读取excel文件中的数据
使用vb.net语言编写的excel文件数据读取和保存,可以实现读取数据的显示,希望大家可以多学习交流下。
vb.net将excel中的数据导入到数据库
vb.net将如何将excel中的数据导入到数据库
用VB制作EXCEL插件
如果你想将EXCEl内的VBA封装成DLL文件,可看这里啊
VB.Net实现读取本地EXCEL
用VB.Net实现读取本地Excel文件,并获取excel中内容
VSTO开发Excel工具箱源码(VB.NET版).zip
VSTO开发Excel工具箱源码(VB.NET版),VB.NET连接SQL serve数据库,远程数据库,异步委托、VB.net画甘特图等等源码,有注释等等,超值


COM/DCOM/COM+
