Excel VBA打开/选择多个文本文件并查找/替换,然后保存/关闭它们

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

0

我有一个脚本可以打开多个文本文件,替换一些字符并保存/关闭文件。但是,代码仅为我提供了在选择框提示时打开1个文件而不是多个文件的选项。如何更新此选项以一次选择/打开多个文本文件以运行“查找/替换”文本功能

以下是我正在使用的代码:

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
,并且至少选择了一个文件

所以,如果你看到的是一个
布尔值,你要做的就是摆脱困境;如果它是一个
字符串
,则创建一个仅包含此一个文件名的变量数组;如果它已经是一个变体数组,那么您可以使用它运行

一旦选定的文件数(/the
MultiSelect
参数)变得无关紧要(因为我们现在看到的是一个变量数组),剩下要做的就是迭代数组,每次迭代处理一个文件:

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