复杂的问题......首先让我解释一下,也许有更好的解决方案,而不是使用迭代计算:
Image showing example (to show what I'm working with)
问题:
拥有4,000多个字符串,并希望将它们分类为预定的组(基于字符串的内容)。
每个字符串只应分配给一个组。 (即“55加仑桶式水龙头”将列在“水龙头”栏目下,因为它包含“水龙头”一词。)
归类为群组后,该字符串不会归入任何其他群组。 (即“55加仑鼓水龙头”一旦被归类为“水龙头”,就不会被归类为“鼓”。
只要对每个字符串进行分类,这并不重要。
注意:(我几乎找到了使用迭代计算的解决方案,但它不太有用)。
SOLUTION:
我解决问题的方法是:
使用以下公式计算工作表中字符串(列A)重复的次数:
Formula: =COUNTIF($E$2:$IA$10000,A3)
创建一个公式,根据字符串是否包含组字(即“水龙头”,“啤酒”,“加仑”,“厨房”等)对组下方的字符串进行分类... AND之前没有使用过(即C列,其中包含上面的公式)。
Formula: =IF(C3<1,IF(IFERROR(SEARCH("faucet",A3),0)>0,A3,""),"")
向列C中的所有4,000个字符串以及每个“Group”列中拖拽公式。
这种方法的问题在于它将进行迭代计算,该计算将:
OR
有关如何解决迭代计算问题的任何建议? (我知道它一直在计算,因为它是依赖的,所以必须解决1“正确”的解决方案......我想知道是否有任何方法可以创建某种'块'所以它只能计算一个方式...)
非常感谢任何帮助!
答案 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