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

时间:2015-05-04 01:13:06

标签: excel vba excel-vba

我在一个名为OpenSees的软件中运行钢筋混凝土建筑物的分析。分析结果写在txt文件中,因此为了分析这些结果,我使用vba读取并将txt文件写入Excel。第一次写入数据没有问题。

第一次将txt文件写入Excel后,我尝试再次运行OpenSees而不关闭Excel,我的问题就出现了。 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

2 个答案:

答案 0 :(得分:3)

不确定这是否可以解决您的问题,但不要对文件编号进行硬编码;请改用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 :(得分:0)

我认为仅仅使用#1作为文件处理程序存在问题,因为您在执行处理后Close。我无法真实地模拟您在代码中遇到问题的原因,但您可以尝试下面测试它是否适合您。 不是您问题的直接答案,只是一种可能的解决方法。

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