2013-04-04 52 views
1

我已经给出了客户可能拥有的不同设备组合的长列表。它看起来像做出列表的人所做的只是连接了包含设备产品编号的所有列。问题在于他们在列填写方面没有真正的顺序。因此,先获得设备B并且然后获得设备A的客户现在将具有B/A的价值,而另一个客户也可以具有A/B的价值。我试图用excel或SAS来计算出有多少个不同的组合,所以在这种情况下A/B = b/A,它们只会是1而不是2个组合。有没有办法使用EXCEL或SAS来解决这个问题,因为现在我不得不眼球。一如既往,非常感谢你的帮助!如何检查相同的数值组合,不管他们的订单如何

桑迪

回答

0

你可以尝试写它可以在Excel中用于改变A和B都显示在列的方式有些VBA代码。例如,对于B/A,它会按字母顺序将其更改为A/B。对于A/B,由于它已经按字母顺序排列,所以它会保持原样。完成后,然后按该列对表格进行排序。您应该看到像A/B这样的数据,下一行也可以显示A/B。接下来,根据你需要完成的工作,你可以添加更多的VBA代码来组合按该类型列的行并将这些数据写入新表。这将为您提供所有客户拥有的所有独特设备类型的唯一计数。如果您希望独特的客户可能拥有A/B/C,并将A/B部分与仅拥有A/B的其他客户结合使用,那么这将会多一点工作。

0

我已经有时间把它作为一个Excel公式放在一起了。在本文的底部可以看到我的原始评论,以获取我的来源的链接。

步骤来解决此问题:

用户定义函数的细胞

在Excel中创建VBA(一个新的模块排序,让我知道如果你需要在此说明,这只是一对夫妇的点击)

复制并粘贴下面的代码。

Option Explicit 

Const c_Separator = "/" 
' User Defined Function to split a list within a cell and then sort it 
' before recreating a sorted list 
Public Function CellSort(strString As String) As String 
    Dim i As Integer 
    Dim arr As Variant 
    Dim strRet As String 
    arr = Split(strString, c_Separator) 

    ' trim values so sort will work properly 
    For i = LBound(arr) To UBound(arr) 
     arr(i) = Trim(arr(i)) 
    Next i 

    ' sort 
    QuickSort arr, LBound(arr), UBound(arr) 

    ' construct ordered list to return 
    For i = LBound(arr) To UBound(arr) - 1 
     strRet = strRet & CStr(arr(i)) & c_Separator 
    Next i 

    ' Attach the last item separately to avoid adding an unecessary separator 
    CellSort = strRet & CStr(arr(i)) 

End Function 


' Quick Sort function found here: 
' https://stackoverflow.com/questions/3399823/excel-how-do-i-sort-within-a-cell 
Public Sub QuickSort(vArray As Variant, inLow As Long, inHi As Long) 

    Dim pivot As Variant 
    Dim tmpSwap As Variant 
    Dim tmpLow As Long 
    Dim tmpHi As Long 

    tmpLow = inLow 
    tmpHi = inHi 

    pivot = vArray((inLow + inHi) \ 2) 

    While (tmpLow <= tmpHi) 

    While (vArray(tmpLow) < pivot And tmpLow < inHi) 
     tmpLow = tmpLow + 1 
    Wend 

    While (pivot < vArray(tmpHi) And tmpHi > inLow) 
     tmpHi = tmpHi - 1 
    Wend 

    If (tmpLow <= tmpHi) Then 
     tmpSwap = vArray(tmpLow) 
     vArray(tmpLow) = vArray(tmpHi) 
     vArray(tmpHi) = tmpSwap 
     tmpLow = tmpLow + 1 
     tmpHi = tmpHi - 1 
    End If 

    Wend 

    If (inLow < tmpHi) Then QuickSort vArray, inLow, tmpHi 
    If (tmpLow < inHi) Then QuickSort vArray, tmpLow, inHi 

End Sub 

关闭VBA编辑器(不需要更多编码)。

Excel公式计算唯一组合的数量 在Excel中,您可以在原始数据列旁边创建三列。我在下面的屏幕截图中以彩色背景显示了这些公式。每张图片下面都有解释。

Excel formulas

蓝柱:采用上面的VBA函数在原始列表中每个单元格的内容进行排序,这给出了一个一致的列表,你可以指望的唯一项目。如果您的原始清单在小写和某些情况下,人在大写,你需要把这些一样,然后修改公式,在此列是=CellSort(UPPER(A2))

绿柱:简单COUNTIF功能(在最近所有的Excel版本的作品)标识每个排序后的单元格的第一个实例。

红色单元格:计算TRUE出现在绿色列中的次数。这给出了唯一条目的计数。

下面是已完成工作的一个例子。

Example of formulas in action


原始评论

怕我现在没有时间来测试这个权利,但是这可能会帮助你。

你可能想看看这个答案给出的VBA(我没有自己尝试过)。

VBA QuickSort

然后,如果你需要做的这个公式,你可以创建这个VBA用户定义函数来在细胞中的值进行排序。将行arr = Split(ActiveCell.Text, ",")更改为"/",以便它将分割您的列表。

接下来,在原始数据的旁边使用您的公式,然后使用此页上的公式:Count occurrences of values or unique values in a data range来计算唯一。

让我知道如果你需要更多的帮助与上述任何,我会尽力做到明天。

3

在SAS中,将它们拆分为组件值,然后对变量进行排序。

data have; 
length value $50; 
input value $; 
datalines; 
GummyBears/Skittles 
Skittles/GummyBears 
MandMs/Skittles 
GummyBears/MandMs 
Skittles/MandMs 
GummyBears/MandMs 
;;;; 
run; 

data want; 
set have; 
length vals1 vals2 $20; 
array vals[2] $; 
do _t = 1 to dim(vals); 
vals[_t]=scan(value,_t,'/'); 
end; 
call sortc(of vals[*]); 
run; 

proc freq data=want; 
tables vals1*vals2/list; 
run; 

如果您愿意,也可以重新组合它们。

+0

这是一个聪明的解... – 2013-04-05 14:34:01

1

这是在不使用VBA的情况下在Excel中提供所有设备的独特组合的快速方法。

在您的组合文本旁边插入每个设备零件的列 - 每个设备一列 - 请参阅下面的草稿。如果设备组合包含该色谱柱的设备,则每个色谱柱都返回TRUE,否则返回FALSE。

EQUIPMENT  CONTAINS_A CONTAINS_B CONTAINS_C CONTAINS_ D Sort_Column 
COMBINATION 
------------------------------------------------------------------------------------------- 
A/B/C   TRUE  TRUE  TRUE   FALSE  TRUETRUETRUEFALSE 
B/A/D/C  TRUE  TRUE  TRUE   TRUE   TRUETRUETRUETRUE 
A/B   TRUE  TRUE  FALSE   FALSE  TRUETRUEFALSEFALSE 
C    FALSE  FALSE  FALSE   TRUE   FALSEFALSETRUEFALSE 

最后一列是合并文本中的所有TRUE/FALSE值。该文本可以被过滤和/或分类以轻松识别独特的组合。如果您应用自动过滤器,自动过滤器中的条目将显示唯一的组合。

这些是我已经值后面使用的公式(表示ROW2公式):= TEXT(H 2, “#”)& TEXT(I2, “#”)&:

CONTAINS A: =NOT(ISERROR(SEARCH("A",F2,1))) 
CONTAINS B: =NOT(ISERROR(SEARCH("B",F2,1))) 
CONTAINS C: =NOT(ISERROR(SEARCH("C",F2,1))) 
CONTAINS D: =NOT(ISERROR(SEARCH("D",F2,1))) 

排序列TEXT(J2, “#”)& TEXT(K2, “#”)

对不起这个格式,但我不允许张贴图片:-( 希望它可以帮助!

相关问题