Office中国论坛/Access中国论坛

标题: 关于VBA获取某个表信息 及 获取当前数据库信息 的问题 [打印本页]

作者: olderdream2007@    时间: 2013-1-26 10:53
标题: 关于VBA获取某个表信息 及 获取当前数据库信息 的问题
1. 如何用VBA获取某个表所有字段的名称及 字段类型?

2.如何用VBA获取当前ACCESS文件(当前数据库)中所有对象的名称及类型(也就是活的 有哪些表 有哪些窗体 有哪些报表等,返回他们的名称)


上面的问题是2个独立的问题  请高人指点一下  谢谢
作者: Henry D. Sy    时间: 2013-1-26 10:59
搜索论坛!好多例子
作者: Henry D. Sy    时间: 2013-1-26 11:16
  1. Option Compare Database
  2. Option Explicit
  3. '表
  4. Private Sub Command0_Click()
  5. Dim tbl As TableDef
  6. Dim strName As String
  7. For Each tbl In CurrentDb.TableDefs
  8. If Left$(tbl.Name, 4) <> "Msys" And Left$(tbl.Name, 1) <> "~" Then
  9. strName = strName & tbl.Name & Chr(13)
  10. End If
  11. Next
  12. MsgBox strName
  13. End Sub
  14. '窗体
  15. Private Sub Command1_Click()
  16. Dim obj As AccessObject, dbs As Object
  17. Set dbs = Application.CurrentProject
  18. For Each obj In dbs.AllForms
  19. MsgBox obj.Name
  20. Next obj
  21. End Sub
  22. '报表
  23. Private Sub Command2_Click()
  24. Dim obj As AccessObject, dbs As Object
  25. Set dbs = Application.CurrentProject
  26. For Each obj In dbs.AllReports
  27. MsgBox obj.Name
  28. Next obj
  29. End Sub

复制代码
[attach]51204[/attach]
作者: olderdream2007@    时间: 2013-1-26 11:24
08.If Left$(tbl.Name, 4) <> "Msys" And Left$(tbl.Name, 1) <> "~" Then

谢谢斑竹的指点 太强悍了  ,就是上边这行代码不理解?为话题要判断呢
作者: Henry D. Sy    时间: 2013-1-26 11:28
olderdream2007@ 发表于 2013-1-26 11:24
08.If Left$(tbl.Name, 4)  "Msys" And Left$(tbl.Name, 1)  "~" Then

谢谢斑竹的指点 太强悍了  ,就是 ...

因为还存在着系统表,除非你连系统表也要显示出来,否则就要排除!
作者: olderdream2007@    时间: 2013-1-26 11:28
另外LEFT函数后面为何要加上$ 符号(Left$  )  请指点
作者: olderdream2007@    时间: 2013-1-26 11:52
Henry D. Sy 发表于 2013-1-26 11:16

谢谢斑竹的指点,我的第一个问题搜过论坛好像没看到。可否指点一下

另外  LFFT函数后为何要加$ 符号(Left$  )
作者: zhuyiwen    时间: 2013-1-26 11:57
你不加也没关系
作者: olderdream2007@    时间: 2013-1-26 12:00
谢谢高人指点  明白了

“1. 如何用VBA获取某个表所有字段的名称及 字段类型?” 这个问题是否有答案呢  谢谢
作者: huangli0356    时间: 2013-1-26 13:38
我也学到了不少..
作者: smilingkiss    时间: 2013-1-26 16:33
本帖最后由 smilingkiss 于 2013-1-26 16:40 编辑


使用"$-类型"字符串函数会更快
VB官方文档似乎很鼓励使用"无$"类字符串函数,比如:Left、LTrim或者UCase,而不是实现同样功能的Left$、LTrim$和UCase$函数。但是我们必须认识到:前者返回variant类型的数值,当用于字符串表达式中时,最终必须要转换为字符串(string)类型。
由于String运算比Variant运算快,所以Left$比Left快

因此,在严格要求时间的代码段中,我们应该使用后者,它们将快5-10%。
作者: 笑嘻嘻哦    时间: 2013-1-26 18:27
如何获取信息呢
























作者: smilingkiss    时间: 2013-1-26 18:49
笑嘻嘻哦 发表于 2013-1-26 18:27
如何获取信息呢

你的回复怎么很像纯粹为了回复而回复的呀?
作者: olderdream2007@    时间: 2013-1-26 20:27
本帖最后由 olderdream2007@ 于 2013-1-26 20:39 编辑

谢谢各位高人的指点   收获许多知识。

不过我下面的问题还是没有解决,请知道的高人指点下
"1. 如何用VBA获取某个表所有字段的名称及 字段类型?'

另外,

”"1. 如何用VBA获取当前数据库中所有查询的名字?'“
作者: roych    时间: 2013-1-27 12:16
olderdream2007@ 发表于 2013-1-26 20:27
谢谢各位高人的指点   收获许多知识。

不过我下面的问题还是没有解决,请知道的高人指点下

问题1:字段类型将显示为数值,例如数值型字段显示为4。大部分同志可能需要对照表看得懂是什么玩意儿(反正Roy是记不住哪个数值代表文本或者日期)。这里的代码包含系统表相关信息。我没有Henry那么细致去剔开它们,更没有他那么耐心去解释。
  1. Sub test()
  2. Dim tbl As DAO.TableDef
  3. Dim s As String, k As String
  4. Dim fld As DAO.Field
  5.     For Each tbl In CurrentDb.TableDefs
  6.         k = "TableName:" & tbl.Name & Chr(13)
  7.         For Each fld In tbl.Fields
  8.             s = "FieldName:" & fld.Name & "---FieldType:" & fld.Type & Chr(13) & s
  9.         Next fld
  10.         Debug.Print k & s
  11.         k = ""
  12.         s = ""
  13.     Next
  14. End Sub
复制代码
问题2:
  1. Sub test2()
  2. Dim qry As DAO.QueryDef
  3. For Each qry In CurrentDb.QueryDefs
  4.     Debug.Print qry.Name
  5. Next
  6. End Sub
复制代码
事实上,像这些代码,除了回帖之外,我应该没在其它场合上用过。
我是个规规矩矩的人,所以设置字段时,只会点击“新建”、“设计视图”之类来完成。用代码建查询这种事情也是极少的。即便需要用到临时查询,也是建立好之后,指定SQL语句而已。
用代码来建表、建查询这种事情我做不来。当然,也许某些人做得很顺溜。在这里我必须得恭喜一声:你已经超越Roych斑竹了!
作者: olderdream2007@    时间: 2013-1-27 12:59
谢谢版主指点

"Dim tbl As DAO.TableDef"   中的DAO有啥用?不懂

另外,CURRENTDB指的是当前数据库   那么CURRENTPROJECT指的是当前工程, 当前工程与当前数据库弄不太明白区别?
(从各位高人对我我帖子的回复看:表和查询可以再当前数据库里获得,窗体和报表就要到当前工程中获得------,有点晕)
作者: Henry D. Sy    时间: 2013-1-27 13:08
olderdream2007@ 发表于 2013-1-26 12:00
谢谢高人指点  明白了

“1. 如何用VBA获取某个表所有字段的名称及 字段类型?” 这个问题是否有答案呢   ...

引用ado
  1. Private Sub Command0_Click()
  2.    Dim str As String
  3.    Dim rs As New ADODB.Recordset
  4.    Dim i As Integer
  5.    rs.Open "A", CurrentProject.Connection, adOpenKeyset, adLockReadOnly
  6.     For i = 0 To rs.Fields.Count - 1
  7.          str = str & "字段名: " & rs.Fields(i).Name & ", 类型: " & rs.Fields(i).Type & Chr(13)
  8.     Next
  9.    MsgBox str
  10.    rs.Close
  11.    Set rs = Nothing
  12. End Sub
复制代码
[attach]51208[/attach]



作者: roych    时间: 2013-1-27 17:09
olderdream2007@ 发表于 2013-1-27 12:59
谢谢版主指点

"Dim tbl As DAO.TableDef"   中的DAO有啥用?不懂

虽然对TableDef来说,可以不加DAO,但是从科学角度上看,加上DAO比较严谨些。
举例来说,ADO里有recordset对象,DAO里也有recordset对象。假定同时引用了ADO和DAO库,而且ADO引用库排在上面(即优先第一顺位),现在你想更新一个字段的记录,用的是DAO的Edit方法,于是便写成:
rst.Fields("FieldName").Edit
但是,别忘了,ADO的Field是没有这个方法的,而系统根据顺序来判断,先认为你定义的就是ADODB.Recordset
结果当然——出错了。
作者: olderdream2007@    时间: 2013-1-27 22:31
谢谢版主的指点 原来如此  学习中----
作者: zrj898    时间: 2013-2-3 11:26
olderdream2007@ 发表于 2013-1-26 11:52
谢谢斑竹的指点,我的第一个问题搜过论坛好像没看到。可否指点一下

另外  LFFT函数后为何要加$ 符号( ...

加不加“$”符号是ascii和unicode的区别
作者: olderdream2007@    时间: 2013-2-24 21:25
zrj898 发表于 2013-2-3 11:26
加不加“$”符号是ascii和unicode的区别


谢谢,不过  “ascii和unicode” 是啥意思? 不明白呀 呵呵




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3