【问题标题】:Sorting ADO recordset text field as numeric将 ADO 记录集文本字段排序为数字
【发布时间】:2010-09-14 10:33:56
【问题描述】:

使用 VBA,我有一组函数返回 ADODB.Recordset,其中所有列都为 adVarChar。不幸的是,这意味着数字被排序为文本。所以 1,7,16,22 变成 1,16,22,7

是否有任何方法可以将数字作为文本列进行排序,而无需更改列的类型?

Sub TestSortVarChar()

  Dim strBefore, strAfter As String

  Dim r As ADODB.RecordSet

  Set r = New ADODB.RecordSet
  r.Fields.Append "ID", adVarChar, 100
  r.Fields.Append "Field1", adVarChar, 100
  r.Open


  r.AddNew
  r.Fields("ID") = "1"
  r.Fields("Field1") = "A"

  r.AddNew
  r.Fields("ID") = "7"
  r.Fields("Field1") = "B"

  r.AddNew
  r.Fields("ID") = "16"
  r.Fields("Field1") = "C"

  r.AddNew
  r.Fields("ID") = "22"
  r.Fields("Field1") = "D"


  r.MoveFirst
  Do Until r.EOF
    strBefore = strBefore & r.Fields("ID") & " " & r.Fields("Field1") & vbCrLf
    r.MoveNext
  Loop

  r.Sort = "[ID] ASC"


  r.MoveFirst
  Do Until r.EOF
    strAfter = strAfter & r.Fields("ID") & " " & r.Fields("Field1") & vbCrLf
    r.MoveNext
  Loop

  MsgBox strBefore & vbCrLf & vbCrLf & strAfter

End Sub

注意:我正在使用 Project 2003 和 Excel 2003 并引用 Microsoft ActiveX DataObject 2.8 库

【问题讨论】:

    标签: vba ado adodb


    【解决方案1】:

    用零填充的左填充至少与最大位数一样多。 例如

    0001 0010 0022 1000

    您可以使用 Right$() 来完成此操作。

    【讨论】:

      【解决方案2】:

      使用 Val() 函数对文本列进行数字排序。示例:

      SELECT ID, Field1
      FROM tablename
      ORDER BY Val(Field1);
      

      【讨论】:

      • 谢谢克里斯。不幸的是,数据不是由 RDBMS 生成的,它只是一组在 RecordSet 中返回数据的函数。这些函数是无法更改的,所以我需要对死掉的 RecordSet 进行排序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      • 2010-12-12
      相关资源
      最近更新 更多