ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: waini13142962

[求助] 麻烦大家了!!!excel查询 引用access里面的数据。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-7-11 14:34 | 显示全部楼层
本帖最后由 hehex 于 2014-7-11 14:38 编辑
waini13142962 发表于 2014-7-11 14:08
您还在线吗,麻烦您了

代码根据蓝桥老师的代码稍作修改,加入了你选择编号的部分。
  1. Sub lqxs()
  2.     Dim bhid As String, connstr As String
  3.     Sheet1.Activate

  4.     Cells.Clear
  5.     bhid = InputBox("请输入主线表需要查询记录编号" & Chr(13) & "空值或者 * 表示查询所有信息", "信息输入")
  6.    
  7.     connstr = "odbc;DSN=Ms Access Database;DBQ=" & ThisWorkbook.Path & "\数据源.mdb"

  8.     With Sheet1.QueryTables.Add(connstr, [a1])
  9.         If Len(bhid) = 0 Or bhid = "*" Then
  10.             .CommandText = "select 编号,客户,用途,名称,数量,图纸,指定号 from 主线"
  11.         Else
  12.             .CommandText = "select 编号,客户,用途,名称,数量,图纸,指定号 from 主线 Where 编号='" & bhid & "'"
  13.             
  14.         End If
  15.         .Refresh
  16. End With

  17.     [a1].CurrentRegion.Borders.LineStyle = 1

  18. End Sub
复制代码
你的题外问题回复如下:
1、你的access 数据库文件是在局域网共享上的,请用网络路径取代代码中的ThisWorkbook.Path & "\数据源.mdb" 。比如说网络映射盘符是F盘,你的网络路径是F:\database  那么相应的语句改成如下即可:
connstr = "odbc;DSN=Ms Access Database;DBQ=" & "F\database\数据源.mdb"

2、你主线表的字段发生修改(即你说的列信息)和你读取的结果表无关,因为代码已经写死了读取这几项字段的数据,如果想读取其他字段,请修改Select 语句后面的字段名添加即可,这里不再赘述。除非已经在代码中写死的几项字段名称发生改变,举例比如图纸字段改名为图纸编号,那么你的代码中的Select 那里要更改相应的字段名即将图纸更名为图纸编号。

3、引用表只要再执行一次程序,就会自动更新相关内容,但是不会自动更新。需要你手动执行一次程序

4、这个问题问的很不合适,关于数据库优化是一个很专业也很复杂的问题,请教专业人士或者参考access 数据库相关技术书籍资料。

5、你没时间看那些VBA 技术书的话想立刻弄懂这些代码也是没可能的,千里之行始于足下!

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-7-11 15:06 | 显示全部楼层
jsxjd 发表于 2014-7-11 14:29
首先要理解,不理解就不知道如何变成自己需要的

大大!我明白您的意思,授人以鱼,不如授人以渔,可以您想一下,我本来就是一个刚刚接触excel没多久的新手(本身我自己是学技术的,平常的工作与excel的联系本来就不多,只是一次无意中才了解到excel这么强大),现在仅仅还在学习函数与公式,关于VBA与数据库我知道很强大,但是从学习到了解再到熟练也不是一蹴而就,需要很长的过程,我现在是没办法了,才上网希望大大给我一个现成的答案。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-7-11 15:12 | 显示全部楼层
waini13142962 发表于 2014-7-11 15:06
大大!我明白您的意思,授人以鱼,不如授人以渔,可以您想一下,我本来就是一个刚刚接触excel没多久的新手 ...

我现在都买了坛子里面出的一些书,很实用,自己真的有心无力,想学但是又没时间,做技术本身就很耗时间。
      希望您理解

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-7-11 15:27 | 显示全部楼层
hehex 发表于 2014-7-11 14:34
代码根据蓝桥老师的代码稍作修改,加入了你选择编号的部分。你的题外问题回复如下:
1、你的access 数据 ...

非常感谢您的回答,您的思路是建一个查询窗口,我原本的意思是只要我在“引用表里”的A列输入编号,后面就会引用“access主线”里面的相关信息,编号我可能一次要输入很多个。麻烦您再看看!
          谢谢您了

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-7-11 16:01 | 显示全部楼层
waini13142962 发表于 2014-7-11 15:27
非常感谢您的回答,您的思路是建一个查询窗口,我原本的意思是只要我在“引用表里”的A列输入编号,后面就 ...

还在线吗,麻烦您了

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-7-11 16:02 | 显示全部楼层
jsxjd 发表于 2014-7-11 14:29
首先要理解,不理解就不知道如何变成自己需要的

还在线吗。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-7-11 16:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
waini13142962 发表于 2014-7-11 16:01
还在线吗,麻烦您了

您还在线吗,

TA的精华主题

TA的得分主题

发表于 2014-7-11 17:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 hehex 于 2014-7-11 19:23 编辑
waini13142962 发表于 2014-7-11 15:27
非常感谢您的回答,您的思路是建一个查询窗口,我原本的意思是只要我在“引用表里”的A列输入编号,后面就 ...

参考下列代码,你的编号必须输入在A 列内从A1 开始顺序向下,每个编号占一个单元格。
查询结果写在从D1 开始的表格中。
  1. Sub lqxs()

  2.     Dim bhid As String, connstr As String, xrow&, arr(), i&

  3.    
  4.     Sheet1.Activate
  5.     xrow = Cells(Rows.Count, "a").End(xlUp).Row
  6.    
  7.     If xrow = 1 Then
  8.         If Len([a1]) = 0 Then
  9.             bhid = "*"
  10.         Else: bhid ="'" & [a1] & "'"
  11.         End If
  12.     Else
  13.         arr = WorksheetFunction.Transpose(Range("a1:a" & xrow))
  14.         For i = 1 To UBound(arr)
  15.             bhid = bhid & "'" & arr(i) & "' or 编号="
  16.         Next
  17.         bhid = Left(bhid, Len(bhid) - 7)
  18.         
  19.     End If
  20.    
  21.     Cells.Clear


  22.    
  23.     connstr = "odbc;DSN=Ms Access Database;DBQ=" & ThisWorkbook.Path & "\数据源.mdb"


  24.     With Sheet1.QueryTables.Add(connstr, [d1])

  25.         If bhid = "*" Then

  26.             .CommandText = "select 编号,客户,用途,名称,数量,图纸,指定号 from 主线"

  27.         Else

  28.             .CommandText = "select 编号,客户,用途,名称,数量,图纸,指定号 from 主线 Where 编号=" & bhid
  29.          

  30.         End If

  31.         .Refresh

  32.    End With


  33.     [d1].CurrentRegion.Borders.LineStyle = 1

  34.     Erase arr
  35. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-7-11 21:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 waini13142962 于 2014-7-11 22:08 编辑
hehex 发表于 2014-7-11 17:37
参考下列代码,你的编号必须输入在A 列内从A1 开始顺序向下,每个编号占一个单元格。
查询结果写在从D1  ...

谢谢你的回答,非常谢谢,可能我的表达有点不清楚,我想要其实有点类似VLOOKUP函数,当我把B2至G5里面都先填好公式,我从A2至A5依次输入编号时,B2至G5也会依次显示相应的数据,只不过我引用的数据是access数据库,麻烦您再看看。

TA的精华主题

TA的得分主题

发表于 2014-7-11 22:40 | 显示全部楼层
请参考:
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     If Not Intersect(Target, [a2:a65536]) Is Nothing Then Call GetValue
  3. End Sub

  4. Sub GetValue()
  5.     Dim cnn As Object, SQL$
  6.     Set cnn = CreateObject("adodb.connection")
  7.     cnn.Open "Provider=Microsoft.Jet.Oledb.4.0;data Source=" & ThisWorkbook.Path & "\数据源.mdb"
  8.     SQL = "select b.客户,b.用途,b.名称,b.数量,b.图纸,b.指定号 from [Excel 8.0;Database=" & ThisWorkbook.FullName & ";].[Sheet1$" & [a1].CurrentRegion.Address(0, 0) & "] a left join 主线 b on a.编号=b.编号"
  9.     Range("a1").CurrentRegion.Offset(1, 1).ClearContents
  10.     Range("b2").CopyFromRecordset cnn.Execute(SQL)
  11.     cnn.Close
  12.     Set cnn = Nothing
  13. End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-21 22:22 , Processed in 0.031908 second(s), 5 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表