VBA根据条件提取唯一值

时间:2019-04-03 14:31:18

标签: excel vba

我想根据一个标准获取不同价值的列表,例如:我有一个商店列表,并且我想根据零售商标准“ BOULANGER”仅获取不同价值。

enter image description here

Sub distinctValues()

Dim LastRow As Long
Dim Crit1 As String

LastRow = Sheets("SOURCE").Cells(Rows.Count, "B").End(xlUp).Row

Sheets("SOURCE").Range("B1:B" & LastRow).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Sheets("TEST").Range("E2"), CopyToRange:=Sheets("TEST").Range("A12"), Unique:=True

End Sub

3 个答案:

答案 0 :(得分:0)

如果您尝试获取包含关键字的唯一范围,则应该可以执行类似的操作。

Option Explicit

Private Sub OutputUniqueRange(SearchRange As Range, Keyword As String, OutputRange As Range)
    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    Dim cell As Range

    For Each cell In SearchRange
        With cell
            If InStr(1, .Value2, Keyword, vbTextCompare) > 0 And Not dict.exists(.Value2) Then dict.Add .Value2, .Value2
        End With
    Next

    If dict.Count = 0 Then Exit Sub
    OutputRange.Range(OutputRange.Cells(1, 1).Address).Resize(dict.Count, 1) = Application.Transpose(dict.items())
End Sub

Public Sub TestSub()
    Dim SearchRange         As Range
    Dim Keyword             As String
    Dim OutputRange         As Range

    Keyword = "Boulanger"
    Set SearchRange = ThisWorkbook.Sheets("Sheet1").Range("A2:A34")
    Set OutputRange = ThisWorkbook.Sheets("Sheet1").Range("B2")

    OutputUniqueRange SearchRange, Keyword, OutputRange
End Sub

答案 1 :(得分:0)

我怀疑您的条件范围未正确设置和/或在工作表中命名。

.AdvancedFilter中,您具有:

Range(Crit1)

根据您的代码,它将被解释为:

Range("BOULANGER")

这假定您在测试工作表上的某个地方有一个命名范围,名为BOULANGER,并且引用了列中的两个单元格,其中第一个包含Store,第二个包含{{1} }

如果设置正确,则代码可以正常工作。

请注意,在显示条件的屏幕截图中,第一个单元格包含BOULANGER而不是Criteria。因此,即使您具有定义的范围设置来包含这两个单元格,也不会起作用,因为第一行的名称必须与要过滤的列的名称相同。

答案 2 :(得分:0)

这应该可以完成您想做的事情;查看代码中的注释。

SELECT `Time`, `faults1`,`faults2` 
FROM `SYSTEM`.`rawdata`
WHERE `Time` > BeginTime AND `Time` < EndTime