1

我收到了一长串客户可能拥有的不同设备组合的清单。看起来列出列表的人所做的只是连接所有包含设备产品编号的列。问题是它们在列的填写方式上没有真正的顺序。因此,先获得设备 B 然后获得设备 A 的客户现在的价值为 B/A,而另一个客户的价值也可能为 A/B。我正在尝试使用 excel 或 SAS 来计算有多少不同的组合,无论顺序如何,所以在这种情况下 A/B=b/A 并且它们只有 1 个,而不是 2 个组合。有没有办法使用 EXCEL 或 SAS 来解决这个问题,因为现在我不得不关注它。一如既往,非常感谢您的帮助!!

4

5 回答 5

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;

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

于 2013-04-04T17:44:33.163 回答
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 值组合在一起。可以过滤和/或排序此文本以轻松识别唯一组合。如果您应用自动过滤器,自动过滤器中的条目将显示唯一的组合。

这些是我在值后面使用的公式(在第 2 行中显示公式):

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(H2,"#") & TEXT(I2,"#") & TEXT(J2,"#") & TEXT(K2,"#")

很抱歉这种格式,但我不允许发布图片:-(希望它有帮助!

于 2013-05-17T05:21:40.217 回答
0

您可以使用条件格式突出显示重复选项。它仍然会盯着它看,但您可能会按颜色分类以查看匹配/不匹配的设备。

可以在此处找到有关如何执行此操作的示例:http ://www.techrepublic.com/blog/window-on-windows/how-to-find-duplicates-in-excel/7347

于 2013-04-04T16:43:32.717 回答
0

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

于 2013-04-04T16:51:06.873 回答
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 公式

蓝色列:使用上面的 VBA 函数对原始列表中每个单元格的内容进行排序,这给出了一个一致的列表,您可以在其上计算唯一项目。如果您的原始列表中有一些小写的实例和其他大写的实例,并且您需要将它们视为相同,则将此列中的公式修改为=CellSort(UPPER(A2))

绿色列:COUNTIF标识每个已排序单元格的第一个实例的简单函数(适用于所有最新的 Excel 版本)。

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

以下是已完成工作的示例。

实际使用的公式示例


原始评论

恐怕我现在没有时间对此进行测试,但这可能会对您有所帮助。

您可能想查看此答案中给出的 VBA(我自己没有尝试过)。

VBA 快速排序

然后,如果您需要在公式中执行此操作,您可以从此 VBA 创建一个用户定义函数来对单元格中的值进行排序。将行更改arr = Split(ActiveCell.Text, ",")为拥有"/",以便拆分您的列表。

接下来在原始数据旁边的列中使用您的公式,然后使用类似于此页面上的公式的内容:计算数据范围中值或唯一值的出现次数以计算唯一值。

如果您在上述任何方面需要更多帮助,请告诉我,我会在明天尝试做。

于 2013-04-04T17:11:00.800 回答