簡體   English   中英

Excel公式從單元格范圍獲取值,按字母順序排序並寫為單個字符串

[英]Excel formula to take values from cell range, sort alphabetically and write as a single string

我目前有一份翻譯人員名單和他們可以發言的語言:

  |   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行),則報告顯示為不同的組合。 是否有一個公式可以用來取三個語言單元格,按字母順序排序並將其寫成字符串?

希望這很清楚。

您可能希望以不同的方式處理此問題。

您不應該將語言名稱連接在一起,而應該對代碼(二進制)執行vlookup ,然后將它們相加以得出代表該組合的代碼。 關鍵在於英語的位置(第1,第2或第3)無關緊要。

這是一個有效的例子: 工作實例

在單獨的工作表上,定義一個列表(並將范圍命名為“languages”)。 這對於驗證語言輸入也很有用。 注意,ID增加2 ^ n,其中n是1,2,3(等)。

語言表

幕后公式。 請注意,它執行vlookup :第一個參數來自輸入表,第二個參數是查找表(上面定義的語言),第三個參數是語言表中的第二個列,並且完全匹配(如果是,它將返回n / a值尚未在語言中定義)。

幕后的Fomrulas

不使用任何代碼,您只需選擇每一行,使用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

花了一些時間,但我終於想出了一個公式解決方案。

把它放在Cell 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()函數使用數組對三列進行排序來實現的。 然后我重復這3次,使用SMALL()函數更改我想要顯示的索引。 這有點難以理解,但它完成了工作:)

這里有一個鏈接,可以更詳細地描述這樣的公式如何工作:

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

你最好的選擇是使用VBA。 編寫一個循環,通過逗號分隔符將每種語言提取到一個數組中,對其進行排序並將其吐回到單元格中

編輯:事實上,將單獨的語言讀入數組會更有意義。 天色已晚

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM