我正在尝试用 Excel 为俱乐部开发一个应用程序,在注册会员一天时,我开发了一个带有两个列表框的用户窗体,第一个包含所有会员,第二个包含当天的会员。
第二个列表框将成员添加到游戏组中,因此成员的顺序很重要。为了保持灵活性,成员的顺序需要能够更改,因此人们到达的顺序不一定是他们最终会进入哪个组。
我在列表框后面使用两个 ADODB 记录集编写了该应用程序,这是有关对播放器进行排序的主要工作发生的地方。应该很简单!但是,如果玩家的顺序更改得足够频繁,则 .Sort 将无法应用,并且 .MoveNext 似乎不会移动到下一个排序值,而是移动到下一个值,就好像未应用排序一样。
我编写了一个小程序来演示这种令人困惑的行为。
Option Explicit
Dim rs As ADODB.Recordset
Sub demo()
Set rs = New ADODB.Recordset
Dim i As Long
Dim num As Long
With rs
.Fields.Append "number", adInteger
.Fields.Append "Name", adVarWChar, 1
.Open
For i = 1 To 6
.AddNew Array("number", "name"), Array(i, Chr(64 + i))
Next
.MoveFirst
Debug.Print .GetString
moveup "d", 2
.MoveFirst
Debug.Print .GetString
.Sort = "Number"
.MoveFirst
.Find "name='" & "f" & "'"
!Number = !Number + 1
.MoveNext
!Number = !Number - 1
.Sort = "number"
.MoveFirst
Debug.Print .GetString
.Close
End With
Set rs = Nothing
End Sub
Sub moveup(c As String, step As Long)
With rs
.MoveFirst
.Find "name='" & c & "'"
!Number = !Number + step
.Move step
!Number = !Number - step
.Sort = "Number"
End With
End Sub
在此示例中,您可以看到 Debug.Print 提供以下输出
1 A
2 B
3 C
4 D
5 E
6 F
1 A
2 B
3 C
4 F
5 E
6 D
1 A
2 B
3 C
5 D
5 E
5 F
因此最终的 .MoveNext 从记录 4 移动到记录 6。
我已经克服了这个问题(我认为),方法是不依赖 .MoveNext,而是使用 .Find 再次查找列表框中的下一个列出的玩家,然后使用一个例程向下查找列表框条目并检查记录集中的编号是否为正确。
还有其他人在记录集中经历过这种行为吗?有办法解决这个问题吗?有没有比 RecordSet 更好的方法来组织数据?
“有没有比记录集中更好的方法来组织数据?” - 是的!这是 Excel 本身。由于您的数据不在数据库中,因此您不需要使用 Recordset 来执行任何任务,因为所有任务都可以在 Excel 中解决。
只需将数据放在工作表上,您就可以按照您需要的方式操作它们,包括排序、查找和其他操作。