Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

向煮江品茶老人提问

Peterzeng  发表于:2010-12-19 07:58:53  
复制

点击下载此附件

 

附件为煮江品茶老人设计的WAE之间的转换程序.其中我试了从E到A 和从W到A 都不行.并出现如BOOK1中的错误码.不知是我的电脑问题还是代码没有写完整.愿问其详.本人为初学者.望老人赐教.谢谢了.

 

Top
煮江品茶 发表于:2010-12-19 08:16:16

你把Access中的记录删除了,当然就不行了。

这个示例为了简化问题,记录数都是固定的,如果删除了,彼此间就找不到相应位置了,当然出错。



Peterzeng 发表于:2010-12-19 11:34:21

我是有意删除的,因为我想做一个示例就是要导入EXCEL到acces窗体中再用ADO弄到数据表中,因为excel中记录数为不确定.记录之间有空行(空行数不确定).请问先生如何获得EXCEL中有效记录行数.并导入到窗中.谢谢了.



煮江品茶 发表于:2010-12-19 11:58:07
从E中读取字段数据时,判断数据是否为null即可。比如在E表中有一个学生表,学生表有一个字段名曰姓名,该字段一定不能为null,那么在循环读取的过程中,遇到该字段为null就从循环中跳出来。

Peterzeng 发表于:2010-12-19 15:41:39
老先生,我不知道如何获得excel中的有效行数(是不是可以用XLBOOK.ROW.COUNT).是不是遇到该字段为null就往下循环,一直到最后一个有效行(如何得知是最后一行)。能否帮忙做个示例.谢谢老先生了.


Peterzeng 发表于:2010-12-19 16:22:03

点击下载此附件

 

老先生,附件是我做的示例.为何不往下循环呢?能否帮我修改一下代码.



煮江品茶 发表于:2010-12-19 16:43:40

Private Sub E到A_Click()
Dim xlApp As New Excel.Application
Dim xlBook As Excel.Workbook
Dim i As Long

xlApp.Application.Visible = True
Set xlBook = xlApp.Workbooks.Open(CurrentProject.Path & "\学生成绩表.xls")
Me.成绩窗体.SetFocus
For i = 1 To xlBook.Application.Rows.Count
    If Nz(xlBook.Application.Cells(i + 4, 2).Value, "") = "" Then Exit For
    If Me.成绩窗体.Form.RecordsetClone.RecordCount > 0 Then
        DoCmd.RunCommand acCmdRecordsGoToNew
    End If
    Me.成绩窗体.Controls("科目").Value = xlBook.Application.Cells(3, 5).Value
    Me.成绩窗体.Controls("日期").Value = xlBook.Application.Cells(2, 5).Value
    Me.成绩窗体.Controls("学号").Value = DLookup("学号", "学生表", "姓名='" & xlBook.Application.Cells(i + 4, 2).Value & "'")
    Me.成绩窗体.Controls("成绩").Value = xlBook.Application.Cells(i + 4, 4).Value
    Me.成绩窗体.Form.Requery
Next

xlBook.Save
xlApp.Quit
Set xlApp = Nothing
Set xlBook = Nothing
End Sub

 

 

点击下载此附件

Peterzeng 发表于:2010-12-19 20:24:20

 

点击下载此附件

 

老先生问题还是没有解决.请看我的附件中BOOK1中绿色字体.如下:

 

For i = 1 To xlBook.Application.Rows.Count         注释: xlBook.Application.Rows.Count,好象这句并没有获得EXCEL中有效记录数,而是=65536

 If Nz(xlBook.Application.Cells(i + 4, 2).Value, "") = "" Then Exit For         注释: 当excel记录中间有空行时会掉失空行下面的数据.上图为运行结果.
老先生能否再邦我修改一下.谢谢了.



Peterzeng 发表于:2010-12-19 21:27:48

老先生:

 

 下面是我改动的代码.虽未报错,但我发现变量I 和 J 没有取得值一样.请帮忙看一下如下代码:

 

 Private Sub E到A_Click()
Dim xlApp As New Excel.Application
Dim xlBook As Excel.Workbook
Dim i As Long
Dim j As Long
 j = 0
xlApp.Application.Visible = True
Set xlBook = xlApp.Workbooks.Open(CurrentProject.Path & "\学生成绩表.xls")
xlBook.Application.Sheets(1).Select
Me.成绩窗体.SetFocus
For i = 1 To 20 ' xlBook.Application.Rows.Count
    If Nz(xlBook.Application.Cells(i + 4, 2).Value, "") = "" Then
     j = j + 1
    End If
   
   ' If Me.成绩窗体.Form.RecordsetClone.RecordCount > 0 Then
   '     DoCmd.RunCommand acCmdRecordsGoToNew
  '  End If
    Me.成绩窗体.Controls("科目").Value = xlBook.Application.Cells(3, 5).Value
    Me.成绩窗体.Controls("日期").Value = xlBook.Application.Cells(2, 5).Value
'    Me.成绩窗体.Controls("学号").Value = xBook.Application.Cells(i + j + 4, 1).Value
    Me.成绩窗体.Controls("成绩").Value = xlBook.Application.Cells(i + j + 4, 4).Value
    Me.成绩窗体.Controls("性别").Value = xlBook.Application.Cells(i + j + 4, 3).Value
    Me.成绩窗体.Controls("姓名").Value = xlBook.Application.Cells(i + j + 4, 2).Value
    Me.成绩窗体.Form.Requery
 
Next

xlBook.Save
xlApp.Quit
Set xlApp = Nothing
Set xlBook = Nothing
End Sub



Peterzeng 发表于:2010-12-20 12:49:37

老先生,能否帮忙再看一看上面的代码错在哪呀?

 



煮江品茶 发表于:2010-12-20 13:17:15

看不出变量j有什么用处,呵呵。

从计算过程来看: xBook.Application.Cells(i + j + 4, 1).Value与 xBook.Application.Cells(2*i+ 4, 1).Value结果一样。也就是说,这个语句要求对E表中的数据隔行读取。



Peterzeng 发表于:2010-12-20 17:39:09

老先生:

 

 我的意思是:

1.因為記錄數據中間的空行數為不確定.

2. j 是為了記錄數據中間的空行數.當遇到该字段为null時j自動加1.

 



煮江品茶 发表于:2010-12-20 19:10:22

没必要。

问题的关键是要解决什么时候停止循环。



Peterzeng 发表于:2010-12-20 19:42:17

 

点击下载此附件

 

老先生,請看我做的示例,

1.當i=1,j=0; fm_order_size_child 能得到一條記錄并顯示.

2.當for i=1 to 30,j=j+1; fm_order_size_child 顯示為空.不報錯.



Peterzeng 发表于:2010-12-21 12:55:57

老先生能帮我修改一下吗?



煮江品茶 发表于:2010-12-21 13:04:13

这个问题没意义。

问题的重点只是如何从循环中跳出来,找到适当的判断条件就可以了。

关于跳到空白行后继续读取数据,完全应该在Excel中解决为删除空白行,使之满足输入要求。通常采用这种方式读入数据前,都需要对Excel表现行规范化处理,确保导入的数据无误。删除空白行只是这个规范过程的一种。



游戏人间 发表于:2010-12-21 14:32:21
xbook.application.range("b:b").SpecialCells(xlCellTypeBlanks).EntireRow.Delete'删除b列有空值的行

Peterzeng 发表于:2010-12-21 17:47:29

 

点击下载此附件

 

我分別用I=1,2,3...測試運算結果,發現都是取最后一筆記錄,而不是從第一筆開始到結束的所有記錄.所以我想問題的關鍵是Forms 如何取得所有記錄值.請看附件中的book是運行結果界面.請各位前輩指點.謝謝了.



Peterzeng 发表于:2010-12-22 20:12:05

哪 位老师能指点一二呀.多谢了.



游戏人间 发表于:2010-12-23 08:00:24
程序只是把exce文件中的数据显示到窗体中,我觉得你应该存储到表中。

红尘如烟 发表于:2010-12-23 09:41:27

你向子窗体写入数据时,每次写入前都应该先保证子窗体当前是处于新记录行,像你这样老是在那一行上,后面写入的就把前面写入的覆盖了,当然只会显示最后一条记录了。

另外引用有些问题:
Me.成绩窗体.Controls("科目").Value = xlBook.Application.Cells(3, 5).Value

可以改成:
Me.成绩窗体!科目=xlApp.Range("E3")

参考此示例:http://www.accessoft.com/blog/article-show.asp?userid=10768&id=5144



总记录:21篇  页次:1/2 9 1 2 8 :