VBA ADO RecordCount=-1

当Recordset对象open的时候没有设置合适的参数,就会导致查询后Recordset对象有会值,这时候RecordCount的值应该是你返回的个数,但是recordCount却依然是-1。解决方案是rs.Open Sql, cnn, 1, 3。其中1和3都是参数

rs.Open Source,ActiveConnection,CursorType,LockType,Options

参数CursorType为设定游标的类型,其取值为: 
0 仅向前游标,只能向前浏览记录,不支持分页、Recordset、BookMark 
1 键集游标,其他用户对记录说做的修改将反映到记录集中,但其他用户增加或删除记录不会反映到记录集中。支持分页、Recordset、BookMark 
2 动态游标功能最强,但耗资源也最多。用户对记录说做的修改,增加或删除记录都将反映到记录集中。支持全功能浏览。 
3 静态游标,只是数据的一个快照,用户对记录说做的修改,增加或删除记录都不会反映到记录集中。支持向前或向后移动 

参数LockType为记录集的锁定类型,其取值为: 
1 锁定类型,默认的,只读,不能作任何修改 
2 当编辑时立即锁定记录,最安全的方式 
3 只有在调用Update方法时才锁定记录集,而在此前的其他操作仍可对当前记录进行更改、插入和删除等 
4 当编辑时记录不会被锁定,而更改、插入和删除是在批处理方式下完成的 

原网址大家可以参考https://www.cnblogs.com/lyzxx/archive/2007/05/09/740399.html

<think>嗯,用户想在VBA中实现数组排序,需要方法和代码示例。让我先回忆一下相关的引用内容。用户提供的引用1到5里提到了几种方法:通过单元格排序、用SQL、循环语句和算法,还有冒泡排序、选择排序的例子,以及二维数组的随机排序。用户需要具体的代码示例,所以我应该整理这些方法,并给出对应的代码。 首先,用户提到VBA没有内置的Sort方法,所以通常需要其他方式。引用1里的三种方法中,直接写算法比较常用,比如冒泡排序和选择排序。引用2里有冒泡排序的一维数组示例,引用5提到了选择排序。此外,还有二维数组的处理,引用4展示了Fisher-Yates算法进行随机排序,不过用户可能需要的是有序排序,所以可能需要调整。引用3关于去重可能暂时不需要,但可以提一下其他相关操作。 接下来,我需要把这些方法分门别类,给出代码示例。一维数组的冒泡排序、选择排序,二维数组的排序可能需要按特定列排序。另外,单元格排序法和SQL方法虽然需要借助工作表,但也是可行的方法,应该包括在内。 需要注意的是,用户可能需要多维数组的处理,比如二维数组按某一列排序。冒泡排序虽然效率不高,但适合教学。选择排序可能更高效一些,但用户引用5提到不稳定,不过他们用字典解决了。不过代码示例可能需要简化,直接展示基本实现。 另外,引用4中的Fisher-Yates是随机排序,虽然用户可能需要的是升序或降序,但可以作为补充内容。可能还需要提到性能问题,比如对于大数组,冒泡排序可能不够高效,这时候可以建议其他方法或者使用工作表排序。 最后,确保代码正确,符合VBA语法,比如使用正确的循环结构,数组处理方式。可能需要测试一下代码是否可行,比如冒泡排序中的交换逻辑是否正确,二维数组排序是否按指定列处理。 总结步骤: 1. 分方法介绍:单元格辅助排序、SQL方法、算法排序(冒泡、选择)。 2. 提供一维和二维数组的示例代码。 3. 注意事项和扩展建议,如性能、稳定性。 4. 生成相关问题,帮助用户进一步学习。 现在需要把这些整理成结构化的回答,确保每个部分有代码示例,并正确引用提供的资料中的信息。</think>在VBA中实现数组排序主要有以下方法,结合代码示例说明如下: --- ### 一、利用单元格辅助排序 ```vba Sub 单元格排序示例() Dim arr, rng As Range arr = Array(5, 3, 9, 1) Set rng = Range("A1").Resize(UBound(arr) + 1) rng.Value = Application.Transpose(arr) rng.Sort Key1:=rng.Cells(1), Order1:=xlAscending arr = Application.Transpose(rng.Value) End Sub ``` *原理:将数组写入单元格区域,调用Excel内置排序功能后读取回数组* [^1] --- ### 二、算法实现排序 #### 1. 一维数组冒泡排序 ```vba Function 冒泡排序(arr) Dim i As Long, j As Long, temp For i = LBound(arr) To UBound(arr) - 1 For j = i + 1 To UBound(arr) If arr(i) > arr(j) Then temp = arr(j) arr(j) = arr(i) arr(i) = temp End If Next j Next i 冒泡排序 = arr End Function ``` *时间复杂度:$O(n^2)$,适合小型数据集* [^2] #### 2. 二维数组按指定列排序 ```vba Sub 二维排序示例() Dim arr(1 To 4) As Variant arr(1) = Array("张三", 88) arr(2) = Array("李四", 76) arr(3) = Array("王五", 95) arr(4) = Array("赵六", 82) '按第2列(分数)降序排序 Call 二维数组排序(arr, 2, xlDescending) End Sub Function 二维数组排序(arr, sortCol As Long, order As XlSortOrder) Dim i As Long, j As Long, temp For i = LBound(arr) To UBound(arr) - 1 For j = i + 1 To UBound(arr) If (arr(i)(sortCol - 1) > arr(j)(sortCol - 1) And order = xlAscending) Or _ (arr(i)(sortCol - 1) < arr(j)(sortCol - 1) And order = xlDescending) Then temp = arr(j) arr(j) = arr(i) arr(i) = temp End If Next j Next i End Function ``` *支持指定排序列和升降序* [^5] --- ### 三、SQL排序法 ```vba Sub SQL排序示例() Dim conn As Object, rs As Object Set conn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties='Excel 12.0;HDR=NO'" rs.Open "SELECT F1 FROM [Sheet1$A1:A4] ORDER BY F1 ASC", conn Dim arr(), i As Long ReDim arr(rs.RecordCount - 1) Do While Not rs.EOF arr(i) = rs.Fields(0).Value i = i + 1 rs.MoveNext Loop rs.Close conn.Close End Sub ``` *需要ADO库支持,适合处理大数据量* [^1] --- ### 四、选择排序优化版 ```vba Function 选择排序(arr) Dim i As Long, j As Long, minIndex As Long, temp For i = LBound(arr) To UBound(arr) - 1 minIndex = i For j = i + 1 To UBound(arr) If arr(j) < arr(minIndex) Then minIndex = j Next j If minIndex <> i Then temp = arr(i) arr(i) = arr(minIndex) arr(minIndex) = temp End If Next i 选择排序 = arr End Function ``` *时间复杂度仍为$O(n^2)$,但交换次数少于冒泡排序* [^5] --- ### 注意事项 1. **性能考量**:当数据量超过$10^3$时建议使用单元格或SQL方法 2. **稳定性**:冒泡排序是稳定算法,选择排序不稳定 3. **多维支持**:二维数组排序需指定关键列和比较规则 4. **数据类型**:上述示例默认处理数值类型,处理字符串需调整比较逻辑 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值