VB6中向excel写数据,无法获取第二个工作薄对象?

时间:2022-02-10 05:06:18
下面程序运行中发现一个问题就是第一次获取excel工作薄对象可以成功,而新建一个工作薄后就无法获取到新的对象。类似的代码我在其他程序中也有用过都没发现什么问题,但这段程序怎么也无法成功写入数据,最终保持的文件是个空文件。
ps:程序略有简化,公共变量和数组声明没写

Private Sub Command1_Click()
   Dim path As String
   Dim FileType As String
   Dim excelcj As Excel.Application
Dim exbook1 As Excel.Workbook
Dim exsheet1 As Excel.Sheets
     Dim Fname As String '定义文件名
On Error Resume Next
 m = 0
   i = 1
  path = Combo1.Text
     FileType = "*"
FileName = "d:\1.xls"
10
   SearchFiles path, FileType '调用子程序,返回查找清单。
 If a <= 62000 Then GoTo 30   '如果数据量超过62000条就一次性写入excel     
If Dir(FileName) = "" Then '看文件是否存在,有则打开,没有则建一个
Set excelcj = CreateObject("excel.application")
excelcj.SheetsInNewWorkbook = 1
Set exbook1 = excelcj.Workbooks().Add
Set exsheet1 = exbook1.activesheets("sheet1")
Else
Set excelcj = GetObject("excel.application")
 
Set exbook1 = excelcj.Workbooks.Open("d:\1.xls")

Set exsheet1 = exbook1.activesheets
 End If

 If m = 0 Then
 GoTo 20
 Else
 End If

 Do Until exsheet1.Application.Cells(m + 1, 1) = ""
'
 m = m + 1
 Loop
 
20
 If a <= 62100 Then
   Do Until i = a 
 exsheet1.Application.Cells(i, 1) = Files(i)
   i = i + 1
  Loop
Else
         For i = i To 62100
         exsheet1.Application.Cells(i, 1) = Files(i)
        Next i
    i = 1
        exbook1.Worksheets.Add
    Set exsheet1 = exbook1.ActiveSheet
    For i = i To a - 62100
  
      exsheet1.Application.Cells(i, 1) = Files(i + 62100)
     Next i
End If
excelcj.DisplayAlerts = False
exbook1.SaveAs ("d:\1.xls")
  excelcj.DisplayAlerts = True
        exbook1.Close
excelcj.Quit
  a = 1
30
  MsgBox "OK"
  Unload Me
  
End Sub

11 个解决方案

#2


引用 1 楼  的回复:
参阅:http://download.csdn.net/detail/veron_04/2341786

教科书能包治百病还要论坛做什么。

#3


On Error Resume Next去掉,慢慢调试.excel和程序都是可见的,你觉得应该有输出的地方,看看有没有输出.

你的程序太混乱了,
现在什么年月了还用On Error Resume Next和goto呀,
用if块可以操作的,要用goto.
查找xls里面有多少数据行的有现成的属性,你要一行一行的判断.
xls赋值也可以直接用数组赋值.

教科书不能治百病,缺能提高水平.

#4


引用 3 楼  的回复:
On Error Resume Next去掉,慢慢调试.excel和程序都是可见的,你觉得应该有输出的地方,看看有没有输出.

你的程序太混乱了,
现在什么年月了还用On Error Resume Next和goto呀,
用if块可以操作的,要用goto.
查找xls里面有多少数据行的有现成的属性,你要一行一行的判断.
xls赋值也可以直接用数组赋值.

教科书不能治百病,缺能提……


我是刚学用VB,这些语法都是教程和网上搜来的,不知道现在都有什么更高效的方法。
其实我的问题很简单,就是同一条语句为什么第一可以获得对象,第二次就无法获得。所有把代码都贴出来就是因为自己不知道哪里有问题导致的。我想高手应该看到上下几个关键语句就能分析出来吧。

教科书的作用是解释基础技能,不可能把所有问题都告诉我。别告诉我你是MSDN都搞明白了才开始写代码的。

#5


虽然我的问题可能很初级,但是也请指出来是哪里有问题。想表现自己很有水平请拿出实力来,那种见问题就丢本教程出来唬人的未必真有多少料。

#6


Set exsheet1 = exbook1.activesheets("sheet1")
Set exsheet1 = exbook1.activesheets("sheet2")
Set exsheet1 = exbook1.activesheets("sheet3")
就这原理就是了

#7


引用 5 楼  的回复:
虽然我的问题可能很初级,但是也请指出来是哪里有问题。想表现自己很有水平请拿出实力来,那种见问题就丢本教程出来唬人的未必真有多少料。


问题没有表述清楚,你想用这程序干什么的? 出现了什么错误。

第一次可以 第二次不可以是不是指主程序没关的情况,如果是主要是定义好的对象没有释放或重新定义
Set excelcj = CreateObject("excel.application")
excelcj.SheetsInNewWorkbook = 1
Set exbook1 = excelcj.Workbooks().Add
Set exsheet1 = exbook1.activesheets("sheet1")

我们不是是MSDN都搞明白了才开始写代码的,而是在不断错误中修改中成长的
On Error Resume Next会把错误都忽略掉,你怎么调试啊,把它去掉,你就知道问题所在了


#8


高手都是从错误中成长的

#9


无法获取第二个工作薄对象?是sheet2表吗?

#10


引用 7 楼  的回复:
引用 5 楼 的回复:

虽然我的问题可能很初级,但是也请指出来是哪里有问题。想表现自己很有水平请拿出实力来,那种见问题就丢本教程出来唬人的未必真有多少料。


问题没有表述清楚,你想用这程序干什么的? 出现了什么错误。

第一次可以 第二次不可以是不是指主程序没关的情况,如果是主要是定义好的对象没有释放或重新定义
Set excelcj = CreateObject("excel……

你说的是一种可能,不过这个程序是单独运行的,没有上层的程序。我自己也猜想可能是定义的对象没有得到完全释放的原因,不过找不出错误来所以才贴出代码。至于说到On Error Resume Next这条语句是我特意设置来防止某些excel单元格内容不规范导致程序中断才设置的。调试的时候自然是一句一句看着运行的。
我上面说的话可能有些重,不过绝对是事实,因为我这段代码其实并不长,有点乱但是语法很简单。被我喷的人一看到多一点代码就眼晕,既不想认真看又要显示自己二把刀的水平才那么说。
学程序每个人都是边看资料边摸索这么过来的,大家都一样。VB现在用的人越来越少了,想请教点问题很难找到真正有用的帮助,新手一上来就被这样的人忽悠一下以后谁还来这里啊。

#11


最后也感谢上面各位的帮助,这个问题已经解决了。但是问题的原因我还是不知道,解决的方法很简单:我换了一台电脑,用另一个同事的电脑调试,代码没变,调试通过。。。。。我看了一下我们两台电脑唯一的区别是他的XPSP2,我的是WIN2003SP2,其他环境都一样。

#1


#2


引用 1 楼  的回复:
参阅:http://download.csdn.net/detail/veron_04/2341786

教科书能包治百病还要论坛做什么。

#3


On Error Resume Next去掉,慢慢调试.excel和程序都是可见的,你觉得应该有输出的地方,看看有没有输出.

你的程序太混乱了,
现在什么年月了还用On Error Resume Next和goto呀,
用if块可以操作的,要用goto.
查找xls里面有多少数据行的有现成的属性,你要一行一行的判断.
xls赋值也可以直接用数组赋值.

教科书不能治百病,缺能提高水平.

#4


引用 3 楼  的回复:
On Error Resume Next去掉,慢慢调试.excel和程序都是可见的,你觉得应该有输出的地方,看看有没有输出.

你的程序太混乱了,
现在什么年月了还用On Error Resume Next和goto呀,
用if块可以操作的,要用goto.
查找xls里面有多少数据行的有现成的属性,你要一行一行的判断.
xls赋值也可以直接用数组赋值.

教科书不能治百病,缺能提……


我是刚学用VB,这些语法都是教程和网上搜来的,不知道现在都有什么更高效的方法。
其实我的问题很简单,就是同一条语句为什么第一可以获得对象,第二次就无法获得。所有把代码都贴出来就是因为自己不知道哪里有问题导致的。我想高手应该看到上下几个关键语句就能分析出来吧。

教科书的作用是解释基础技能,不可能把所有问题都告诉我。别告诉我你是MSDN都搞明白了才开始写代码的。

#5


虽然我的问题可能很初级,但是也请指出来是哪里有问题。想表现自己很有水平请拿出实力来,那种见问题就丢本教程出来唬人的未必真有多少料。

#6


Set exsheet1 = exbook1.activesheets("sheet1")
Set exsheet1 = exbook1.activesheets("sheet2")
Set exsheet1 = exbook1.activesheets("sheet3")
就这原理就是了

#7


引用 5 楼  的回复:
虽然我的问题可能很初级,但是也请指出来是哪里有问题。想表现自己很有水平请拿出实力来,那种见问题就丢本教程出来唬人的未必真有多少料。


问题没有表述清楚,你想用这程序干什么的? 出现了什么错误。

第一次可以 第二次不可以是不是指主程序没关的情况,如果是主要是定义好的对象没有释放或重新定义
Set excelcj = CreateObject("excel.application")
excelcj.SheetsInNewWorkbook = 1
Set exbook1 = excelcj.Workbooks().Add
Set exsheet1 = exbook1.activesheets("sheet1")

我们不是是MSDN都搞明白了才开始写代码的,而是在不断错误中修改中成长的
On Error Resume Next会把错误都忽略掉,你怎么调试啊,把它去掉,你就知道问题所在了


#8


高手都是从错误中成长的

#9


无法获取第二个工作薄对象?是sheet2表吗?

#10


引用 7 楼  的回复:
引用 5 楼 的回复:

虽然我的问题可能很初级,但是也请指出来是哪里有问题。想表现自己很有水平请拿出实力来,那种见问题就丢本教程出来唬人的未必真有多少料。


问题没有表述清楚,你想用这程序干什么的? 出现了什么错误。

第一次可以 第二次不可以是不是指主程序没关的情况,如果是主要是定义好的对象没有释放或重新定义
Set excelcj = CreateObject("excel……

你说的是一种可能,不过这个程序是单独运行的,没有上层的程序。我自己也猜想可能是定义的对象没有得到完全释放的原因,不过找不出错误来所以才贴出代码。至于说到On Error Resume Next这条语句是我特意设置来防止某些excel单元格内容不规范导致程序中断才设置的。调试的时候自然是一句一句看着运行的。
我上面说的话可能有些重,不过绝对是事实,因为我这段代码其实并不长,有点乱但是语法很简单。被我喷的人一看到多一点代码就眼晕,既不想认真看又要显示自己二把刀的水平才那么说。
学程序每个人都是边看资料边摸索这么过来的,大家都一样。VB现在用的人越来越少了,想请教点问题很难找到真正有用的帮助,新手一上来就被这样的人忽悠一下以后谁还来这里啊。

#11


最后也感谢上面各位的帮助,这个问题已经解决了。但是问题的原因我还是不知道,解决的方法很简单:我换了一台电脑,用另一个同事的电脑调试,代码没变,调试通过。。。。。我看了一下我们两台电脑唯一的区别是他的XPSP2,我的是WIN2003SP2,其他环境都一样。