Excel VBA打开/选择多个文本文件并查找/替换,然后保存/关闭它们
0 我有一个脚本可以打开多个文本文件,替换一些字符并保存/关闭文件。但是,代码仅为我提供了在选择框提示时打开1个文件而不是多个文件的选项。如何更新此选项以一次选择/打开多个文本文件以运行“查找/替换”文本功能 以下是我正在使用的代码:Excel VBA打开/选择多个文本文件并查找/替换,然后保存/关闭它们,excel,vba,Excel,Vba,0 我有一个脚本可以打开多个文本文件,替换一些字符并保存/关闭文件。但是,代码仅为我提供了在选择框提示时打开1个文件而不是多个文件的选项。如何更新此选项以一次选择/打开多个文本文件以运行“查找/替换”文本功能 以下是我正在使用的代码: Sub looptexttest() 'remove extra characters from text file Dim sBuf As String Dim sTemp As String Dim iFileNum As Integer Dim sFil
Sub looptexttest()
'remove extra characters from text file
Dim sBuf As String
Dim sTemp As String
Dim iFileNum As Integer
Dim sFileName As Variant
'Edit as needed
sFileName = Application.GetOpenFilename(, , , , True)
If sFileName = False Then
MsgBox "No File Selected", vbExlamation
Worksheets("Summary").Select
Exit Sub
End If
iFileNum = FreeFile
Open sFileName For Input As iFileNum
Do Until EOF(iFileNum)
Line Input #iFileNum, sBuf
sTemp = sTemp & sBuf & vbCrLf
Loop
Close iFileNum
sTemp = Replace(sTemp, ", ", "_")
'Save txt file as (if possible)
iFileNum = FreeFile
Open sFileName For Output As iFileNum
Print #iFileNum, sTemp
Close iFileNum
End Sub
此代码有效,只是不允许我一次选择多个文件。您需要更好地验证
sFileName
值。使用VarType
内置函数获取表示其数据类型的枚举值;如果是布尔值
,则该对话框被取消。如果是字符串
,多选
为假
,并且只选择了一个文件;如果是Variant()
数组,MultiSelect
为True
,并且至少选择了一个文件
所以,如果你看到的是一个布尔值,你要做的就是摆脱困境;如果它是一个字符串
,则创建一个仅包含此一个文件名的变量数组;如果它已经是一个变体数组,那么您可以使用它运行
一旦选定的文件数(/theMultiSelect
参数)变得无关紧要(因为我们现在看到的是一个变量数组),剩下要做的就是迭代数组,每次迭代处理一个文件:
Dim userSelection As Variant
userSelection = Application.GetOpenFileName(...)
Dim files As Variant
If VarType(userSelection) = vbBoolean Then
'dialog was cancelled
Debug.Assert CBool(userSelection) = False 'if code breaks here, there's a problem.
'msgbox...
Exit Sub
ElseIf VarType(userSelection) = vbString Then
'single file was selected, userSelection is just a string
files = Array(userSelection)
Else
'multiple files were selected, userSelection is a variant array
files = userSelection
End If
Dim i As Long
For i = LBound(files) To UBound(files)
Dim currentFile As String
currentFile = files(i)
Dim currentHandle As Long
currentHandle = FreeFile
Open currentFile For Input As #currentHandle
'read from #currentHandle...
Close #currentHandle
Next
考虑将这些问题分成更小、更专业的过程-这样,您的代码在每种情况下都使用一个文件名数组,唯一需要关心GetOpenFileName
如何参数化的过程是提示用户输入文件名的过程:
Private Function GetFilenamesToProcess() As Variant
Dim userSelection As Variant
userSelection = Application.GetOpenFileName(...)
If VarType(userSelection) = vbBoolean Then
'dialog was cancelled
GetFilenamesToProcess = Array() 'uninitialized array will have upper bound of -1
Exit Function
ElseIf VarType(userSelection) = vbString Then
'single file was selected, userSelection is just a string
GetFilenamesToProcess = Array(userSelection)
Else
'multiple files were selected, userSelection is a variant array
GetFilenamesToProcess = userSelection
End If
End Function
现在,您可以在主过程中拥有更高的抽象级别,从而更干净、更“专注”的代码:
Public Sub DoSomething()
Dim files As Variant
files = GetFilenamesToProcess
If UBound(files) < 0 Then
MsgBox "No files were selected!", vbExclamation
Exit Sub
End If
Dim i As Long
For i = LBound(files) To UBound(files)
ProcessFile files(i)
Next
End Sub
更新时,我添加了“sFileName=Application.GetOpenFilename(,,True)”,但是现在在下一行出现中断:如果sFileName=False,那么MsgBox“未选择文件”,vbExlamation工作表(“摘要”)。如果sFileName
是将包含布尔值的变量(False
),请选择退出子端如果对话框被取消,如果选择了一个文件,则为字符串
;如果选择了多个文件,则为变量数组。如果sFileName=False
,你不能只假设一个类型就执行,你需要先知道你在看什么。谢谢!这是我的。我在EOF休息。有什么想法吗?Sub-looptexttest()Dim sBuf As String Dim sTemp As String Dim x As Integer Dim sFileName As Variant sFileName=Application.GetOpenFilename(文件过滤器:=“Text Files(*.txt),*.txt”,u MultiSelect:=True,Title:=“要打开的文本文件”)如果TypeName(FilesToOpen)=“Boolean”则MsgBox“无选择”结束如果x=FreeFile Do直到EOF(x)行输入#x,sBuf sTemp=sTemp&sBuf&vbCrLf循环闭合x sTemp=Replace(sTemp,“,”,“"”)x=FreeFile Open sFileName,输出为x Print#x,sTemp Close x=x+1赞赏反馈。但是,第一个过程仍然不允许选择多个文件。我不明白如何组合此代码:(@AllaGoretoy是否允许多个选择是由应用程序.GetOpenFileName
方法的参数指定的。当我试图纠正此错误时,我收到一个错误…userSelection=Application.GetOpenFileName(*.txt),*.txt”)。当我将paranthesis保持为打开/空白时,我可以选择只选择一个文件:userSelection=Application.GetOpenFilename()。是否有一种方法可以操作代码,我只需对所选的所有文本文件执行全部替换?
Private Sub ProcessFile(ByVal filename As String)
Dim handle As Long
handle = FreeFile
Open filename For Input As #handle
'do stuff...
Close #handle
End Sub