Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2011, 13:00   #1
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию Макрос сохраниения листа книги

Здравствуйте Уважаемые форумчане!
Посздравляю Вас с наступающими праздниками, желаю счастья, здоровь, долгой и крепкой памяти!
Помогите пожалуйста подправить макрос сохранения активного листа книги и при сохранении чтобы сохранялись (преобразовывались формулы в значения) только значения в сохраняемом листе, а оригенал листа оставался не изменимым. В книге есть несколько листов и на них стоит защита листов, при сохранении нужно чтобы защита листа как в сохраняемом, так и в оригинале книги осталось.
Вот есть макрос, его и нужно подправить:

Sub Save()
Dim WbMain As Workbook
Dim Wb As Workbook
Dim FolderName As String
Dim Date_name As String
Application.EnableEvents = False
Set WbMain = ActiveWorkbook
FolderName = WbMain.Path & "\Archive"
On Error Resume Next
MkDir FolderName
Date_name = CStr(InputBox("Введиту дату для текущего периода (пример: май 2011)! ", "Дата"))
If Date_name <> Empty Then
If ActiveWorkbook.Visible = -1 Then
ActiveWorkbook.Copy я так понимаю нужно подправить что-то в выделения текста красным цветом
Set Wb = ActiveWorkbook

Wb.SaveAs FolderName _
& "\" & "Рапорт " & " " & Date_name & ".xls"
'Wb.Close False
End If
MsgBox "Книга " & ActiveSheet.Name & " в виде одного файла сохранен в папку " & FolderName
End If
Application.EnableEvents = True
End Sub


Заранение огромное спасибо!
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 06.05.2011, 14:17   #2
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Помогите пожалуста, уже сохранение сделал листа сделал. только ошибку выдает что форматы файлов отличаются, но книга открывается.
как убрать эту ошибку и как сохранять только значения листа?
Вложения
Тип файла: rar 111.rar (29.3 Кб, 25 просмотров)
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 06.05.2011, 14:23   #3
nilem
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 616
По умолчанию

Цитата:
Сообщение от staniiislav Посмотреть сообщение
Заранение огромное спасибо!
Ранить не будем, сразу убьем.
Попробуйте так:
Код:
Sub Save()
Dim WbMain As Workbook, Wb As Workbook
Dim FolderName As String, Date_name As String
'Application.EnableEvents = False
Application.ScreenUpdating = False
Set WbMain = ActiveWorkbook
FolderName = WbMain.Path & "\Archive"
On Error Resume Next
MkDir FolderName
Date_name = InputBox("Введиту дату для текущего периода (пример: май 2011)! ", "Дата")
If Date_name <> Empty Then
    If ActiveWorkbook.Visible = -1 Then
        ActiveSheet.Copy
        With ActiveWorkbook
            With .Sheets(1).UsedRange: .Value = .Value: End With
            .SaveAs Filename:=FolderName & "\Рапорт " & Date_name & ".xls", FileFormat:=-4143
            .Close False
        End With
    End If
    MsgBox "Книга " & ActiveSheet.Name & " в виде одного файла сохранен в папку " & FolderName
End If
'Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
EnableEvents закомментировал - не знаю для чего оно здесь.
nilem вне форума Ответить с цитированием
Старый 06.05.2011, 14:39   #4
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от nilem Посмотреть сообщение
Ранить не будем, сразу убьем.
Попробуйте так:
Код:
Sub Save()
Dim WbMain As Workbook, Wb As Workbook
Dim FolderName As String, Date_name As String
'Application.EnableEvents = False
Application.ScreenUpdating = False
Set WbMain = ActiveWorkbook
FolderName = WbMain.Path & "\Archive"
On Error Resume Next
MkDir FolderName
Date_name = InputBox("Введиту дату для текущего периода (пример: май 2011)! ", "Дата")
If Date_name <> Empty Then
    If ActiveWorkbook.Visible = -1 Then
        ActiveSheet.Copy
        With ActiveWorkbook
            With .Sheets(1).UsedRange: .Value = .Value: End With
            .SaveAs Filename:=FolderName & "\Рапорт " & Date_name & ".xls", FileFormat:=-4143
            .Close False
        End With
    End If
    MsgBox "Книга " & ActiveSheet.Name & " в виде одного файла сохранен в папку " & FolderName
End If
'Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
EnableEvents закомментировал - не знаю для чего оно здесь.
))) спасибо огромное ))), я вот методом тыка сделал вот так:

Sub Save()
Dim WbMain As Workbook
Dim Wb As Workbook
Dim FolderName As String
Dim Date_name As String
'Application.EnableEvents = False
Application.ScreenUpdating = False
Set WbMain = ActiveWorkbook
FolderName = WbMain.Path & "\Archive"
On Error Resume Next
MkDir FolderName
Date_name = CStr(InputBox("Введиту дату для текущего периода (пример: май 2011)! ", "Дата"))
If Date_name <> Empty Then
If ActiveWorkbook.Visible = -1 Then
ActiveSheet.Unprotect
ActiveSheet.Copy
Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFiltering:=True
Set Wb = ActiveWorkbook
Wb.SaveAs FolderName _
& "\" & "Рапорт " & " " & Date_name & ".xls", FileFormat:=-4143
Wb.Close False
End If
End If
MsgBox "Книга " & ActiveSheet.Name & " в виде одного файла сохранен в папку " & FolderName

'Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

силь тупа я сделал?
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 06.05.2011, 14:59   #5
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от nilem Посмотреть сообщение
Ранить не будем, сразу убьем.
Попробуйте так:
Код:
Sub Save()
Dim WbMain As Workbook, Wb As Workbook
Dim FolderName As String, Date_name As String
'Application.EnableEvents = False
Application.ScreenUpdating = False
Set WbMain = ActiveWorkbook
FolderName = WbMain.Path & "\Archive"
On Error Resume Next
MkDir FolderName
Date_name = InputBox("Введиту дату для текущего периода (пример: май 2011)! ", "Дата")
If Date_name <> Empty Then
    If ActiveWorkbook.Visible = -1 Then
        ActiveSheet.Copy
        With ActiveWorkbook
            With .Sheets(1).UsedRange: .Value = .Value: End With
            .SaveAs Filename:=FolderName & "\Рапорт " & Date_name & ".xls", FileFormat:=-4143
            .Close False
        End With
    End If
    MsgBox "Книга " & ActiveSheet.Name & " в виде одного файла сохранен в папку " & FolderName
End If
'Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
EnableEvents закомментировал - не знаю для чего оно здесь.
Спасибо большое Вас! Взял за основу Ваш вариант!
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 06.05.2011, 15:02   #6
nilem
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 616
По умолчанию

Вместо этого:
Код:
Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
имхо, лучше будет:
Код:
With .Sheets(1).UsedRange: .Value = .Value: End With
или, если там защита:
Код:
With .Sheets(1)
       .Unprotect
       .UsedRange.Value = .UsedRange.Value
       .Protect
End With
Это в ответ на предпредыдущий пост

Последний раз редактировалось nilem; 06.05.2011 в 15:04. Причина: пишу долго :)
nilem вне форума Ответить с цитированием
Старый 11.05.2011, 12:34   #7
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от nilem Посмотреть сообщение
Вместо этого:
Код:
Cells.Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
имхо, лучше будет:
Код:
With .Sheets(1).UsedRange: .Value = .Value: End With
или, если там защита:
Код:
With .Sheets(1)
       .Unprotect
       .UsedRange.Value = .UsedRange.Value
       .Protect
End With
Это в ответ на предпредыдущий пост
Спасибо вам огромное nilem!!! вот какой мой итоговый вариант:

Код:


Sub Save()
If MsgBox("Сохранить рапорт в Архив?", vbYesNo, "Подтверждение") = vbYes Then
Dim iyear As String, idate As Date
Dim Wsh As Worksheet
Dim FolderName As String
Dim fg_ As String, fm_ As String
'Application.EnableEvents = False
Application.ScreenUpdating = False

FolderName = ThisWorkbook.Path & "\Archive"
On Error Resume Next
MkDir FolderName

Set Wsh = ThisWorkbook.ActiveSheet: iyear = CStr(Year([B9])): idate = [B9]
fg_ = Format(idate, "yyyy"): fm_ = Format(idate, "mmmm")
If idate <> Empty Then
If ActiveWorkbook.Visible = -1 Then
ActiveSheet.Unprotect
ActiveSheet.Copy

With ActiveWorkbook
.Sheets(1).Shapes(1).Delete
With ActiveSheet.UsedRange: .Value = .Value: End With
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFiltering:=True
.SaveAs Filename:=FolderName & "\" & fg_ & "\" & fm_ & "\Рапорт " & Wsh.Name & " (" & idate & ").xls", FileFormat:=-4143
.Close False
End With
End If

MsgBox "Лист " & Wsh.Name & " в виде одного файла сохранен в папку " & FolderName & "\" & fg_ & "\" & fm_
End If
End If
'Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 11.05.2011, 13:02   #8
nilem
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 616
По умолчанию

Переменная iyear не лишняя?
Первую строчку можно так:
Код:
If MsgBox("Сохранить рапорт в Архив?", vbYesNo, "Подтверждение") = vbNo Then Exit Sub
и тогда последний End If убираем.
nilem вне форума Ответить с цитированием
Старый 11.05.2011, 16:36   #9
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от nilem Посмотреть сообщение
Переменная iyear не лишняя?
Первую строчку можно так:
Код:
If MsgBox("Сохранить рапорт в Архив?", vbYesNo, "Подтверждение") = vbNo Then Exit Sub
и тогда последний End If убираем.
Вы абсолютно правы. Убрал ненужную переменную и убрал последний ИФ.
Спасибо ))) я почти счастлив ))))
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос постоянно обрабатывает события. При открытии другой книги макрос обрывается. Ples Microsoft Office Excel 8 17.12.2016 18:15
Как перейти из макроса Книги в макрос листа valerij Microsoft Office Excel 15 30.04.2011 01:51
выбор листа книги из ComboBox prosto_i Microsoft Office Excel 0 08.04.2011 14:32
Макрос активной книги открывает книги xlsm содержащих auto_open Daren Microsoft Office Excel 0 28.01.2011 09:34
снятие пароля с книги/листа из другой книги? Bezdar Microsoft Office Excel 3 25.12.2008 11:59