使用 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 将字符串分成列的主要内容,如果未能解决你的问题,请参考以下文章

excel中能否将一列数据分成多列?

VBA研究用VBA取得EXCEL随意列有效行数

使用特殊字符搜索单元格值时 VLOOKUP 的 Excel VBA 替代方案

用vba,删除excel文件里某列数据中的[,]和[¥]两个特殊字符

在 VBA Excel 中难以找到行尾

VBA比较两个Excel数据的异同