Ошибка выполнения Excel VBA «70»: в разрешении отказано

Вот сценарий модуля VBA:

Sub ExportToTXT()
Dim wsData As Variant
Dim myFileName As String
Dim FN As Integer
Dim p As Integer, q As Integer
Dim path As String
Dim myString As String
Dim lastrow As Long, lastcolumn As Long

lastrow = Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row
lastcolumn = ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Column
path = "C:\Users\MiniMe\Desktop\GE2\"

For p = 7 To lastcolumn
  wsData = ActiveSheet.Cells(8, p).Value
  'If wsData = "" Then Exit Sub
  myFileName = ActiveSheet.Cells(1, p).Value
  myFileName = myFileName & ".txt"
  myFileName = path & myFileName
  'MsgBox myFileName
  For q = 7 To lastrow
    myString = myString & " " & Cells(q, p)

    FN = FreeFile
    Open myFileName For Output As #FN
        Print #FN, myString
    Close #FN
  Next q
  myString = ""
Next p

End Sub

Я использую модуль VBA для экспорта столбцов Excel в файлы TXT, но получаю ошибку выполнения 70 (Permission Denied). Если я запускаю сценарий снова и снова, это приводит к появлению еще нескольких файлов или символов TXT в каждом файле TXT, но в конечном итоге все равно будет та же ошибка. Отладка показывает, что ошибка возникает на Open myFileName For Output As #FN. Поскольку файл Excel содержит огромные объемы данных, мне интересно, пытается ли сценарий VBA перейти к выводу следующего файла TXT в цикле, не завершив вывод текущего файла TXT. Это всего лишь предположение, поскольку я новичок в VBA и довольно некомпетентен.

Я пытался решить проблему самостоятельно, но не могу преодолеть это препятствие. Есть предположения? Заранее БОЛЬШОЕ СПАСИБО! Это действительно хорошее дело.


person jdgieschen    schedule 04.07.2020    source источник
comment
Возможно, вам нужно будет проверить myFileName = ActiveSheet.Cells(1, p).Value, может ли он содержать недопустимые символы или ничего не значит   -  person Mo Khalefa    schedule 04.07.2020
comment
После строки Close #FN введите DoEvents. Теперь попробуйте еще раз   -  person Siddharth Rout    schedule 04.07.2020
comment
Возможно ли, что в вашем списке файлов есть повторяющиеся имена?   -  person RBarryYoung    schedule 04.07.2020
comment
Добавьте ловушку ошибки (On Error Goto) и покажите имя файла в окне сообщения (MsgBox(myFileName)) в ловушке ошибки. Это должно показать вам, в чем ваша проблема.   -  person Jonathan Willcock    schedule 04.07.2020
comment
Спасибо вам всем огромное! Итак, я готовлю это! Так взволнован !!!   -  person jdgieschen    schedule 05.07.2020


Ответы (1)


Вам не нужно открывать и закрывать файл много раз. Либо вынимайте его из внутреннего q цикла, либо очищайте myString время от времени. В коде запись в текстовый файл выведена из цикла.

Sub ExportToTXT()
  Dim wsData As Variant
  Dim myFileName As String
  Dim FN As Integer
  Dim p As Long, q As Long
  Dim path As String
  Dim myString As String
  Dim lastrow As Long, lastcolumn As Long
  
  lastrow = Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row
  lastcolumn = Sheets("Sheet1").Cells(1, Columns.Count).End(xlToLeft).Column
  path = "C:\Users\MiniMe\Desktop\GE2\"
  
  For p = 7 To lastcolumn
    wsData = Sheets("Sheet1").Cells(8, p).Value
    'If wsData = "" Then Exit Sub
    myFileName = ActiveSheet.Cells(1, p).Value
    myFileName = myFileName & ".txt"
    myFileName = path & myFileName
    'MsgBox myFileName
    myString = ""
    For q = 7 To lastrow
      myString = myString & " " & Cells(q, p)
    Next q
    FN = FreeFile
    Open myFileName For Output As #FN
    Print #FN, myString
    Close #FN
  Next p

End Sub

Изменить: p и q объявлены как Long после исправления от @Tim Williams, а Write #FN, myString изменен на Print #FN, myString

person Super Symmetry    schedule 04.07.2020
comment
Это решило проблему. Я так благодарен !!! Теперь мне просто нужно выяснить, какая переменная вызывает ошибку переполнения. У меня 40 000 строк, и, кажется, у меня максимальное значение переменной - 32 767. У меня Dim lastrow As Long, lastcolumn As Long, но, похоже, это не мешает. Мысли, или стоит задать отдельный вопрос? Тем не менее, большое вам спасибо! - person jdgieschen; 05.07.2020
comment
@jdgieschen - q объявлен как целое число. Нет причин не использовать Long везде, где у вас может возникнуть соблазн использовать Integer. - person Tim Williams; 05.07.2020
comment
Вот это да. Это то, что мне нужно было услышать. Это сработало. Это потрясающе!!! Я не могу дождаться! Спасибо! - person jdgieschen; 05.07.2020