使用Application.GetOpenFilename后关闭vba中的文件

使用Application.GetOpenFilename后关闭vba中的文件,vba,excel,Vba,Excel,我正在用一个叫做OpenSees的软件分析钢筋混凝土建筑。分析结果以txt文件的形式写入,因此为了分析这些结果,我使用vba将txt文件读写到Excel中。第一次写入数据没有问题 当第一次将txt文件写入Excel后,我尝试在不关闭Excel的情况下再次运行OpenSees时,我的问题就出现了。Opensees指出,txt文件已打开,因此无法覆盖它们。我想在使用Close#1后,文件被关闭了 到目前为止,我要做的是第一次运行OpenSees,使用vba将结果写入Excel,保存并关闭Excel,

我正在用一个叫做OpenSees的软件分析钢筋混凝土建筑。分析结果以txt文件的形式写入,因此为了分析这些结果,我使用vba将txt文件读写到Excel中。第一次写入数据没有问题

当第一次将txt文件写入Excel后,我尝试在不关闭Excel的情况下再次运行OpenSees时,我的问题就出现了。Opensees指出,txt文件已打开,因此无法覆盖它们。我想在使用Close#1后,文件被关闭了

到目前为止,我要做的是第一次运行OpenSees,使用vba将结果写入Excel,保存并关闭Excel,第二次运行OpenSees。。。等等

我用来编写文件的主要代码是

ruta1 = Application.GetOpenFilename("text Files (*.out),*.out", MultiSelect:=True)
If Not IsEmpty(ruta1) Then

    For i = LBound(ruta1) To UBound(ruta1)

        Open ruta1(i) For Input As #1

        Do Until EOF(1)
            Line Input #1, linea
            valor = Split(linea, " ") ' valor(i) : 0 time - 1 Ux - 2 Uy - 3 Rz
            h5.Cells(f_elong + j, c_elong) = valor(1) / hw * 100
            h5.Cells(f_elong + j, c_elong + 1) = valor(2) / lw * 100
            h6.Cells(f_FD + j, c_FD) = valor(1) / hw * 100
            j = j + 1
        Loop

        Close #1

    Next

End If

不确定这是否能解决您的问题,但不要硬编码文件号;使用
FreeFile
函数,让VBA为您提供一个文件号:

Dim fileNumber As Integer
fileNumber = FreeFile

Open ruta1(i) For Input As #fileNumber

Do Until EOF(fileNumber)
    Line Input #fileNumber, linea
   ...
Loop

Close #fileNumber
此外,您正在处理外部资源-这里应该有适当的错误处理,带有一个清理子例程,确保在过程退出之前关闭所有打开的文件:

    On Error GoTo CleanFail

    Dim fileNumber As Integer
    ...

CleanExit:
    Close 'hammer: no file number closes all opened files
    Exit Sub

CleanFail:
    MsgBox Err.Description, vbCritical
    Resume CleanExit
End Sub

我认为仅仅使用
#1
作为文件处理程序没有问题,因为在处理后您将
关闭它。我无法真正模拟代码中出现问题的原因,但您可以在下面尝试测试它是否适合您。不是对你问题的直接回答,只是一个可能的解决办法


Application.GetOpenFilename
与此无关。它只检索和存储文件路径,但实际上并没有打开文件。谢谢,我认为“Application.GetOpenFilename”是打开文件的主要函数。@DeanOC我想知道为什么你从文章末尾删除了“谢谢”以及“问候”。使用Hi&thanking(以及所有派生词)被StackOverflow视为杂乱无章,不鼓励使用。在提交帖子时,诸如“嗨”之类的称呼会自动删除,而“谢谢”不会自动删除的唯一原因是SO更难获得正确的算法。这篇文章会给你更多的信息。就我个人而言,我认为这意味着你将感谢任何帮助。希望这能帮你解决问题。它不起作用:-(。我认为它有与前一个相同的缺点,它打开txt文件以读取和写入数组中的内容。附加信息:OpenSees创建了3个文件夹,其中包含大量txt文件。在OpenSees开始时(是一个使用tcl/tk的解释器)我使用的代码是“file delete-force\folder”。OpenSees在尝试删除vba写入其内容时打开的最后一个文件夹时显示错误消息。什么是自由文件,我看到您将其定义为整数…那么它是否像一个特殊的整数?以及,我必须在哪里放置“On error…”?在我在原始帖子中发布的代码块之后?谢谢
FreeFile
是VBA标准库中定义的一个函数,在
VBA.FileSystem
模块中;至于
On Error
,它通常是我需要处理错误的任何过程中的第一行可执行代码;-)我包括了所有的解决方案,但我一直有同样的问题。我解决这个问题的方法是,在我想要的文件被写入后,我给了一个“安慰剂”存档,所以最新打开的有用文件现在可以在下一次运行时免费重新写入。谢谢你的帮助。
Dim ruta1 As Variant
ruta1 = Application.GetOpenFilename("text Files (*.out),*.out", MultiSelect:=True)

If IsArray(ruta1) Then

    Dim linea, lines ' implicit Variant declaration

    For i = LBound(myTxt) To filecount
        Open myTxt(i) For Input As #1 ' Open the file
        ' Retrieve the lines of text and dump in an array
        lines = Split(Input$(LOF(1), #1), vbNewLine)
        Close #1 ' Close the file

        ' Work with the array instead of reading each line of the opened file
        Dim j As Long: j = 1 ' Or depending on what start value you require
        For Each linea In lines
            valor = Split(linea, " ") ' valor(i) : 0 time - 1 Ux - 2 Uy - 3 Rz
            h5.Cells(f_elong + j, c_elong) = valor(1) / hw * 100
            h5.Cells(f_elong + j, c_elong + 1) = valor(2) / lw * 100
            h6.Cells(f_FD + j, c_FD) = valor(1) / hw * 100
            j = j + 1
        Next
    Next

End If