![](/img/trans.png)
[英]Excel formula to take string value from cell and sort its characters in alphabetical order
[英]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值尚未在語言中定義)。
不使用任何代碼,您只需選擇每一行,使用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.