(VBA Excel) 从字符串中提取文本和相关字母并输出结果

Posted

技术标签:

【中文标题】(VBA Excel) 从字符串中提取文本和相关字母并输出结果【英文标题】:(VBA Excel) Extract Text and related Letter from String and output result 【发布时间】:2015-06-16 19:38:29 【问题描述】:

所以我的场景是有一个带数字的字母:

程序后所需的输出(注意下划线在视觉上使用,但我需要一个空格:

____________F
__G
_____E
__G__E______F

目前我已经在数字和首字母列中编写了代码来提取数字和首字母:

第一个字母:

LEFT(A2,1)

编号:

=SUMPRODUCT(MID(0&A2,LARGE(INDEX(ISNUMBER(--MID(A2,ROW($1:$25),1))*ROW($1:$25),0),ROW($1:$25))+1,1)*10^ROW($1:$25)/10)

现在我的 VBA 脚本可以使用数字和字符来获取 (对于 ONE 错误代码)的信息和输出:

Private Sub Code_Printer_Click()

Dim myFile As String, rng As Range, cellValue As Variant, I As Integer, j As Integer

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

Open myFile For Output As #1

For I = 1 To rng.Rows.Count
    For j = 1 To rng.Columns.Count

If j = rng.Columns.Count Then
    cellValue = Space(rng.Cells(I, 1)) + CStr(rng.Cells(I, 2).Value)
    Print #1, cellValue
End If

    Next j
    cellValue = ""
Next I

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

End Sub

结果:

所以请帮我在同一个事件中处理多个代码。

如果需要完成 excel 功能,那很好。如果在 VBA 中提取数字更容易,那也没关系。非技术人员会使用,所以 VBA 越多越好。 如果这很慢,或者是否有更快、更简单的方法,请告诉我! :)

------------------最终数据---------------- ----------------------

【问题讨论】:

该列表是在一个单元格中还是在 3 个单元格中? 通常一个事件/条目有一个代码在其单独的单元格中,但有时一个事件可能有多个单元格都填充到一个单元格中,如 S、G、E 所示。 @Raystafarian 嘿,伙计,我能够澄清很多问题并包括屏幕截图。 我对你示例中的 122 感到困惑。 【参考方案1】:

我就是这样做的-

Sub test()
Dim myFile As String
myFile = "C:\reformatted.txt"
Open myFile For Output As #1
Dim iPar As Integer
Dim sChar As String
Dim sBlank As Long
Dim cont As Boolean

Dim mystring As String

For Each c In Range("A:A")
If c <> "" Then
'Get first
        iPar = InStr(1, c, "(")
        If Mid(c, iPar - 1, 1) = "" Then
            If Mid(c, iPar - 2, 1) = "" Then
            sChar = Mid(c, iPar - 3, 1)
            Else: sChar = Mid(c, iPar - 2, 1)
            End If
        Else: sChar = Mid(c, iPar - 1, 1)
        End If
        If IsNumeric(Mid(c, iPar + 1, 2)) Then
            sBlank = Mid(c, iPar + 1, 2)
        Else: sBlank = Mid(c, iPar + 1, 1)
        End If
        mystring = Space(sBlank) & sChar
        cont = InStr(iPar + 1, c, "(")

    Do While cont = True

        iPar = InStr(iPar + 1, c, "(")
        If Mid(c, iPar - 1, 1) = "" Then
            If Mid(c, iPar - 2, 1) = "" Then
            sChar = Mid(c, iPar - 3, 1)
            Else: sChar = Mid(c, iPar - 2, 1)
            End If
        Else: sChar = Mid(c, iPar - 1, 1)
        End If
        If IsNumeric(Mid(c, iPar + 1, 2)) Then
            sBlank = Mid(c, iPar + 1, 2)
        Else: sBlank = Mid(c, 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, c, "(")

    Loop

       Print #1, mystring
     Else: Exit For
   End If
Next
Close #1
Shell "C:\Windows\Notepad.exe C:\reformatted.txt", 1

End Sub

所以它搜索第一个括号( 并处理字符和空格。然后它会寻找另一个( - 如果找到,它会继续,否则它完成(并打印)。

如果继续,它会找到下一个( 并执行相同的测试来查找字符和空格,然后检查字符串以查看字符串的长度是否大于空格数。如果是,它将用您的字符替换空白字符。如果不是,它会附加空格,然后在末尾插入字符。

然后它再次搜索( 以重复该过程。

现在它正在搜索 A 列并在 B 列中打印 - 根据需要进行调整。您可以将mystring 打印到文件中。

【讨论】:

这个选择的范围是怎么设置的?如何添加这行代码:Set rng = Selection 这个宏实用程序实际上是为其他人准备的。主要思想是他们打开模板,填充它,然后选择并单击一个按钮。所以我必须做那些跑腿的工作。大声笑。 我似乎无法完成这项工作。您介意使用 rng 选择和 shell 命令吗?具体来说,我对 else 子句中有“退出子”命令感到困惑 我明白了。另外我不太清楚如何以及何时打印到文件。如果您有时间,您可以输入文件的 print mystring 和 open 和 shell 命令吗?我尝试添加所有这些,但程序无法运行。 由于某种原因,这不会打印字符。我做了这个修改和一个空格的字符:Else: sChar = Mid(Cells(I, j).Value, iPar - 4, 1)【参考方案2】:

这不是一个完整的答案,但对于伪代码的第二点,您可以使用通配符 # 在字符串中搜索任何数字字符。更多信息在这里MSDN。

【讨论】:

我对这个问题澄清了很多。如果您有更多建议,请告诉我。 我相信 Raystafarians 的搜索方法是一种更好的方法,尤其是如果您想保留空格

以上是关于(VBA Excel) 从字符串中提取文本和相关字母并输出结果的主要内容,如果未能解决你的问题,请参考以下文章

Vba excel从给定长度之间的字符串中提取文本

从 pdf 中提取表格(到 excel),pref。带 vba

EXCEL VBA提取内容到指定位置

为啥 Excel 2010 VBA 用户窗体文本框字体会根据框架的大小而变化?

EXCEL VBA - 根据单元格范围和字符串创建动态下拉列表[关闭]

使用 Excel 宏从 SAP 中提取数据