你好,我想问VB的问题。代码如下

Private Sub Command6_Click()
Dim i As Integer, j As Integer
Dim xlapp As Excel.Application
Dim xlbook As Excel.Workbook
Dim xlsheet As Excel.Worksheet
Set xlapp = CreateObject("excel.application")
xlapp.Visible = True
Set xlbook = xlapp.Workbooks.Add
Set xlsheet = xlbook.Worksheets(1)
For i = 0 To DataGrid1.Columns.Count - 1
xlsheet.Cells(1, i + 1) = DataGrid1.Columns(i).Caption
Next i
i = 0
Do While (Adodc1.Recordset.EOF = False)
For j = 0 To Int(DataGrid1.Columns.Count - 1)
DataGrid1.Col = j
xlsheet.Cells(i + 2, j + 1) = DataGrid1.Text
Next j
Adodc1.Recordset.MoveNext
i = i + 1
Loop
xlapp.ActiveSheet.Protect "123", DrawingObjects:=True, _
Contents:=True, Scenarios:=True '这是密码,可要可不要
Set xlapp = Nothing
Set xlbook = Nothing
Set xlapp = Nothing
Set xlbook = Nothing
Adodc1.Recordset.MoveFirst

End Sub

目前是每按一次出来一个excel文档,我希望的是每次都存在同一个文档当中,可以帮帮我吗?

  这三句放到公共变量
  Dim xlapp As Excel.Application
  Dim xlbook As Excel.Workbook
  Dim xlsheet As Excel.Worksheet

  这4句放到窗体的load事件中
  Set xlapp = CreateObject("excel.application") '这句话运行一次就有一个新的excel窗口出来,即一个新的应用程序
  xlapp.Visible = True
  Set xlbook = xlapp.Workbooks.Add ‘这句话运行一次就有一个新的工作簿文件出来,工作簿就在xlapp这个窗口里面
  Set xlsheet = xlbook.Worksheets(1) ‘‘这句话获取xlbook工作簿里面第二个sheet表。一般默认一个工作簿新建后有三张表,如果不够用就用 xlbook.Worksheets.add增加

  理解上面三个层次关系,就可以自由控制 应用程序 ----- 工作簿 ------- 数据表 的数量了

  这4句放到窗体的closing事件中,closed事件也可以,只要系统不报错就行
  Set xlapp = Nothing
  Set xlbook = Nothing
  Set xlapp = Nothing
  Set xlbook = Nothing追问

按你所说的确实能只放入一个excel中,但是每次都会覆盖之前的数据,希望能够把每次的数据同时记录到一个表中。 最后四句我放入form_unload中了,未报错,但因不知其原理,所以不知道对不对。

追答

现在要先设想好整个操作,是要每次都放到同一张表,还是对当前操作都放到同一张表?如果是所有操作都放到同一张表,那就必须保存excel文件了,以后用打开excel文件的方式来获得一个workbook。
不管是新workbook还是打开旧的workbook,如果要从上次最后一行后面开始接着写入,下面的方法可以获取excel的已用区域的最后一行行号,用以下语句
xlsheet.UsedRange.Rows.Count + xlsheet.UsedRange.Row - 1

UsedRange就是已用区域,row是这个区域第一行的行号,rows.count是区域总行数,两者的和减1就是最后一行行号。

还有一个问题就是第一次写入时要执行写入标题行的过程,第二次开始就不用了。
For i = 0 To DataGrid1.Columns.Count - 1
xlsheet.Cells(1, i + 1) = DataGrid1.Columns(i).Caption
Next i
这个很简单,判断xlsheet的.UsedRange.Rows.Count是否为0,等于0说明没有写入过,从标题行开始写。如果写入过,就按上面的方式找到最后一行,从下一行开始写数据。

最后四句放入form_unload中,没报错就可以了,那几句是清理内存用的,反正在你已经不需要再调用xlsheet的时候就可以执行那几句了。

追问

如你所说,确实能用,万分感谢,果断加分。现在还有个问题,我想利用datacombo(或者combobox)实现换表,即选择box里的不同反白名字后adodc的recordsource能够改变, 目前的问题是,用判断单击实现还是用判断text的值实现,因为在尝试中我不清楚判断text的语句应该放在哪里,以及判断单击时是private sub DataCombo1_Click(Area As Integer), 这样没法完成选择。
两个方法我感觉都挺好,能给我其中一个解决方法就好~

追答

datacombo 我不知是什么东西,我没有装VB6。

combox有个专用事件,如果是点击选择了不同的项,会产生 selectedChanged事件,在这个事件下判断 selectedIndex(选中的项序号,从0开始向下数)或selectedItem(选中的文本,VB.net有这个,我忘记VB6是否也有,反正都是离不开selectedXXX,但是selectedText绝对不是)或text,都可以。
关于是用selectedIndex还是text,区别在于:你的combobox是否设置成可编辑状态,就是是否可以在combo里输入文本。如果可以输入,则text总是获得那个框的文本,这时selectedindex可能是-1,就是没有选择的状态。如果是设置成不可编辑,则text也可以返回框里的值,但如果有文本,就必定selectedIndex等于0或大于0。
你可以在程序中 用selectedIndex = 0 来设置默认选择第一个项(必须先检查项目的数量 count 是否大于0,即检查是否有东西装入combo,没装东西的话selectedIndex总是小于0,那句话会出错)。同时,执行那句话也会引发.selectedChanged事件。

补充说明一下selectedText的问题。这个是当combobox可以编辑的时候,你用鼠标在里面拖拉选择文本时的那些文本。包括selectedStart,也是这个相关的,是光标所在位置。如果combo不可编辑,这些都没意义。注意别和selectedIndex那些混淆。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-04-10
Set xlbook = xlapp.Workbooks.Add

你这里用的是add啊 add就是添加个新的workbook
你改用open(filename) 就可以了

VB题,求代码
Dim dx As Integer, dy As Integer Private Sub Command1_Click()Timer1.Interval = 100 Command1.Enabled = False Command2.Enabled = True End Sub Private Sub Command2_Click()Timer1.Interval = 0 End Sub Private Sub Command3_Click()End End Sub Private Sub Form_Load()Shape1.Width ...

VB操作题只需告诉我程序代码编写
你这个问题涉及到的操作步骤比较多,代码很简单;1,启动VB程序,新建一个项目。2,在VB窗口,单击[工具]菜单,选择[菜单编辑器],出现“菜单编辑器”窗口;在标题框里,输入:文件;在名称框里,输入:menu1;(注意最后不是英文字母是数字1)如下图所示:然后单击[下一个],再单击向右的箭头按钮,...

急急急!求下面这道题的VB代码,最好附上效果运行图。万分感谢。
Private Sub Command1_Click() x = Val(Text1.Text) If x < 0 Then y = x If x = 0 Then y = "未定义" If x > 0 And x <= 10 Then y = x ^ 2 If x > 10 And x <= 20 Then y = 10 If x > 20 And x <= 40 Then y = 0.5 * x + 20 If x ...

关于VB代码的问题!!!
首先,建议你这8个Text控件最好能做成控件数组(比如Text1(n)),这样代码会简单得多:Private Sub Text1_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)If KeyCode = 38 Then Text1(IIf(Index = 0, 7, Index - 1)).SetFocusIf KeyCode = 40 Then Text1(IIf(Index = ...

vb编码的问题
Load Form2 Unload form1 这两行可以改 form2.show unload me If vbOK Then 改成 If anser = vbOK Then 就OK了

VB小问题求代码。如果这个给我成功, 后续出钱找你编简单小程序。
", vbCritical, "出错提醒": Exit Sub Do While Not EOF(2) Line Input #2, strText If Me.Text1.Text & vbTab & Me.Text2.Text = strText Then bolHasEntered = True MsgBox "登陆成功!" & vbCrLf & "用户名:" & Me.Text1.Text & _ vbCrLf & "密码:" & ...

VB程序代码,不知道问题出在哪里,麻烦看一下
x = Int(900 * Rnd + 100)Label4.Caption = Val(x)End Sub If val(Text3.Text )= Val(x) Then 'Command1.SetFocus '这里填写登陆成功代码 '例如成功后显示form2 me.close form2.show Else MsgBox "请输入附加码", , "提示窗口"Text3.Text = ""Text3.SetFocus End If ...

求解:两道计算机VB编程题目
代码如下:Private Sub Command1_Click()For i = 1000 To 9999 If ((i \\ 100) + (i Mod 100)) ^ 2 = i Then Print i; "=("; i \\ 100; "+"; i Mod 100; ")^2"End If Next i End Sub 3、(1)穷举法,列出从1001到29999所有的自然数,分别测试其是否能同时被32和47整除...

VB 点击命令按钮代码问题?
解决VB点击命令按钮代码问题,需要添加一个label的Change事件。例如,当label显示数值5时,改变Text1中的文字颜色为红色。具体代码如下:在Private Sub Label1_Change()方法中,编写以下内容:若Label1的Caption属性等于5,则执行以下操作:Text1的ForeColor属性设置为vbRed,实现文字颜色变为红色。通过此方法...

这道vb题怎么写代码?
Common Dialog Control 6.0(SP6)选上对勾:如下图:添加通用对话框,并对应设置属性:名称设置为:"CD1"DialogTitle设置为:"打开文件"Filter设置为:"所有文件(*.*)|*.*|文本(*.txt)|*.txt"Private Sub Command1_Click() CD1.ShowOpenEnd Sub基本按照您题目的要求,不明白再问哦!

相似回答