Уважаемые форумчане, помогите разобраться с проблемой. Для автоматического сохранения файлов Excel в формате .txt, соорудил код в VBA. Код вроде-бы простой, из поля берется строка, содержащая путь к файлу, далее каждый лист в файле сохраняется в формате .txt. Все бы ничего, но повторное выполнение данного кода происходит с ошибкой. Run-time error 91 Object variable or with block variable not set в выделенной строке
[vba]
Код
Private Sub Сохранение_Click() Dim Xls As Excel.Application Dim Sh As Worksheet Dim i As Long Dim StrXls As String Dim Quant As Long
With Application.CurrentProject StrXls = File_String Set Xls = New Excel.Application Xls.Visible = True Xls.Workbooks.Open (StrXls) Quant = Len(StrXls) Quant = Quant - 4 i = 0 For Each Sh In ActiveWorkbook.Worksheets 'Строка, в которой выходит ошибка Sh.Activate Xls.ActiveSheet.SaveAs FileName:=Left(StrXls, Quant) & i, FileFormat:=xlTextWindows i = i + 1 Next Sh ActiveWorkbook.Close SaveChanges:=False Xls.Quit End With End Sub
[/vba]
Уважаемые форумчане, помогите разобраться с проблемой. Для автоматического сохранения файлов Excel в формате .txt, соорудил код в VBA. Код вроде-бы простой, из поля берется строка, содержащая путь к файлу, далее каждый лист в файле сохраняется в формате .txt. Все бы ничего, но повторное выполнение данного кода происходит с ошибкой. Run-time error 91 Object variable or with block variable not set в выделенной строке
[vba]
Код
Private Sub Сохранение_Click() Dim Xls As Excel.Application Dim Sh As Worksheet Dim i As Long Dim StrXls As String Dim Quant As Long
With Application.CurrentProject StrXls = File_String Set Xls = New Excel.Application Xls.Visible = True Xls.Workbooks.Open (StrXls) Quant = Len(StrXls) Quant = Quant - 4 i = 0 For Each Sh In ActiveWorkbook.Worksheets 'Строка, в которой выходит ошибка Sh.Activate Xls.ActiveSheet.SaveAs FileName:=Left(StrXls, Quant) & i, FileFormat:=xlTextWindows i = i + 1 Next Sh ActiveWorkbook.Close SaveChanges:=False Xls.Quit End With End Sub
ActiveWorkbook вероятно не в Xls? И тогда в итоге сохраняется несколько раз один и тот же лист... А зачем тут Application.CurrentProject? Или я чего-то не знаю?
P.S. А, так я не знал, что это не в Экселе происходит... Тогда пас, качать не буду...
ActiveWorkbook вероятно не в Xls? И тогда в итоге сохраняется несколько раз один и тот же лист... А зачем тут Application.CurrentProject? Или я чего-то не знаю?
P.S. А, так я не знал, что это не в Экселе происходит... Тогда пас, качать не буду...Hugo
По ходу там после первого запуска остается экземпляр Excel висеть в диспетчере задач. Похоже, в этом дело. И даже Set xls = Nothing его не выключает. Это, так сказать, направление для поисков. Больше ничего сказать не могу.
По ходу там после первого запуска остается экземпляр Excel висеть в диспетчере задач. Похоже, в этом дело. И даже Set xls = Nothing его не выключает. Это, так сказать, направление для поисков. Больше ничего сказать не могу.Gustav
Могу посоветовать несколько иной путь. Не надо на каждое "Cохранить" создавать новую сессию Excel. Достаточно сделать это один раз при самом первом нажатии на кнопку "Cохранить". Для этого оберните создание экземпляра IFом проверки существования объекта: [vba]
Код
If Xls Is Nothing Then Set Xls = New Excel.Application End If
[/vba] Сам объект следует вынести из Private Sub Сохранение_Click() в область определений формы (вверху модуля формы, до всех подпрограмм): [vba]
Код
'Option Compare Database
Dim Xls As Excel.Application
[/vba] Ну и наконец закрывать Excel тоже только один раз - при закрытии формы: [vba]
Код
Private Sub Form_Close() Xls.Quit Set Xls = Nothing End Sub
[/vba] Если раздражает наличие пустого Excel во время работы формы, то можно его скрывать в определенные моменты при помомщи свойства Xls.Visible.
Могу посоветовать несколько иной путь. Не надо на каждое "Cохранить" создавать новую сессию Excel. Достаточно сделать это один раз при самом первом нажатии на кнопку "Cохранить". Для этого оберните создание экземпляра IFом проверки существования объекта: [vba]
Код
If Xls Is Nothing Then Set Xls = New Excel.Application End If
[/vba] Сам объект следует вынести из Private Sub Сохранение_Click() в область определений формы (вверху модуля формы, до всех подпрограмм): [vba]
Код
'Option Compare Database
Dim Xls As Excel.Application
[/vba] Ну и наконец закрывать Excel тоже только один раз - при закрытии формы: [vba]
Код
Private Sub Form_Close() Xls.Quit Set Xls = Nothing End Sub
[/vba] Если раздражает наличие пустого Excel во время работы формы, то можно его скрывать в определенные моменты при помомщи свойства Xls.Visible.Gustav