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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2013, 03:57   #1
elf80
Пользователь
 
Регистрация: 09.08.2009
Сообщений: 33
По умолчанию Как поправить код?

Доброго времени суток уважаемые! Необходима ваша помощь. Имеется код сохранения листа Excel в отдельную книгу и в определённую директорию. Вопрос: как поправить код, что-бы сохранялись значения вместо формул (ну и соответственно форматирование)

Вот собственно код, нашел и немного переделал, а дальше не могу понять как сохранить только значения. Спасибо!
К сожалению файл выложить не могу ввиду конфиденциальности информации.


Sub СохранитьЛистВФайл()
On Error Resume Next
' путь к папке, в которую по-умолчанию будет предложено сохранить файл
Folder$ = "C:\Documents and Settings\user\Рабочий стол\Сводки\Архив\Доклад": MkDir Folder$
ChDrive Left(Folder$, 1): ChDir Folder$ ' выбираем стартовую папку
' формируем имя файла из текста ячеек
Filename = [a1] & ".xlsx"

' копируем активный лист (при этом создаётся новая книга)
Err.Clear: Sheets("доклад").Copy: DoEvents

If Err Then Exit Sub ' произошла какая-то ошибка при попытке копирования листа

' убеждаемся, что активной книгой является копия листа
If ActiveWorkbook.Worksheets.Count = 1 And ActiveWorkbook.Path = "" Then
' сохраняем файл под заданным именем в формате XLSX (xlOpenXMLWorkbook - Excel 2007)
ActiveWorkbook.SaveAs Filename, xlOpenXMLWorkbook
' закрываем сохранённый файл
ActiveWorkbook.Close False
End If
'скрываем лист после сохранения в архиве
Sheets("доклад").Select
ActiveWindow.SelectedSheets.Visible = False
End Sub

По возможности сохранить лист без макросов и кнопки (имеется на листе оригинала)

Последний раз редактировалось elf80; 06.05.2013 в 04:12.
elf80 вне форума Ответить с цитированием
Старый 06.05.2013, 06:38   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Перед тем, как сохранять созданную книгу, выполните
Код:
Dim x, y As Shape
ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value
For Each y In ActiveSheet.Shapes: y.Delete: Next
On Error Resume Next
For Each x In ActiveWorkbook.VBProject.VBComponents
    Select Case x.Type
        Case 1 To 3: x.Collection.Remove x
        Case 100: x.CodeModule.DeleteLines 1, x.CodeModule.CountOfLines
    End Select
Next
В результате, все ссылки, формулы и т. д. будут заменены их значениями, а также будут удалены все стандартные модули, модули класса, UserForm, программный код из всех модулей листа, книги и все объекты на рабочем листе.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 06.05.2013, 07:04   #3
elf80
Пользователь
 
Регистрация: 09.08.2009
Сообщений: 33
По умолчанию

Спасибо SAS888, я правильно вставил код? Если да - то у меня в оригинале формулы меняются на значения, а в сохранённом листе формулы остаются. Что не так? Сам не разберусь, VBA только изучаю.

Sub СохранитьЛистВФайл()
On Error Resume Next
' путь к папке, в которую по-умолчанию будет предложено сохранить файл
Folder$ = "C:\Documents and Settings\user\Рабочий стол\Сводки\Архив\Доклад": MkDir Folder$
ChDrive Left(Folder$, 1): ChDir Folder$ ' выбираем стартовую папку
' формируем имя файла из текста ячеек
Filename = [a1] & ".xlsx"
' копируем активный лист (при этом создаётся новая книга)
Err.Clear: Sheets("доклад").Copy: DoEvents
If Err Then Exit Sub ' произошла какая-то ошибка при попытке копирования листа
' убеждаемся, что активной книгой является копия листа
If ActiveWorkbook.Worksheets.Count = 1 And ActiveWorkbook.Path = "" Then
Dim x, y As Shape
ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value
For Each y In ActiveSheet.Shapes: y.Delete: Next
On Error Resume Next
For Each x In ActiveWorkbook.VBProject.VBComponen ts
Select Case x.Type
Case 1 To 3: x.Collection.Remove x
Case 100: x.CodeModule.DeleteLines 1, x.CodeModule.CountOfLines
End Select
Next
' сохраняем файл под заданным именем в формате XLSX (xlOpenXMLWorkbook - Excel 2007)
ActiveWorkbook.SaveAs Filename, xlOpenXMLWorkbook
' закрываем сохранённый файл
ActiveWorkbook.Close False
End If
'скрываем лист после сохранения в архиве
Sheets("доклад").Select
ActiveWindow.SelectedSheets.Visible = False
End Sub
elf80 вне форума Ответить с цитированием
Старый 06.05.2013, 07:49   #4
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Попробуйте так:
Код:
Sub СохранитьЛистВФайл()
    Dim x, y As Shape: On Error Resume Next
    Application.ScreenUpdating = False: Application.DisplayAlerts = False
    Folder$ = "C:\Documents and Settings\user\Рабочий стол\Сводки\Архив\Доклад": MkDir Folder$
    Filename = Folder$ & "\" & [a1] & ".xlsx"
    Sheets("доклад").Copy: DoEvents
    ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value
    For Each y In ActiveSheet.Shapes: y.Delete: Next
    For Each x In ActiveWorkbook.VBProject.VBComponents
        Select Case x.Type
            Case 1 To 3: x.Collection.Remove x
            Case 100: x.CodeModule.DeleteLines 1, x.CodeModule.CountOfLines
        End Select
    Next
    ActiveWorkbook.SaveAs Filename, xlOpenXMLWorkbook
    ActiveWorkbook.Close False
    Sheets("доклад").Visible = False
 End Sub
Если не получится - прикрепите проблемный файл.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 06.05.2013, 08:14   #5
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

On Error Resume Next нужно всегда сопровождать On Error GoTo 0. Ведь пропустить ошибку нужно в каком-то месте кода, а не во всём коде.
Скрипт вне форума Ответить с цитированием
Старый 06.05.2013, 08:30   #6
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
Сообщение от Скрипт Посмотреть сообщение
On Error Resume Next нужно всегда сопровождать On Error GoTo 0. Ведь пропустить ошибку нужно в каком-то месте кода, а не во всём коде.
Совершенно верно. Я не знаю, зачем он здесь вообще нужен. Возможно, что это какой-то фрагмент кода автора темы, а игнорирование ошибки осталось от полного кода...
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 06.05.2013, 08:34   #7
elf80
Пользователь
 
Регистрация: 09.08.2009
Сообщений: 33
По умолчанию

SAS888 к сожалению проблема осталась, т.е. в оригинале формулы удаляются, а в копии сохраняются и пропал запрос на перезапись файла копии листа при наличии такого же в папке. Файл не могу выложить для всеобщего обозрения, информация конфиденциальная.
elf80 вне форума Ответить с цитированием
Старый 06.05.2013, 08:57   #8
elf80
Пользователь
 
Регистрация: 09.08.2009
Сообщений: 33
По умолчанию

Вот часть файла, думаю будет понятно
Вложения
Тип файла: rar 06 05 13г.rar (27.7 Кб, 19 просмотров)
elf80 вне форума Ответить с цитированием
Старый 06.05.2013, 09:02   #9
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

1. Запрос на перезапись я специально убрал. Если же Вам это надо, то удалите из кода
Код:
Application.DisplayAlerts = False
2. Работу кода проверил. Все ОК. После копирования листа в новую книгу, он становится активным. Далее мы с ним и работаем. Скорее всего, проблема в том, что копируемый лист очень "тяжелый". Поэтому, макрос продолжает работать еще в то время, как активным является копируемый лист.
Если это так, то Вам должна помочь задержка выполнения последующего кода. Для этого, вместо DoEvents вставьте строку:
Код:
For i = 1 To 100000: DoEvents: Next
Счетчик цикла подберите экспериментально.
3. Можно, конечно, прикрепить не оригинальный файл, а подобный. Но, боюсь, что ели причина в вышеупомянутой проблеме, то "легкий" файл не даст истинной картины...
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 06.05.2013, 09:05   #10
elf80
Пользователь
 
Регистрация: 09.08.2009
Сообщений: 33
По умолчанию

Сейчас попробую. В файле, что я выложил получается та же самая история, т.е. в оригинале формулы затираются значениями
elf80 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как поправить код? Sanek_81 Microsoft Office Word 2 10.02.2011 17:19
Нужно поправить код SenFeron Помощь студентам 2 04.01.2011 19:54
поправить код! Cruelbob Общие вопросы C/C++ 6 12.05.2010 23:33
Нужно поправить код kimoncar PHP 0 13.04.2010 12:52
Поправить Код... Lucchese Общие вопросы C/C++ 1 25.01.2010 20:00