【问题标题】:How to get unique values from a list of values using VBscript?如何使用 VBscript 从值列表中获取唯一值?
【发布时间】:2012-12-06 11:59:04
【问题描述】:

假设 Excel 工作表有一个名为 Student Names 的列,并且该列有重复值。说,

Student
=======

Arup
John
Mike
John
Lisa
Arup

使用 VBScript,我怎样才能得到如下的唯一值?

Arup
John
Lisa
Mike

【问题讨论】:

    标签: vbscript


    【解决方案1】:

    用于获取唯一项的 VBScript 工具是一个字典:将所有项作为键添加到字典中,dictionary.Keys() 将返回一个包含 - 每个定义项 - 唯一键的数组。在代码中:

      Dim aStudents : aStudents = Array("Arup", "John", "Mike", "John", "Lisa", "Arup")
      WScript.Echo Join(aStudents)
      Dim aUniqStudents : aUniqStudents = uniqFE(aStudents)
      WScript.Echo Join(aUniqStudents)
    
    ' returns an array of the unique items in for-each-able collection fex
    Function uniqFE(fex)
      Dim dicTemp : Set dicTemp = CreateObject("Scripting.Dictionary")
      Dim xItem
      For Each xItem In fex
          dicTemp(xItem) = 0
      Next
      uniqFE = dicTemp.Keys()
    End Function
    

    输出:

    Arup John Mike John Lisa Arup
    Arup John Mike Lisa
    

    【讨论】:

    • 你好 Horner,VBscript 中是否有任何 Direct 函数或方法可以提供填充数据的特定列的多少行?
    • @user1878162 - 请发布一个新问题。
    • 请在下面的帖子中帮助我 - stackoverflow.com/questions/13823912/…
    • @VBSlover:请学习 Docs for Dictionary 学习(1)您不能将重复的键放在字典中,所以根本没有删除; (2).Keys方法是一个返回一些东西(字典的keys的数组)的方法,语句“x = d.Keys()”把这个方法作为一个Function调用并赋值,所以按照规则“调用函数时使用参数列表()”()应该在那里,但是盖茨先生自己的示例代码省略了()并且仍然有效,所以决定不管你想不想学究气(像我一样),都是为了自己。
    • @VBSlover:直接来自文档:“如果更改项目时未找到密钥,则使用指定的新项目创建新密钥。”将含义拼写出来:如果键存在,则只分配 newitem。
    【解决方案2】:

    或者,由于您的源数据位于 Excel 电子表格中,您可以使用 SQL 填充 ADODB 记录集:

    Option Explicit
    
    Dim filePath, sheetName
    filePath = "C:\path\to\excel\workbook.xlsx"
    sheetName = "Sheet1"
    
    Dim connectionString
    connectionString = _
        "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=""" & filePath & """;" & _
        "Extended Properties=""Excel 12.0;HDR=No"""
    
    Dim sql
    sql = "SELECT DISTINCT Student FROM [" & sheetName & "$]"
    
    Dim rs
    Set rs = CreateObject("ADODB.Recordset")
    rs.Open sql, connectionString
    
    Do Until rs.EOF
        WScript.Echo rs("StudentName")
    Loop
    

    【讨论】:

      【解决方案3】:

      如果您不想要字典,可以使用以下方法将数组中的每个元素与其自身进行比较。

      Info = Array("Arup","John","Mike","John","Lisa","Arup")
      
      x = 0
      z = ubound(Info)
      Do
      x = x + 1
      Do
      z = z - 1
      If x = z Then
      Info(x) = Info(z)
      ElseIf Info(x) = Info(z) Then
      Info(x) = ""
      End If
      Loop Until z=0
      z = ubound(Info)
      Loop Until x = ubound(Info)
      For each x in Info 
      If x <> "" Then
      Unique = Unique & Chr(13) & x
      End If
      Next
      
      MsgBox Unique
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-22
        • 2014-11-26
        • 2012-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多