2

我目前有一个翻译列表和他们可以说的语言:

  |   A   |     B      |     C      |     D      |             F             |
  +-------+------------+------------+------------+---------------------------+
1 | Name  | Language 1 | Language 2 | Language 3 | Combined                  |
  +=======+============+============+============+===========================+
2 | John  | English    | Chinese    | Spanish    | English, Chinese, Spanish |
3 | Wendy | Chinese    | French     | English    | Chinese, French, English  |
4 | Peter | Spanish    | Chinese    | English    | Spanish, Chinese, English |

在 FI 列中,我使用以下公式将每个人的所有语言组合在一起:

=$B2&", "&$C2&", "&$D2

我在数据透视表中使用此列来报告可以说相同语言组合的人。我的问题是,如果以不同的顺序输入语言(例如第 2 行和第 4 行),则报告显示为不同的组合。是否有一个公式可以用来获取三个语言单元格,按字母顺序对它们进行排序并将其写成字符串?

希望这很清楚。

4

4 回答 4

4

您可能希望以不同的方式处理此问题。

不要将语言名称连接在一起,您应该vlookup对代码(二进制)执行 a 操作,然后将它们加在一起以得出代表该组合的代码。这里的关键是,英语的位置(第一、第二或第三)并不重要。

这是一个工作示例: 工作示例

在单独的工作表上,定义一个列表(并将范围命名为“语言”)。这也有利于验证语言的输入。请注意,ID 以 2^n 递增,其中 n 为 1、2、3(等)。

语言表

幕后公式。请注意,它执行vlookup:第一个参数来自输入表,第二个参数是查找表(上面定义的语言),第三个参数是语言表中的第二列,并且完全匹配(如果值,它将返回 n/a尚未在语言中定义)。

幕后花絮

于 2013-03-28T02:07:22.393 回答
3

不使用任何代码,您只需选择每一行,使用Sort,然后在选项下,选择Left to Right而不是默认值。您必须一次完成这一行,因此如果您有很多行,可能会很乏味,在这种情况下,基于 VBA 的解决方案会更实用。

从左到右排序

对于 VBA 解决方案,应该这样做。选择包含需要排序的数据的所有单元格,然后运行下面的宏。然后,您可以使用相同的公式将它们组合成一个字符串。

Sub SortEachRowAlpha()

'First, select the range that needs to be sorted.
'
Dim r As Long 'row iterator:
Dim keyRange As Range

For r = 1 To Selection.Rows.Count
    Set keyRange = Range(Selection.Rows(r).Address)

    ActiveSheet.Sort.SortFields.Clear
    ActiveSheet.Sort.SortFields.Add Key:=keyRange, _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveSheet.Sort
        .SetRange keyRange
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlLeftToRight
        .SortMethod = xlPinYin
        .Apply
    End With
Next

End Sub
于 2013-03-28T00:57:21.557 回答
2

花了我一段时间,但我终于想出了一个公式解决方案。

把这个放在单元格中E2

=CONCATENATE(INDEX(B2:D2,1,MATCH(SMALL(COUNTIF(B2:D2,"<"&B2:D2),1),COUNTIF(B2:D2,"<"&B2:D2),0)),", ",INDEX(B2:D2,1,MATCH(SMALL(COUNTIF(B2:D2,"<"&B2:D2),2),COUNTIF(B2:D2,"<"&B2:D2),0)),", ",INDEX(B2:D2,1,MATCH(SMALL(COUNTIF(B2:D2,"<"&B2:D2),3),COUNTIF(B2:D2,"<"&B2:D2),0)))

按输入公式CTRL+SHIFT+ENTER

向下拖动公式。

在此处输入图像描述

COUNTIF()这通过使用该函数与该函数结合使用一个数组对三列进行排序来SMALL()工作。SMALL()然后我重复 3 次,使用该函数更改我想要显示的索引。这有点难以理解,但它完成了工作:)

这里有一个链接,更详细地描述了这样的公式是如何工作的:

http://www.get-digital-help.com/2009/03/27/sorting-text-cells-using-array-formula/

于 2013-03-28T02:00:45.263 回答
1

你最好的选择是使用 VBA。编写一个循环,通过逗号分隔符将每种语言提取到一个数组中,对其进行排序并将其吐回单元格

编辑:事实上,将单独的语言读入数组会更有意义。天色已晚

于 2013-03-28T00:45:14.417 回答