(VBA Excel) 从字符串中提取文本和相关字母并输出结果
(VBA Excel) Extract Text and related Letter from String and output result
所以我的场景是有带数字的字母:
程序后的期望输出(注意视觉上使用了下划线,但我需要 space:
____________F
__G
_____E
__G__E______F
目前我已经在Number and First Letter Column中编写了提取数字和首字母的代码:
第一个字母:
LEFT(A2,1)
人数:
=SUMPRODUCT(MID(0&A2,LARGE(INDEX(ISNUMBER(--MID(A2,ROW(:),1))*ROW(:),0),ROW(:))+1,1)*10^ROW(:)/10)
现在我的 VBA 脚本可以使用数字和字符来获取信息并输出 (对于一个错误代码):
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 越多越好。 请告诉我这是否很慢,或者是否有更快、更简单的方法来执行此操作! :)
----------------------------最终数据---------------- --------------------------
这不是一个完整的答案,但是对于伪代码的第二点,您可以使用通配符 # 在字符串中搜索任何数字字符。更多信息在这里 MSDN.
我就是这样做的 -
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
到文件。
所以我的场景是有带数字的字母:
程序后的期望输出(注意视觉上使用了下划线,但我需要 space:
____________F
__G
_____E
__G__E______F
目前我已经在Number and First Letter Column中编写了提取数字和首字母的代码:
第一个字母:
LEFT(A2,1)
人数:
=SUMPRODUCT(MID(0&A2,LARGE(INDEX(ISNUMBER(--MID(A2,ROW(:),1))*ROW(:),0),ROW(:))+1,1)*10^ROW(:)/10)
现在我的 VBA 脚本可以使用数字和字符来获取信息并输出 (对于一个错误代码):
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 越多越好。 请告诉我这是否很慢,或者是否有更快、更简单的方法来执行此操作! :)
----------------------------最终数据---------------- --------------------------
这不是一个完整的答案,但是对于伪代码的第二点,您可以使用通配符 # 在字符串中搜索任何数字字符。更多信息在这里 MSDN.
我就是这样做的 -
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
到文件。