将写入空格但不写入最后一个字符 (VBA Excel)

Will write spaces but not the last character (VBA Excel)

数据:

期望的输出:

当前输出:

我的当前代码:

Private Sub GenerateFlatFile_Click()
Dim myFile As String, rng As Range, cellValue As Variant, I As Integer, j As Integer, SpacingCode As String

Dim iPar As Integer
Dim sBlank As Long
Dim cont As Boolean
Dim mystring As String

myFile = "C:\Reformatted.txt"
Set rng = Selection

Open myFile For Output As #1

Dim strArr(1 To 63) As String, intBeg As Integer, intEnd As Integer, intCount As Integer, sChar As String

For I = 2 To rng.Rows.Count
    For j = 1 To rng.Columns.Count
        If InStr(1, CStr(Cells(1, j).Value), "63") = 1 Then
            strArr(Val(Cells(1, j).Value)) = Cells(I, j).Value
        ElseIf InStr(1, CStr(Cells(1, j).Value), "Code") Then

                iPar = InStr(1, CStr(Cells(I, j).Value), "(")
                If Mid(Cells(I, j).Value, iPar - 1, 1) = "" Then
                    If Mid(Cells(I, j).Value, iPar - 2, 1) = "" Then
                    sChar = Mid(Cells(I, j).Value, iPar - 3, 1)
                    Else: sChar = Mid(Cells(I, j).Value, iPar - 4, 1)
                    End If
                Else: sChar = Mid(Cells(I, j).Value, iPar - 2, 1)
                End If
                If IsNumeric(Mid(Cells(I, j).Value, iPar + 1, 2)) Then
                    sBlank = Mid(Cells(I, j).Value, iPar + 1, 2)
                Else: sBlank = Mid(Cells(I, j).Value, iPar + 1, 1)
                End If
                mystring = Space(sBlank) & sChar
                cont = InStr(iPar + 1, CStr(Cells(I, j).Value), "(")

            Do While cont = True

                iPar = InStr(iPar + 1, CStr(Cells(I, j).Value), "(")
                If Mid(Cells(I, j).Value, iPar - 1, 1) = "" Then
                    If Mid(Cells(I, j).Value, iPar - 2, 1) = "" Then
                    sChar = Mid(Cells(I, j).Value, iPar - 3, 1)
                    Else: sChar = Mid(Cells(I, j).Value, iPar - 2, 1)
                    End If
                Else: sChar = Mid(Cells(I, j).Value, iPar - 1, 1)
                End If
                If IsNumeric(Mid(Cells(I, j).Value, iPar + 1, 2)) Then
                    sBlank = Mid(Cells(I, j).Value, iPar + 1, 2)
                Else: sBlank = Mid(Cells(I, j).Value, iPar + 1, 1)
                End If

                If sBlank + 1 > Len(mystring) Then
                    mystring = mystring & Space(sBlank - Len(mystring)) & sChar
                Else: mystring = Application.WorksheetFunction.Replace(mystring, sBlank + 1, 1, sChar)
                End If
                cont = InStr(iPar + 1, CStr(Cells(1, j).Value), "(")

            Loop

        ElseIf InStr(1, CStr(Cells(1, j).Value), "Difference") Then
            SpacingCode = Space(rng.Cells(I, j))
        Else
        intBeg = Val(Left(Cells(1, j).Value, InStr(1, Cells(1, j).Value, "-") - 1))
        intEnd = Val(Right(Cells(1, j).Value, Len(Cells(1, j).Value) - InStr(1, Cells(1, j).Value, "-")))
        intCount = 1
        For t = intBeg To intEnd
            strArr(t) = Mid(Cells(I, j).Value, intCount, 1)
            intCount = intCount + 1
        Next t
        End If
    Next j
    For t = 1 To UBound(strArr)
        If strArr(t) = "" Then strArr(t) = " "
        cellValue = cellValue + strArr(t)
    Next t
    Erase strArr
    cellValue = cellValue + SpacingCode
    cellValue = cellValue + mystring
    Print #1, cellValue
    cellValue = ""
Next I

Close #1
Shell "C:\Windows\Notepad.exe C:\Reformatted.txt", 1
End Sub

我已经尝试了一段时间,但是当 ( 和字母之间有两个 space 时,它似乎不起作用。

F 和 G 有效,因为只有 1 个 space。只有当有多个字母代码或两个 space 时才不起作用。感谢您的宝贵时间!

看来您的问题只出在最后一列。这是一个 UDF,使用将

的正则表达式
  • 搜索字符串
  • 寻找任何 "word"(字母、数字、and/or 下划线的序列)后跟零个或多个 space,然后是左括号标记 (
  • 将这些单词序列组合成一个 space 分隔的字符串

您应该能够将其合并到您的代码中。

如果您提供有关可能的代码类型的更多详细信息,则正则表达式可能会更改,但上面的内容似乎适合。

============================================= ====

Function Codes(S As String) As String
    Dim RE As Object, MC As Object, M As Object

Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .Pattern = "\b(\w+)\s*\("
    If .test(S) = True Then
        Set MC = RE.Execute(S)
        For Each M In MC
            Codes = Codes & Space(1) & M.submatches(0)
        Next M
    End If
End With
Codes = Mid(Codes, 2)
End Function

============================================= ====