英文:
Is it possible to automatically convert one column to superscript while concatenating with another column in Excel?
问题
我试图在Excel中连接两列,以便其中一列以上标形式显示,如下所示:
在Excel中是否有可能当我在B列和C列中添加数据时,结果显示在D列中,如附图所示,以便我不必手动更改D列中的每一行的第一部分为上标?
我尝试将B列的格式更改为上标,然后使用连接公式,但它会在结果列D中更改为正常格式。
任何帮助将不胜感激!
英文:
I am trying to Concat 2 columns in Excel in such a way that one column is shown in superscripted form as shown below
Is it possible in Excel that when I add data in columns B and C, the result is shown in column D as shown in the snapshot attached so that I don't have to manually change the first part in column D in every row to superscript?
I tried changing the formatting of column B to superscript and then use concat formula but it changes it to normal formatting in the resultant column D.
Any help will be highly appreciated!
答案1
得分: 1
(Note: 由于简化起见,此答案假设您使用支持switch
和ifs
的Excel版本,而这在Excel 2010中不适用。但是,将其转换为标准的if
应该相对简单。如果您没有unichar
函数,解决方案会变得更加复杂。)
让我们从最后开始,逆向思考。假设您在Excel中有一张表,将一个数字n
映射到其上标等效项。类似于这样的表格:
n | 上标 |
---|---|
0 | ⁰ |
1 | ¹ |
2 | ² |
3 | ³ |
4 | ⁴ |
5 | ⁵ |
6 | ⁶ |
7 | ⁷ |
8 | ⁸ |
9 | ⁹ |
10 | ¹⁰ |
然后,您可以执行如下简单的VLOOKUP
来将上标数字与文本连接起来:=VLOOKUP([@Rank],tSuperscripts,2,FALSE)&" "&[@Text]
,这将给您这样的结果:¹ Some String
。(出于简化的考虑,我没有添加括号;然而,如下所示,这将很容易实现。)
因此,问题变成了如何填充您的“查找表”。从0到9派生数字的上标很容易:处理n
在(1,2,3)的特殊情况,然后您只需参考维基百科编写一个使用unichar
的函数,类似于这样:
=UNICHAR(SWITCH([@n],1,HEX2DEC("b9"),2,HEX2DEC("b2"),3,HEX2DEC("b3"),HEX2DEC("2070")+[@n]))
对于大于等于10的数字,情况就变得更加复杂。在那一点上,您最好的选择是拥有“辅助”列,将原始数字拆分为组成数字,派生它们的上标,然后将所有内容连接起来。为此,您可以做类似于以下的操作(基本上有列来提取特定的数字,然后有另一列来派生该数字的上标,然后将所有内容连接成一个列)。请注意使用了--
。由于LEFT
和MID
将数字转换为字符串:
n | 上标 | n1 | n2 | n3 | n1的上标 | n2的上标 | n3的上标 |
---|---|---|---|---|---|---|---|
0 | =CONCAT([@[n1的上标]],[@[n2的上标]],[@[n3的上标]]) | =--LEFT([@n],1) | =IF([@n]>=10,--MID([@n],2,1),"") | =IF([@n]>=100,--MID([@n],3,1),"") | =UNICHAR(SWITCH([@n1],1,HEX2DEC("b9"),2,HEX2DEC("b2"),3,HEX2DEC("b3"),HEX2DEC("2070")+[@n1])) | =IF([@n]>=10,UNICHAR(SWITCH([@n2],1,HEX2DEC("b9"),2,HEX2DEC("b2"),3,HEX2DEC("b3"),HEX2DEC("2070")+[@n2]),"") | =IF([@n]>=100,UNICHAR(SWITCH([@n3],1,HEX2DEC("b9"),2,HEX2DEC("b2"),3,HEX2DEC("b3"),HEX2DEC("2070")+[@n3]),"") |
请注意,您可以相对容易地扩展此逻辑以处理大于等于100、1,000等的数字。
一旦您填充了此表,就可以使用顶部显示的vlookup
。如上所述,如果需要括号(0x207d和0x207e),您可以将它们添加到查找表中。例如:=CONCAT(UNICHAR(HEX2DEC("207d")),[@[n1的上标]],[@[n2的上标]],[@[n3的上标]],UNICHAR(HEX2DEC("207e")))
英文:
(Note: For the sake of simplicity, this answer is written assuming you have a version of Excel that supports switch
and ifs
, which wouldn't be the case in Excel 2010. However, it would be pretty straightforward to convert to standard if
s.). If you don't have the unichar
function, the solution would get much more tricky.
Let's start at the end and work our way backwards. Let's say you had a table in Excel that mapped a number n
to its superscript equivalent. Something like this:
n | superscript |
---|---|
0 | ⁰ |
1 | ¹ |
2 | ² |
3 | ³ |
4 | ⁴ |
5 | ⁵ |
6 | ⁶ |
7 | ⁷ |
8 | ⁸ |
9 | ⁹ |
10 | ¹⁰ |
Then you could do as something as easy as doing a VLOOKUP
to concatenate the superscripted number with the text: =VLOOKUP([@Rank],tSuperscripts,2,FALSE)&" "&[@Text]
, which would give you this: ¹ Some String
. (For the sake of simplicity, I didn't add in the parentheses; however, that would be trivial to do, as you'll see below).
So then the question becomes how to populate your "lookup table". Deriving the superscript for a number from 0 to 9 is easy enough: Handle the special cases of n in (1,2,3)
, and you can just reference Wikipedia to write a function using unichar
. Something like this:
=UNICHAR(SWITCH([@n],1,HEX2DEC("b9"),2,HEX2DEC("b2"),3,HEX2DEC("b3"),HEX2DEC("2070")+[@n]))
For numbers ≥ 10, it gets a bet more complicated. I think your best bet at that point would be to have "helper" columns that split out the original number into constituent digits, derive their superscripts, and then concatenate everything back. To that end, you could do something like this (basically have columns to pull a specific digit, and then have another column to derive the superscript for that digit, then concatenate everything into 1 column). Note the use of --
. Since LEFT
and MID
turn the digit into a string
n | superscript | n1 | n2 | n1_super | n2_super |
---|---|---|---|---|---|
0 | =CONCAT([@[n1_super]],[@[n2_super]],[@[n3_super]]) | =--LEFT([@n],1) | =IF([@n]>=10,--MID([@n],2,1),"") | =UNICHAR(SWITCH([@n1],1,HEX2DEC("b9"),2,HEX2DEC("b2"),3,HEX2DEC("b3"),HEX2DEC("2070")+[@n1])) | =IF([@n]>=10,UNICHAR(SWITCH([@n2],1,HEX2DEC("b9"),2,HEX2DEC("b2"),3,HEX2DEC("b3"),HEX2DEC("2070")+[@n2])),"") |
Note that you can extend this logic pretty easily for numbers ≥ 100, 1,000, etc.
Once you have this table populated, you can use the vlookup
shown at the top. As stated, if you need the parentheses (0x207d
and 0x207e
), you can add those in to the lookup table. For example: =CONCAT(UNICHAR(HEX2DEC("207d")),[@[n1_super]],[@[n2_super]],[@[n3_super]],UNICHAR(HEX2DEC("207e")))
答案2
得分: 1
You can use UNICHAR
function to accomplish this. The user LAMBDA
function SUPERSCRPT(x)
, does the conversion of the input string (x
) considering each case (formula 1):
=LET(SUPERSCRPT, LAMBDA(x, LET(lk, HSTACK(
VSTACK("&" & SEQUENCE(10,,0),{"(";")"}),
VSTACK({8304;185;178;179},SEQUENCE(6,,8308),{8317;8318})),
y,MID(x,SEQUENCE(LEN(x)),1),
REDUCE("",y,LAMBDA(ac,a,ac & UNICHAR(XLOOKUP(a,INDEX(lk,,1),INDEX(lk,,2))))))),
BYROW(A2:B6, LAMBDA(x,SUPERSCRPT(INDEX(x,1))&INDEX(x,2))))
You can also define SUPERSCRPT
as an array function, so you don't have to build the lookup table (lk
) on every call and you can use it for a single cell or a single column array (formula 2):
=LET(SUPERSCRPT,LAMBDA(x, LET(lk, HSTACK(
VSTACK("&" & SEQUENCE(10,,0),{"(";")"}),
VSTACK({8304;185;178;179},SEQUENCE(6,,8308),{8317;8318})),
BYROW(x, LAMBDA(xi,REDUCE("",MID(xi,SEQUENCE(LEN(xi)),1),
LAMBDA(ac,a, ac & UNICHAR(XLOOKUP(a,INDEX(lk,,1),INDEX(lk,,2))))))))),
SUPERSCRPT(A2:A6)&B2:B6)
Here is the output:
What is does is first to build a lookup table (lk
) you can have it outside of the formula in the Excel spreadsheet and reference it. This table has two columns: input (text data type), output (UNICODE decimal number). Here is the reference table:
Input | Code |
---|---|
"0" |
8304 |
"1" |
185 |
"2" |
178 |
"3" |
179 |
"4" |
8308 |
"5" |
8309 |
"6" |
8310 |
"7" |
8311 |
"8" |
8312 |
"9" |
8313 |
"(" |
8317 |
")" |
8318 |
For formula 1: The input (x
) is split by rows (y
) via MID
function. We use REDUCE
to do the recursion for each element (a
) of y
. On each iteration it finds the input value (a
) in the lookup table (lk
) via XLOOKUP
and extracts the code number, then invokes UNICHAR
function and concatenate the result to the accumulator (ac
). We use BYROW
to spill the array result for the input range.
I found the corresponding UNICODE values here: Unicode subscripts and superscripts, section: Superscripts and subscripts block. Numbers are represented in hexadecimal. For example the superscript 1
(¹
) is represented by the hexadecimal number: 00B9
. The lk
table in the formula uses the equivalent decimal number, so basically I converted them via HEX2DEC
Excel function. For example: =HEX2DEC("00B9")
which returns 185
.
英文:
You can use UNICHAR
function to accomplish this. The user LAMBDA
function SUPERSCRPT(x)
, does the conversion of the input string (x
) considering each case (formula 1):
=LET(SUPERSCRPT, LAMBDA(x, LET(lk, HSTACK(
VSTACK(""&SEQUENCE(10,,0),{"(";")"}),
VSTACK({8304;185;178;179},SEQUENCE(6,,8308),{8317;8318})),
y,MID(x,SEQUENCE(LEN(x)),1),
REDUCE("",y,LAMBDA(ac,a,ac & UNICHAR(XLOOKUP(a,INDEX(lk,,1),INDEX(lk,,2))))))),
BYROW(A2:B6, LAMBDA(x,SUPERSCRPT(INDEX(x,1))&INDEX(x,2))))
You can also define SUPERSCRPT
as an array function, so you don't have to build the lookup table (lk
) on every call and you can use it for a single cell or a single column array (formula 2):
=LET(SUPERSCRPT,LAMBDA(x, LET(lk, HSTACK(
VSTACK(""&SEQUENCE(10,,0),{"(";")"}),
VSTACK({8304;185;178;179},SEQUENCE(6,,8308),{8317;8318})),
BYROW(x, LAMBDA(xi,REDUCE("",MID(xi,SEQUENCE(LEN(xi)),1),
LAMBDA(ac,a, ac & UNICHAR(XLOOKUP(a,INDEX(lk,,1),INDEX(lk,,2))))))))),
SUPERSCRPT(A2:A6)&B2:B6)
What is does is first to build a lookup table (lk
) you can have it outside of the formula in the Excel spreadsheet and reference it. This table has two columns: input (text data type), output (UNICODE decimal number). Here is the reference table:
Input | Code |
---|---|
"0" |
8304 |
"1" |
185 |
"2" |
178 |
"3" |
179 |
"4" |
8308 |
"5" |
8309 |
"6" |
8310 |
"7" |
8311 |
"8" |
8312 |
"9" |
8313 |
"(" |
8317 |
")" |
8318 |
For formula 1: The input (x
) is split by rows (y
) via MID
function. We use REDUCE
to do the recursion for each element (a
) of y
. On each iteration it finds the input value (a
) in the lookup table (lk
) via XLOOKUP
and extracts the code number, then invokes UNICHAR
function and concatenate the result to the accumulator (ac
). We use BYROW
to spill the array result for the input range.
I found the corresponding UNICODE values here: Unicode subscripts and superscripts, section: Superscripts and subscripts block. Numbers are represented in hexadecimal. For example the superscript 1
(¹)
is represented by the hexadecimal number: 00B9
. The lk
table in the formula uses the equivalent decimal number, so basically I converted them via HEX2DEC
Excel function. For example: =HEX2DEC("00B9")
which returns 185
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论