根据字符串内容对Group下的每个字符串进行分类(1次)? (Excel)中

时间:2016-01-18 00:54:18

标签: excel vba excel-vba excel-formula iteration

复杂的问题......首先让我解释一下,也许有更好的解决方案,而不是使用迭代计算:

(Link to Workbook)

Image showing example (to show what I'm working with)

问题:

拥有4,000多个字符串,并希望将它们分类为预定的组(基于字符串的内容)。

  1. 每个字符串只应分配给一个组。 (即“55加仑桶式水龙头”将列在“水龙头”栏目下,因为它包含“水龙头”一词。)

  2. 归类为群组后,该字符串不会归入任何其他群组。 (即“55加仑鼓水龙头”一旦被归类为“水龙头”,就不会被归类为“鼓”。

  3. 只要对每个字符串进行分类,这并不重要。

  4. 注意:(我几乎找到了使用迭代计算的解决方案,但它不太有用)。

    SOLUTION:

    我解决问题的方法是:

    1. 使用以下公式计算工作表中字符串(列A)重复的次数:

       Formula: =COUNTIF($E$2:$IA$10000,A3)
      
      • 此公式载于C栏。
    2. 创建一个公式,根据字符串是否包含组字(即“水龙头”,“啤酒”,“加仑”,“厨房”等)对组下方的字符串进行分类... AND之前没有使用过(即C列,其中包含上面的公式)。

        Formula: =IF(C3<1,IF(IFERROR(SEARCH("faucet",A3),0)>0,A3,""),"")
      
    3. 向列C中的所有4,000个字符串以及每个“Group”列中拖拽公式。

    4. 这种方法的问题在于它将进行迭代计算,该计算将:

      1. 对组下的字符串进行分类(但不会将Times Dup'd字段从0增加到1)...
      2. OR

        1. 将“Times Dup'd”字段从0增加到1但BUT将保持字符串不在“组”列下分类。
        2. 有关如何解决迭代计算问题的任何建议? (我知道它一直在计算,因为它是依赖的,所以必须解决1“正确”的解决方案......我想知道是否有任何方法可以创建某种'块'所以它只能计算一个方式...)

          非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

通过您的数据运行此过程。它在一对变体数组中执行所有处理。

Sub byGroup()
    Dim g As Long, s As Long, aSTRs As Variant, aGRPs As Variant

    appTGGL bTGGL:=False

    With Worksheets("Sheet1")
        aSTRs = .Range(.Cells(2, 1), .Cells(Rows.Count, 1).End(xlUp)).Value2
        With .Range(.Cells(1, 5), .Cells(Rows.Count, 1).End(xlUp).Offset(0, Application.Match("zzz", .Rows(1)) - 1))
            .Resize(.Rows.Count, .Columns.Count).Offset(1, 0).ClearContents
            aGRPs = .Cells.Value2
        End With

        For s = LBound(aSTRs, 1) To UBound(aSTRs, 1)
            For g = LBound(aGRPs, 2) To UBound(aGRPs, 2)
                If CBool(InStr(1, aSTRs(s, 1), aGRPs(1, g), vbTextCompare)) Then
                    aGRPs(s + 1, g) = aSTRs(s, 1)
                    Exit For
                End If
            Next g
        Next s

        .Cells(1, 5).Resize(UBound(aGRPs, 1), UBound(aGRPs, 2)) = aGRPs

    End With

    appTGGL
End Sub

Public Sub appTGGL(Optional bTGGL As Boolean = True)
    Debug.Print Timer
    Application.ScreenUpdating = bTGGL
    Application.EnableEvents = bTGGL
    Application.DisplayAlerts = bTGGL
    Application.Calculation = IIf(bTGGL, xlCalculationAutomatic, xlCalculationManual)
End Sub

经过的时间(不包括您的工作表公式重新计算应该在1-2秒范围内。

匹配组的优先级从左到右。如果您认为&#39; 55加仑桶&#39; 应分组为而不是加仑,请确保在加仑前加入鼓在第1行。

将新的启用宏的工作簿另存为Excel二进制工作簿(.XLSB)会将工作簿文件大小减少一半。

答案 1 :(得分:2)

我正在做点什么,Jeeped打败了我的答案。我尝试了Jeeped的代码,但是获得了一些字符串的多个组条目。这是我正在处理的代码,如果它在这一点上有任何价值:

Sub sikorloa()

Dim r As Integer
Dim c As Integer
Dim LastRow As Integer
Dim LastCol As Integer
Dim strng As String
Dim grp As String

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False

LastRow = Range("A" & Rows.Count).End(xlUp).Row
LastCol = Cells(1, Cells.Columns.Count).End(xlToLeft).Column

For r = 3 To LastRow
    If Cells(r, 1).Value <> "" Then
        strng = Cells(r, 1).Value
        For c = 5 To LastCol
            grp = Cells(1, c).Value
            If InStr(strng, grp) > 0 Then
                Cells(r, c).Value = Cells(r, 1).Value
                Exit For
            End If
        Next c
    End If
Next r

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub