Excel:从单元格中提取由标记分隔的文本字符串的公式
Excel: Formula to extract a string of text delimited by markers from cells
我正在处理包含已插入单元格评论中的邮政地址的电子表格
每个评论包含一个由可变行数组成的地址(该死的英国地址,它们最多可以有 7 行!)格式如下:
Line1,
Line2,
Line3,
[...],
State
由于我的技术不佳,我设法用 VBA 脚本提取评论,在单个单元格上获得以下字符串:
Line1,Line2,Line3,[...],State
此时必须将逗号之间的每个字符串提取到其自己的单元格中。
我设法使用以下公式提取了前 3 行:
第 1 行:
=LEFT(A8;(SEARCH(",";A8))-1)
第 2 行:
=MID(A8; SEARCH(",";A8)+1; SEARCH(","; A8; SEARCH(","; A8)+1)-SEARCH(",";A8)-1)
第 3 行:
=MID(A8; SEARCH(",";A8;SEARCH(",";A8;SEARCH(",";A8;SEARCH(",";A8)))+1)+1;SEARCH(","; A8; SEARCH(","; A8;SEARCH(",";A8)+1)+1)-SEARCH(",";A8;SEARCH(",";A8)+1)-1)
从这一点开始,我的大脑开始出现溢出错误...我可能需要睡几天。
谁能帮我找到 "line6",最后告诉我如何提取没有逗号结尾的 "State line"?
我以为我可以用 =RIGHT(",";SEARCH(",";A8)-1) 拉出 "State" 行,但我显然做错了什么,因为它拉出了逗号而不是字符串。
我想我可以用 VBA 脚本做任何事情,但我还没有那么熟练:(
在 A1 中使用逗号分隔数据,在 B1 中输入 :
=TRIM(MID(SUBSTITUTE($A1,",",REPT(" ",999)),COLUMNS($A:A)*999-998,999))
并复制过来。例如:
注:
为什么不使用 TextToColumns?
- 如果 A1 更改,公式行 re-calculates 自动。
- 即使 A1 本身包含一个公式,公式行仍然有效。
如果您想以编程方式而不是使用内置函数来执行此操作,请查看用于分割逗号分隔字符串的拆分函数。它会将您的输入字符串拆分成一个数组。然后你可以用这个数组做任何你喜欢的事情。
Dim Names() As String
Names() = Split(inputValue, ",")
For i = 0 To UBound(Names)
' do what you want with each piece
Next
Gary 学生的回答非常适合使用内置函数。
如果您想要 VBA 解决方案:
Sub spitString()
Dim sourceRange As Range
Dim stringArr() As String
Dim i As Integer
Set sourceRange = ActiveSheet.Range("A1")
stringArr = Split(sourceRange.Value, ",")
For i = LBound(stringArr) To UBound(stringArr)
sourceRange.Offset(0, i + 1).Value = stringArr(i)
Next i
End Sub
您可以避免添加注释:您知道用户可以通过按 ALT+RETURN 在单元格内添加换行符吗?
如果高行 d 是个问题并且您不喜欢这种格式,另一种方法可能是编写一段简单的代码,当用户在特定范围内单击时更改当前行的高度.它会使其他行的高度降低。也许。
只是一个想法。它有保持简单的好处。
哈维。
我正在处理包含已插入单元格评论中的邮政地址的电子表格 每个评论包含一个由可变行数组成的地址(该死的英国地址,它们最多可以有 7 行!)格式如下:
Line1,
Line2,
Line3,
[...],
State
由于我的技术不佳,我设法用 VBA 脚本提取评论,在单个单元格上获得以下字符串:
Line1,Line2,Line3,[...],State
此时必须将逗号之间的每个字符串提取到其自己的单元格中。 我设法使用以下公式提取了前 3 行:
第 1 行:
=LEFT(A8;(SEARCH(",";A8))-1)
第 2 行:
=MID(A8; SEARCH(",";A8)+1; SEARCH(","; A8; SEARCH(","; A8)+1)-SEARCH(",";A8)-1)
第 3 行:
=MID(A8; SEARCH(",";A8;SEARCH(",";A8;SEARCH(",";A8;SEARCH(",";A8)))+1)+1;SEARCH(","; A8; SEARCH(","; A8;SEARCH(",";A8)+1)+1)-SEARCH(",";A8;SEARCH(",";A8)+1)-1)
从这一点开始,我的大脑开始出现溢出错误...我可能需要睡几天。
谁能帮我找到 "line6",最后告诉我如何提取没有逗号结尾的 "State line"?
我以为我可以用 =RIGHT(",";SEARCH(",";A8)-1) 拉出 "State" 行,但我显然做错了什么,因为它拉出了逗号而不是字符串。
我想我可以用 VBA 脚本做任何事情,但我还没有那么熟练:(
在 A1 中使用逗号分隔数据,在 B1 中输入 :
=TRIM(MID(SUBSTITUTE($A1,",",REPT(" ",999)),COLUMNS($A:A)*999-998,999))
并复制过来。例如:
注:
为什么不使用 TextToColumns?
- 如果 A1 更改,公式行 re-calculates 自动。
- 即使 A1 本身包含一个公式,公式行仍然有效。
如果您想以编程方式而不是使用内置函数来执行此操作,请查看用于分割逗号分隔字符串的拆分函数。它会将您的输入字符串拆分成一个数组。然后你可以用这个数组做任何你喜欢的事情。
Dim Names() As String
Names() = Split(inputValue, ",")
For i = 0 To UBound(Names)
' do what you want with each piece
Next
Gary 学生的回答非常适合使用内置函数。
如果您想要 VBA 解决方案:
Sub spitString()
Dim sourceRange As Range
Dim stringArr() As String
Dim i As Integer
Set sourceRange = ActiveSheet.Range("A1")
stringArr = Split(sourceRange.Value, ",")
For i = LBound(stringArr) To UBound(stringArr)
sourceRange.Offset(0, i + 1).Value = stringArr(i)
Next i
End Sub
您可以避免添加注释:您知道用户可以通过按 ALT+RETURN 在单元格内添加换行符吗?
如果高行 d 是个问题并且您不喜欢这种格式,另一种方法可能是编写一段简单的代码,当用户在特定范围内单击时更改当前行的高度.它会使其他行的高度降低。也许。
只是一个想法。它有保持简单的好处。
哈维。