ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] VBA+SQL批量打印直拨单程序如何控制分页?

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-2-15 20:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
MoveFirst、MoveLast、MoveNext 和 MovePrevious 方法

在指定 Recordset 对象中移动到第一个、最后一个、下一个或前一个记录并使该记录成为当前记录。

语法

recordset.{MoveFirst | MoveLast | MoveNext | MovePrevious}

说明

使用 MoveFirst 方法将当前记录位置移动到 Recordset 中的第一个记录。

使用 MoveLast 方法将当前记录位置移动到 Recordset 中的最后一个记录。Recordset 对象必须支持书签或向后光标移动;否则调用该方法将产生错误。

使用 MoveNext 方法将当前记录向前移动一个记录(向 Recordset 的底部)。如果最后一个记录是当前记录并且调用 MoveNext 方法,则 ADO 将当前记录设置到 Recordset (EOF 为 True)的尾记录之后。当 EOF 属性已经为 True 时试图向前移动将产生错误。

使用 MovePrevious 方法将当前记录位置向后移动一个记录(向记录集的顶部)。Recordset 对象必须支持书签或向后游标移动;否则方法调用将产生错误。如果首记录是当前记录并且调用 MovePrevious 方法,则 ADO 将当前记录设置在 Recordset (BOF 为 True)的首记录之前。而 BOF 属性为 True 时向后移动将产生错误。如果 Recordset 对象不支持书签或向后游标移动,则 MovePrevious 方法将产生错误。

如果记录集是仅向前的,但是用户希望支持向前和向后滚动,则可以使用 CacheSize 属性创建记录缓存,通过 Move 方法支持向后游标移动。由于缓存记录是加载到内存中的,所以应避免不必要地缓存太多记录。可以调用仅向前 Recordset 对象的 MoveFirst 方法;这样做可使提供者重新执行生成 Recordset 对象的命令。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-2-15 20:55 | 显示全部楼层
http://www.2cto.com/shouce/ado/mdmthmove.htm

Move 方法

移动 Recordset 对象中当前记录的位置。

语法

recordset.Move NumRecords, Start

参数

NumRecords    带符号长整型表达式,指定当前记录位置移动的记录数。

Start    可选,字符串或变体型,用于计算书签。也可为下列 BookmarkEnum 值之一:

常量        说明
AdBookmarkCurrent        默认。从当前记录开始。
AdBookmarkFirst        从首记录开始。
AdBookmarkLast        从尾记录开始。

说明

所有 Recordset 对象都支持 Move 方法。

如果 NumRecords 参数大于零,则当前记录位置将向前移动(向记录集的末尾)。如果 NumRecords 小于零,则当前记录位置向后移动(向记录集的开始)。

如果 Move 调用将当前记录位置移动到首记录之前,则 ADO 将当前记录放置在记录集(BOF 为 True)的首记录之前。在 BOF 属性已经为 True 时试图向后移动将产生错误。

如果 Move 调用将当前记录位置移动到尾记录之后,则 ADO 将当前记录放置在记录集(EOF 为 True)的尾记录之后。在 EOF 属性已经为 True 时试图向前移动将产生错误。

从空的 Recordset 对象调用 Move 方法将产生错误。

如果传送 Start 参数,则移动相对于该书签的记录(假定 Recordset 对象支持书签)。如果没有指定,则移动相对于当前记录。

如果使用 CacheSize 属性在本地缓存来自提供者的记录,则在传送将当前记录位置移动到当前缓存的记录组之外的 NumRecords 参数时, ADO 将不得不从目标记录开始检索新的记录组。CacheSize 属性决定新检索记录组的大小,而目标记录是检索到的第一个记录。

如果 Recordset 对象是仅向前的,则用户仍然可以传送小于零的 NumRecords 参数(只要目标在已缓存记录的当前集合中)。如果 Move 调用将当前记录位置移动到第一个已缓存记录的前一个记录,将产生错误。因此可使用记录缓存,它在支持仅向前滚动的提供者上支持完全滚动。由于缓存的记录将加载到内存,因此应避免不必要地缓存过多记录。即使仅向前 Recordset 对象支持这种方式的向后移动,在任何仅向前的 Recordset 对象上调用 MovePrevious 方法仍将产生错误。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-2-15 20:57 | 显示全部楼层
http://www.2cto.com/shouce/ado/mdobjodbrec.htm

Recordset 对象

Recordset 对象表示的是来自基本表或命令执行结果的记录全集。任何时候,Recordset 对象所指的当前记录均为集合内的单个记录。





说明

可使用 Recordset 对象操作来自提供者的数据。使用 ADO 时,通过 Recordset 对象可对几乎所有数据进行操作。所有 Recordset 对象均使用记录(行)和字段(列)进行构造。由于提供者所支持的功能不同,某些 Recordset 方法或属性有可能无效。

ADOR.Recordset 和 ADODB.Recordset 是用来创建 Recordset 对象的 ProgID。由此产生的 Recordset 对象行为相同,与 ProgID 无关。ADOR.Recordset 随 Microsoft® Internet Explorer 安装,而 ADODB.Recordset 则随 ADO 安装。Recordset 对象的行为受环境(即客户端、服务器、Internet Explorer 等)的影响。这些差异将在属性、方法和事件的“帮助”主题中加以说明。

在 ADO 中定义了四种不同的游标类型:

动态游标 — 用于查看其他用户所作的添加、更改和删除,并用于不依赖书签的 Recordset 中各种类型的移动。如果提供者支持,可使用书签。

键集游标 — 其行为类似动态游标,不同的只是禁止查看其他用户添加的记录,并禁止访问其他用户删除的记录,其他用户所作的数据更改将依然可见。它始终支持书签,因此允许 Recordset 中各种类型的移动。

静态游标 — 提供记录集合的静态副本以查找数据或生成报告。它始终支持书签,因此允许 Recordset 中各种类型的移动。其他用户所作的添加、更改或删除将不可见。这是打开客户端 (ADOR) Recordset 对象时唯一允许使用的游标类型。

仅向前游标 — 除仅允许在记录中向前滚动之外,其行为类似静态游标。这样,当需要在 Recordset 中单程移动时就可提高性能。
在打开 Recordset 之前设置 CursorType 属性来选择游标类型,或使用 Open 方法传递 CursorType 参数。部分提供者不支持所有游标类型。请检查提供者的文档。如果没有指定游标类型,ADO 将默认打开仅向前游标。

如果 CursorLocation 属性被设置为 adUseClient 后打开 Recordset,则在返回的 Recordset 对象中,Field 对象的 UnderlyingValue 属性不可用。对部分提供者(例如 Microsoft ODBC Provider for OLE DB 连同 Microsoft SQL Server),可以通过使用 Open 方法传递连接字符串,根据以前定义的 Connection 对象独立地创建 Recordset 对象。ADO 仍然创建 Connection 对象,但它不将该对象赋给对象变量。不过,如果正在相同的连接上打开多个 Recordset 对象,就应该显式创建和打开 Connection 对象,由此将 Connection 对象赋给对象变量。如果在打开 Recordset 对象时没有使用该对象变量,即使在传递相同连接字符串的情况下,ADO 也将为每个新的 Recordset 创建新的 Connection 对象。

可以创建所需数量的 Recordset 对象。

打开 Recordset 时,当前记录位于第一个记录(如果有),并且 BOF 和 EOF 属性被设置为 False。如果没有记录,BOF 和 EOF 属性设置是 True。

假设提供者支持相关的功能,可以使用 MoveFirst、MoveLast、MoveNext 和 MovePrevious 方法以及 Move 方法,和 AbsolutePosition、AbsolutePage 和 Filter 属性来重新确定当前记录的位置。仅向前 Recordset 对象只支持 MoveNext 方法。当使用 Move 方法访问每个记录(或枚举 Recordset)时,可使用 BOF 和 EOF 属性查看是否移动已经超过了 Recordset 的开始或结尾。

Recordset 对象可支持两类更新:立即更新和批更新。使用立即更新,一旦调用 Update 方法,对数据的所有更改将被立即写入基本数据源。也可以使用 AddNew 和 Update 方法将值的数组作为参数传递,同时更新记录的若干字段。

如果提供者支持批更新,可以使提供者将多个记录的更改存入缓存,然后使用 UpdateBatch 方法在单个调用中将它们传送给数据库。这种情况应用于使用 AddNew、Update 和 Delete 方法所做的更改。调用 UpdateBatch 方法后,可以使用 Status 属性检查任何数据冲突并加以解决。

注意   要执行不使用 Command 对象的查询,应将查询字符串传递给 Recordset 对象的 Open 方法。但是,在想要保持命令文本并重复执行或使用查询参数时,仍然需要 Command 对象。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-2-15 20:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 autumnalRain 于 2016-2-16 10:26 编辑

BOF、EOF 属性

BOF 指示当前记录位置位于 Recordset 对象的第一个记录之前。

EOF 指示当前记录位置位于 Recordset 对象的最后一个记录之后。
返回值

BOF 和 EOF 属性返回布尔型值。

说明

使用 BOF 和 EOF 属性可确定 Recordset 对象是否包含记录,或者从一个记录移动到另一个记录时是否超出 Recordset 对象的限制。

如果当前记录位于第一个记录之前,BOF 属性将返回 True (-1),如果当前记录为第一个记录或位于其后则将返回 False (0)。

如果当前记录位于 Recordset 对象的最后一个记录之后 EOF 属性将返回 True,而当前记录为 Recordset 对象的最后一个记录或位于其前,则将返回 False。

如果 BOF 或 EOF 属性为 True,则没有当前记录。

如果打开没有记录的 Recordset 对象,BOF 和 EOF 属性将设置为 True,而 Recordset 对象的 RecordCount 属性设置为零。打开至少包含一条记录的 Recordset 对象时,第一条记录为当前记录,而 BOF 和 EOF 属性为 False。

如果删除 Recordset 对象中保留的最后记录,BOF 和 EOF 属性将保持 False,直到重新安排当前记录。

以下表格说明不同 BOF 和 EOF 属性组合所允许的 Move 方法。


BOF EOF.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-2-15 20:59 | 显示全部楼层
RecordCount 属性

指示  Recordset 对象中记录的当前数目。

返回值

返回长整型值。

说明

使用 RecordCount 属性可确定 Recordset 对象中记录的数目。ADO 无法确定记录数时,或者如果提供者或游标类型不支持 RecordCount,则该属性返回 –1。读已关闭的 Recordset 上的 RecordCount 属性将产生错误。

如果 Recordset 对象支持近似定位或书签(即 Supports (adApproxPosition) 或 Supports (adBookmark) 各自返回 True),不管是否完全填充该值,该值将为 Recordset 中记录的精确数目。如果 Recordset 对象不支持近似定位,该属性可能由于必须对所有记录进行检索和计数以返回精确 RecordCount 值而严重消耗资源。

Recordset 对象的游标类型会影响是否能够确定记录的数目。对仅向前游标,RecordCount 属性将返回 -1,对静态或键集游标返回实际计数,对动态游标取决于数据源返回 -1 或实际计数。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-2-15 21:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
CursorLocation 属性

设置或返回游标服务的位置。

设置和返回值

设置或返回可设置为以下某个常量的长整型值。

常量        说明
adUseNone        没有使用游标服务。(该常量已过时并且只为了向后兼容才出现)。
adUseClient        使用由本地游标库提供的客户端游标。本地游标服务通常允许使用的许多功能可能是驱动程序提供的游标无法使用的,因此使用该设置对于那些将要启用的功能是有好处的。AdUseClient 具有向后兼容性,也支持同义的 adUseClientBatch。
adUseServer        默认值。使用数据提供者的或驱动程序提供的游标。这些游标有时非常灵活,对于其他用户对数据源所作的更改具有额外的敏感性。但是,Microsoft Client Cursor Provider(如已断开关联的记录集)的某些功能无法由服务器端游标模拟,通过该设置将无法使用这些功能。

说明

该属性允许在可用于提供者的各种游标库中进行选择。通常,可以选择使用客户端游标库或位于服务器上的某个游标库。

该属性设置仅对属性已经设置后才建立的连接有影响。更改 CursorLocation 属性不会影响现有的连接。

对于 Connection 或关闭的 Recordset 该属性为读/写,而对打开的 Recordset 该属性为只读。

由 Execute 方法返回的游标继承该设置。Recordset 将自动从与之关联的连接中继承该设置。

远程数据服务用法   当用于客户端 (ADOR) Recordset 或 Connection 对象时,只能将 CursorLocation 属性设置为 adUseClient。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-2-16 10:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
利用recordset.move方法也可以获取查询结果中的某几行记录。AdoRst.Move 10将当前指针下移10条
   
    Sheets("查询结果").Range("A2:C16") = WorksheetFunction.Transpose(AdoRst.GetRows(15, 0)) '用GetRows从当前记录开始选取15条记录作为二维数组输出到工作表中
  1. Sub 如何使用VBA获取某几行记录()
  2.     Dim AdoConn As New ADODB.Connection
  3.     Dim AdoRst As ADODB.Recordset
  4.     Dim strConn As String
  5.     Dim strSQL As String
  6.     Dim i As Integer
  7.     '清空表格
  8.     Sheets("查询结果").Cells.Clear
  9.     '设置连接字符串
  10.     strConn = " Provider=Microsoft.ACE.OLEDB.12.0;" & _
  11.           "Data Source=" & ThisWorkbook.FullName & _
  12.           ";Extended Properties=""Excel 12.0;HDR=YES"";"
  13.     '设置SQL查询语句
  14.     strSQL = "Select 产销国家或地区,地区, 出口金额 FROM [出口数据$]  Order By 出口金额 DESC"
  15.     '打开数据库链接
  16.     AdoConn.Open strConn
  17.     '执行查询,并将结果输出到记录集对象
  18.     Set AdoRst = AdoConn.Execute(strSQL)
  19.     '将当前指针下移5条
  20.     AdoRst.Move 10
  21.     '用GetRows从当前记录开始选取5条记录作为二维数组输出到工作表A2:C6中
  22.     Sheets("查询结果").Range("A2:C16") = WorksheetFunction.Transpose(AdoRst.GetRows(15, 0))
  23.     '填写标题
  24.     For i = 0 To AdoRst.Fields.Count - 1
  25.         Sheets("查询结果").Cells(1, i + 1) = AdoRst.Fields(i).Name
  26.     Next i
  27.     '关闭数据库连接
  28.     AdoRst.Close
  29.     AdoConn.Close
  30. End Sub
复制代码

疑难189.zip

18.19 KB, 下载次数: 34

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-2-18 12:29 | 显示全部楼层
看赵老师解答后,借鉴方法,简化如下:
  1. Sub 批量打印()
  2.     Dim sVoucher, sProject, i, ADOConn, ADORst
  3.     Set ADOConn = CreateObject("ADODB.Connection")
  4.     Set ADORst = CreateObject("ADODB.Recordset")
  5.     conn = "provider=microsoft.ACE.OLEDB.12.0;extended properties='Excel 12.0;hdr=yes';data source=" & ThisWorkbook.FullName
  6.     Rmax = Sheets("查询清单").Range("a1").CurrentRegion.Rows.Count
  7.     For i = 2 To Rmax
  8.             sVoucher = Sheets("查询清单").Cells(i, 1)
  9.             sProject = Sheets("查询清单").Cells(i, 2)
  10.             SQL = "select 名称,规格,单位,数量,单价,金额 from [项目名称$] where [凭证号]=""" & sVoucher & """ And [项目名称]= """ & sProject & """"
  11.             ADOConn.Open conn
  12.             ADORst.Open SQL, ADOConn, 3, 3
  13.             Debug.Print ADORst.RecordCount
  14.             With Sheets("打印模板")
  15.                 Union(.[B2], .[C2], .[G2]).ClearContents
  16.                 .[B2] = sProject
  17.                 .[e2] = Split(sVoucher, "-")(2)
  18.                 .[G2] = Left(sVoucher, InStrRev(sVoucher, "-")) & Int(Rnd * 3 + 25)
  19.                 While Not ADORst.EOF
  20.                     .Range(.Cells(4, 2), .Cells(13, 7)).ClearContents
  21.                     .Cells(4, 2).CopyFromRecordset ADORst, 10
  22.                     ActiveSheet.PrintOut
  23.                 Wend
  24.              End With
  25.             ADORst.Close
  26.             ADOConn.Close
  27.     Next i
  28.     Set ADORst = Nothing
  29.     Set ADOConn = Nothing
  30. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2017-6-13 09:41 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-12-26 22:40 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢楼主分享!!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-5 10:27 , Processed in 0.047055 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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