Закрыть № 1 - Принудительно использовать неэкспонентный код. Зачем? - PullRequest
0 голосов
/ 12 мая 2018

Мне бы хотелось получить какое-то направление ...

Я хотел бы использовать этот код:

Do While x <> y

    Open myFile.txt For Input As #1
    Open anotherFile.txt For Output As #2

        'doStuff

    Write #2, myString
    Close #1
    Close #2

    Open anotherFile.txt For Input As #3    'Note: same file as #2 above

        'do stuff
    print #3, myString   
    Close #3

Loop

Приведенный выше код иногда выдает: «Ошибка времени выполнения 52. Плохой файл»название номера. "при попытке открыть # 3

Тем не менее, после простого нажатия на резюме, оно продолжается без вмешательства

Что я должен использовать, это:

Do While x <> y

    Open myFile.txt For Input As #1
    Open anotherFile.txt For Output As #2

        'doStuff

    Write #2, myString
    Close #1
    Close #2

    On Error Resume Next
        Close #3             'YES, CLOSE AGAIN
        Sleep 250           'GIVE IT TIME TO ACTUALL CLOSE

        'ATTEMPT TO OPEN  NOTE, SAME FILE AS #2 ABOVE
        Open anotherFile.txt For Input As #3
        If Err.Number <> 0 Then   'CHECK FOR THE ERROR
            Close #3   'ISSUE ANOTHER CLOSE
            Err.Number = 0
            Sleep 250  'GIVE IT SOME TIME AGAIN
            Open anotherFile.txt For Input As #3 'ATTEMPT TO OPEN AGAIN
            If Err.Number <> 0 Then  'ERROR CHECK AGAIN
                MsgBox "Repeated Error " & Err.Description
                Stop
            End If
        End If
    On Error GoTo 0

        'do stuff
    Print #3, myString
    Close #3

Loop

К счастью, это никогдапроходит повторную проверку ошибок.При этом, однако, мне не нравится использовать такой неаккуратный код.

Есть идеи по этому поводу?

Большое спасибо!

Поездка

1 Ответ

0 голосов
/ 14 мая 2018

Пара проблем с вашим кодом:

  1. Предполагается, что file ID #3 доступно

FreeFile Function

  • Возвращает целое число, представляющее следующий номер файла, доступный для использования оператором Open
  • File Number - Номер, используемый в операторе Open для открытия файла. Используйте номера файлов в диапазоне 1-255 включительно для файлов, недоступных для других приложений. Используйте номера файлов в диапазоне 256-511 для файлов, доступных из других приложений

Syntax

  • FreeFile[(rangenumber)]

    • Необязательный аргумент rangenumber - это Variant, который указывает диапазон, из которого должен быть возвращен следующий свободный номер файла.
      • Укажите 0 (по умолчанию) для возврата номера файла в диапазоне 1 – 255 включительно.
      • Укажите 1, чтобы вернуть номер файла в диапазоне 256 – 511.

Remarks

  • Используйте FreeFile, чтобы указать номер файла, который еще не используется.

Скорее всего, причина "Run time error 52" ( Неверное имя файла или номер (Ошибка 52) )


  1. Возможно, вы пытаетесь открыть файл "anotherFile.txt" снова, слишком рано

    Существует способ повысить эффективность этой логики


.

Решение проблемы 1.


Option Explicit

Public Sub ProcesFiles1()
    Dim fileID As String, txt As String

    'Step 1 of 2 -------------------------------------------------------------------------

    fileID = FreeFile   'Next file number available for use by the Open statement
    Open "D:\Tmp\Test1.txt" For Input As #fileID    'Open file in a Read Mode
    txt = Input(LOF(fileID), #fileID)    'Store file content inside a variable
    Close #fileID                        'Clost Text File

    txt = Replace(txt, "string1", "string2")        'Step 1 of 2

    fileID = FreeFile
    Open "D:\Tmp\Test2.txt" For Output As #fileID   'Open file in Write Mode
    Print #fileID, txt  'Write New Text data to file
    Close #fileID       'Close Text File

    'Step 2 of 2 -------------------------------------------------------------------------

    fileID = FreeFile
    Open "D:\Tmp\Test2.txt" For Input As #fileID    'Open file2 (again) in Read Mode
    txt = Input(LOF(fileID), #fileID)
    Close #fileID

    txt = Replace(txt, "string2", "string3")        'Step 2 of 2

    fileID = FreeFile
    Open "D:\Tmp\Test2.txt" For Output As #fileID   'Open file2 (yet again) in Write Mode
    Print #fileID, txt
    Close #fileID
End Sub

Риск: проблема синхронизации - Step 1 конфликт с Step 2

.

Решение проблемы 2. - Объединение Step 1 и 2 (обработка текста независимо от объектов файлов)


Option Explicit

Public Sub ProcesFiles2()
    Dim fileID As String, txt As String

    fileID = FreeFile   'Next file number available for use by the FileOpen function
    Open "D:\Tmp\Test1.txt" For Input As #fileID    'Open file in a Read Mode
    txt = Input(LOF(fileID), #fileID)   'Store file content inside a variable
    Close #fileID                       'Clost Text File

    txt = Replace(txt, "string1", "string2")        'Step 1 of 2
    txt = Replace(txt, "string2", "string3")        'Step 2 of 2

    fileID = FreeFile
    Open "D:\Tmp\Test2.txt" For Output As #fileID   'Open file in Write Mode
    Print #fileID, txt  'Write New Text data to file
    Close #fileID       'Close Text File
End Sub
...