我在一个名为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
答案 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