Excel VBA Excel对列进行迭代

时间:2018-11-27 00:32:39

标签: excel vba excel-vba

我编写了一个简单的VBA脚本,该脚本可打开给定文件夹中的所有.xls文件,并将这些文件中的所需信息复制并粘贴到新小册子中。新小册子中的每一行都与该文件夹中的文件相关联。像这样

    Column1, Column2, Column3
    FileName1,ABC, XYZ
    FileName2, DEF,TUV

第3列中的信息的格式为

    "ArbitraryString1(Very_Important_Info)ArbitraryString2"

因为我希望Column3看起来不错,所以我遍历了每一行并使用了

Range("C"&X).TextToColumns DataType:=xlDelimited, Other:=True _
OtherChar:="("
Columns("E:E").Insert Shift:=xlToRight *
Range("D"&X).TextToColumn DataType:=xlDelimited, Other:=True _
OtherChar:=")"
Range("C"&X).TextToColumns DataType:=xlDelimited, Other:=True _
OtherChar:="(" **
Columns("E:Z").Delete
Columns("C:C").Delete

最后,我结束了

    Column1, Column2, Column3
    FileName1,ABC, Very_Important_Info_1
    FileName2, DEF,Very_Important_Info_2

*这是必需的,因此当我第二次调用TextToColumn时,没有收到询问我是否要覆盖该列中已有内容的消息。

**无论出于什么原因,在我第一次看到OtherChar:=“(”之后,我最终看到的是“(Very_Important_Info)ArbitraryString2”,其左参数仍附加在信息上,而不是使信息消失。有人知道吗为什么会这样呢?我不介意第二次调用该方法,但是如果没有它,我的C列将看起来像“(Very_Important_Info”,而且我不明白为什么会这样出现。

2 个答案:

答案 0 :(得分:5)

使用SPLIT

可能会更好
Sub TextToCols()
    Dim rng As Range
    Dim r As Range
    Dim l As Long
    Dim arr As Variant

    With ActiveSheet
        l = .Cells(.Rows.Count, "C").End(xlUp).Row

        Set rng = Range("C2:C" & l)
        For Each r In rng
            r.Value = Application.WorksheetFunction.Substitute(r.Value, ")", "(")
            arr = Split(r.Value, "(")
            Cells(r.Row, 3).Value = arr(1)
        Next r

    End With
End Sub

或文本到列:

Sub TextToCols()
    Dim rng As Range
    Dim r As Range
    Dim l As Long

    With ActiveSheet
        l = .Cells(.Rows.Count, "C").End(xlUp).Row

        Set rng = Range("C2:C" & l)
        For Each r In rng
            r.Value = Application.WorksheetFunction.Substitute(r.Value, ")", "(")
        Next r

        With .UsedRange.Columns("C").Cells
            .TextToColumns Destination:=Range("C1"), _
            DataType:=xlDelimited, _
            OtherChar:="("
        End With

    End With
End Sub

答案 1 :(得分:0)

这是Michal Rosa代码的简化版本:

Sub BeautifyIt()
    With Worksheets("Sheet1")
        With .Range("C2", .Range("C" & .Rows.Count).End(xlUp))
            .Replace ")", "("
            .TextToColumns Destination:=.Cells(1, 1), DataType:=xlDelimited, _
                           TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
                           Semicolon:=False, Comma:=False, Space:=False, Other:=True, _
                           OtherChar:="(", FieldInfo:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True
        End With
    End With
End Sub