Удаляю лист книги и пытаюсь ее сохранить ...

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

jojo
Сообщения: 14
Зарегистрирован: 24 май 2004, 11:20
Контактная информация:

Удаляю лист книги и пытаюсь ее сохранить
Error вылазит:
can't enter break mode at this time и потом еще type mismatch
Код:

Private Sub CB_Load_Click()
' Загрузка из файла
With CommonDialog1
.Filter = "Файлы Excel (*.xls)| *.xls" 'Фильтр для открытия файла
.InitDir = "C:\"
.Action = 1 'Или же CommonDialog1.ShowOpen
'.Filename = "TS"
End With
Application.Workbooks.Open CommonDialog1.Filename
TS_Open = ActiveWorkbook.Name
nResult = MsgBox("Внимание лист таблицы соответствия будет заменен. Вы согласны ? ", vbYesNo + vbExclamation, "Будем заменять лист таблицы соответствия ? !")
If nResult = vbYes Then
Workbooks("osv.xls").Activate
Workbooks("osv.xls").Worksheets("Таблица соответствия").Select
ActiveWindow.SelectedSheets.Delete
Workbooks("osv.xls").Save
Jojo®
BeerMaster
Сообщения: 11
Зарегистрирован: 07 июл 2004, 12:09
Откуда: Красноярск

попробуй перед удалением запретить предупреждения:

Application.DisplayAlerts = False
ActiveWindow.SelectedSheets.Delete
Application.DisplayAlerts = True
__________
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

jojo, в какой конкретно строке возникает type mismatch?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

BeerMaster, Ваш совет правильный, и важен, когда дело доходит до ActiveWindow.SelectedSheets.Delete, но судя по перечню ошибок указанных автором вопроса, то до ActiveWindow.SelectedSheets.Delete еще далеко. Если из приведенного кода исключить работу с CommonDialog1 то абсолютно никаких предпосылок для возникновения указанных ошибок не будет.

jojo, где-то возникает type mismatch (несоответствие типов), и это первичная ошибка. VBA при этом должен перейти в break mode (выделить желтым строку с ошибкой), но по каким-то непонятным мне причинам возникает вторичная ошибка, связанная с невозможностью перехода в Break mode. В связи с этим дополнительный встречный вопрос: Что за CommonDialog используется в этом проекте? Из какой библиотеки?
jojo
Сообщения: 14
Зарегистрирован: 24 май 2004, 11:20
Контактная информация:

Использую, бросил прямо на лист
MS Common Dialog Control 6.0. (SP3)

Млин хрень хреновская ...чё делать то ...
Не катит - ошибка Automation error -2147221080(800401a8)

Private Sub CB_Load_Click()
' Загрузка из файла
With CommonDialog1
.Filter = "Файлы Excel (*.xls)| *.xls" 'Фильтр для открытия файла
.InitDir = "C:\"
.Action = 1 'Или же CommonDialog1.ShowOpen
End With
Application.Workbooks.Open CommonDialog1.FileTitle
TS_Open = CommonDialog1.FileTitle
nResult = MsgBox("Внимание лист таблицы соответствия будет заменен. Вы согласны ? ", vbYesNo + vbExclamation, "Будем заменять лист таблицы соответствия ? !")
If nResult = vbYes Then
Workbooks("osv.xls").Activate
Workbooks("osv.xls").Worksheets("Таблица соответствия").Select
Application.DisplayAlerts = False
ActiveWindow.SelectedSheets.Delete
Application.DisplayAlerts = True
ActiveWorkbook.Save


Workbooks("ts.xls").Activate
Workbooks("ts.xls").Worksheets("Таблица соответствия").Select
Workbooks("ts.xls").Worksheets("Таблица соответствия").Copy Before:=Workbooks("osv.xls").Sheets(5)
Workbooks("ts.xls").Activate
ActiveWorkbook.Close SaveChanges:=False, Filename:=TS_Open
MsgBox ("Внимание ! Таблица соответствия сохранена в файле OSV.XLS !")
End If

End Sub
Jojo®
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Использую, бросил прямо на лист
MS Common Dialog Control 6.0. (SP3)
Млин хрень хреновская ...чё делать то ...
Да... У меня такого и нету вообще.
Досадно, что никак не вызвать родной диалог Excel которым открываются файлы.

Впрочем решение есть. Вместо MS Common Dialog Control 6.0. надо просто воспользоваться функцией WinApi.
Сходите на доску по WinApi (ShellApi) - спросите. Там есть функция для выбора директории и функция для выбора файла. Они делают стандартные диалоговые окна. Мы ее на VBA переведем.

Я бы сам посмотрел, но все мои хелпы и примеры сейчас от меня далеко :(
jojo
Сообщения: 14
Зарегистрирован: 24 май 2004, 11:20
Контактная информация:

Есть вариант еще воспользоваться в встроенным диалоговым окошком для открытия файлов:

Private Sub CB_Load_Click()
If (Application.Dialogs(xlDialogOpen).Show("*.xls")) Then
Dim newBook As Workbook

Set newBook = Application.Workbooks(Application.Workbooks.Count)
nResult = MsgBox("Внимание лист таблицы соответствия будет заменен. Вы согласны ? ", vbYesNo + vbExclamation, "Будем заменять лист таблицы соответствия ? !")
If nResult = vbYes Then
'нельзя удалять из книги последний лист
If newBook.Worksheets.Count > 1 Then
Application.DisplayAlerts = False
On Error GoTo NoSheet
newBook.Worksheets("Sheet1").Delete
On Error GoTo 0
Application.DisplayAlerts = True
End If

newBook.Save
newBook.Close SaveChanges:=False
End If
End If

NoSheet:
MsgBox "нет такого листа"
Exit Sub

End Sub
Jojo®
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Application.Dialogs
Черт! Как это не заметил этот метод!? ;)

Ну так как? Все получилось?
jojo
Сообщения: 14
Зарегистрирован: 24 май 2004, 11:20
Контактная информация:

Спасибо за помощь :) !
Да этот альтернативный способ работает !!! ...но у меня начинается путаница с активными книгами
лист удаляется ... но не в той книге ... :( , то закрывается не та книга
Посмотрите пож-та выше - моя задача
1.удалить лист в 1-ой книге
2.скопировать лист из 2 книги в 1 книгу
Вот код на котором я остановился

Private Sub CB_Load_Click1()
Dim newBook As Workbook

If (Application.Dialogs(xlDialogOpen).Show("*.xls")) Then
TS_Open = ActiveWorkbook.Name
Set newBook = Application.ActiveWorkbook

Application.Workbooks("osv.xls").Activate
Application.Workbooks("osv.xls").Worksheets("Таблица соответствия").Select

nResult = MsgBox("Внимание лист таблицы соответствия будет заменен. Вы согласны ? ", vbYesNo + vbExclamation, "Будем заменять лист таблицы соответствия ? !")
If nResult = vbYes Then
'нельзя удалять из книги последний лист
If newBook.Worksheets.Count > 1 Then
Application.DisplayAlerts = False
On Error GoTo NoSheet
ThisWorkbook.Worksheets("Таблица соответствия").Delete
On Error GoTo 0
Application.DisplayAlerts = True
End If

Workbooks(TS_Open).Activate
Workbooks(TS_Open).Worksheets("Таблица соответствия").Select
Workbooks(TS_Open).Worksheets("Таблица соответствия").Copy Before:=Workbooks("osv.xls").Sheets(5)
Workbooks(TS_Open).Activate
ActiveWorkbook.Close SaveChanges:=False
newBook.Save
'newBook.Close SaveChanges:=False
MsgBox ("Внимание ! Таблица соответствия сохранена в файле OSV.XLS !")
End If
End If

NoSheet:
MsgBox "нет такого листа"
Exit Sub

End Sub
Jojo®
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Вообще-то, вместо свистопляски с прыганьем между листами и книгами я бы написал так:

Код: Выделить всё

  Workbooks("Книга2").Sheets("Лист3").Delete
  Workbooks("Книга1").Sheets("Лист3").Copy Before:=Workbooks("Книга2").Sheets(1)
Т.е не вызывая метод Activate, а точно указывая местоположение объекта. И на экране при этом ничего не будет мигать!


Предварительно проверить наличие удаляемых и копируемых листов удобно с помощью функции:

Код: Выделить всё

Function SheetPresent(ByVal ABook As String, ByVal ASheet As String) As Boolean
   On Error Resume Next
   Set Sh = Workbooks(ABook).Worksheets(ASheet)
   SheetPresent = Not IsEmpty(Sh)
End Function
Вызывается как if SheetPresent("Книга1","Лист2") then .....
Ответить