使用 Excel VBA 将字符串分成列
Posted
技术标签:
【中文标题】使用 Excel VBA 将字符串分成列【英文标题】:Separating string into columns using Excel VBA 【发布时间】:2016-08-17 08:20:47 【问题描述】:我正在尝试在 VBA 中编写一个宏,以将一堆格式相同的地址拆分为单独的列。所以一个街道地址列,郊区,邮政编码和州代码列。地址都遵循这种格式:
123 Fake Street, Suburbia QLD 4123
我希望我可以使用 SQL 来解决这个问题,但我试图将这个函数保存在一个 Excel 工作簿中,其中地址是中心。
我计划的方法是编写一个 for 循环来计算 D 列的长度(存储地址的位置)......所以
For LngRow = 2 To Wksht.Range("D" & Wksht.Rows.Count).End(xlUp).Row
//concate/parse here//
Next
然后它将遵循向后工作的标准程序,将邮政编码(4 位)分开并写入,然后是州代码(州代码数组),然后是郊区(州代码和街道地址后的分隔逗号),最后是街道地址,即在其余字符串被删除和重写后剩余的任何字符串。
我认为向后工作是最好的,因为街道地址会发生变化,而最后 3 位信息是标准的。
是否可以在 VBA 中编写这样的宏?尤其是考虑到 SQLish 的表现。
【问题讨论】:
【参考方案1】:按照问题中的描述并假设地址格式保持不变,这是使用Split
的一种方法
Private Sub tt()
Dim strTest As String
Dim arr1
Dim arr2
Dim arr3
Dim StreetAddress As String
Dim Postcode As String
Dim StateCode As String
Dim SubUrb As String
strTest = "123 Fake Street, Suburbia QLD 4123"
arr1 = Split(strTest, ",")
StreetAddress = arr1(0)
arr2 = Split(Trim(arr1(1)), Space(1))
Postcode = arr2(2)
StateCode = arr2(1)
SubUrb = arr2(0)
End Sub
【讨论】:
我认为您需要将 arr2 的 ubound 用于邮政编码和州代码,以防郊区是两个字 如果任何部分改变了它的大小,整个代码都会被折腾。 :) 它会给出不正确的结果。这就是为什么声明..going by description in the question and assuming that the address format will remain same
.... 有时需要对冲:) 但感谢您的评论。【参考方案2】:
Excel 已经提供了可以实现您想要的功能。唯一的要求是将数据保存到光盘并从现有文件中打开它。该函数称为 Workbooks.OpenText,但请注意,它完全符合给定的参数,例如,如果您输入错误的分隔符,它最终可能会给您错误的结果,或者无法正确打开拆分的文件。
Workbooks.OpenText "filename", _
DataType:=XlTextParsingType.xlDelimited, Origin:=XlPlatform.xlWindows, _
Space:=True, TextQualifier:=XlTextQualifier.xlTextQualifierNone
这将打开一个空格分隔的文本或 CSV 文件并将值放入许多列中,返回一个工作簿对象,以便展开进一步的操作。
另一种方法是逐行读取文本并使用 VBA 字符串拆分“手动”将它们输入到相应的行和列中,这样做的好处是您可以操作数据并删除您不想要的字符必须即时进入文件。如果你愿意,我也可以举个例子。
【讨论】:
以上是关于使用 Excel VBA 将字符串分成列的主要内容,如果未能解决你的问题,请参考以下文章
使用特殊字符搜索单元格值时 VLOOKUP 的 Excel VBA 替代方案