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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2009, 22:20   #1
PVAOD
Пользователь
 
Регистрация: 06.12.2009
Сообщений: 11
По умолчанию Помогите автоматизировать

1 - Как научить Excel самому сохранять каждый новый документ под именем с номером на 1 единицу больше предыдущего документа? Например, уже сохранены файлы 01.xls, 02.xls, 03.xls и надо сохранять следующие под именами 04.xls, 05.xls и т.д.

2 - Как на Рабочем Листе Нового документа автоматически проставлять число на 1 единицу больше, чем в закрытом только что документе? Например, открываем Новый документ (из шаблона моего бланка), на Рабочем Листе проставляется число, скажем, 10. Сохраняем документ (автоматически присвоив ему имя 10.xls), открываем Новый документ, а у него на Рабочем Листе автоматически проставлено 11.
Научите, пожалуйста, как это сделать.
PVAOD вне форума Ответить с цитированием
Старый 06.12.2009, 22:41   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Сделать это несложно.

Но надо знать, что Вы подразумеваете под шаблоном.
Если это обычный файл excel, который Вы открываете и сохраняете сразу же под другим именем для создания копии - это одно (тут несложно всё сделать макросом)

Если же шаблон - это на самом деле шаблон Excel - файл с расширением xlt (Вы дважды щелкаете на этом шаблоне, в результате чего Excel сам создаёт книгу на основе этого шаблона) - то решение будет другим.
EducatedFool вне форума Ответить с цитированием
Старый 06.12.2009, 22:48   #3
PVAOD
Пользователь
 
Регистрация: 06.12.2009
Сообщений: 11
По умолчанию

Планирую использовать именно .xlt, но при осложнениях могу пользоваться и просто .xls
PVAOD вне форума Ответить с цитированием
Старый 06.12.2009, 22:57   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
но при осложнениях могу пользоваться и просто .xls
Осложнений-то особых нет.
Тут вопрос вот в чём - где хранить текущий номер файла...

В случае использования .xls номер можно хранить в самом файле
При использовании шаблона (поскольку при создании на его основе новой книги он не изменяется) - где-то в другом месте (например, в реестре Windows)

Цитата:
Как научить Excel самому сохранять каждый новый документ под именем с номером на 1 единицу больше предыдущего документа?
А обязательно выводить куда-то в ячейку номер книги?

Может, сделаем так:
При выборе пользователем команды Сохранить новый индекс книги читается из реестра, увеличивается на единицу, и файл сохраняется с новым именем.

С шаблоном XLT - одна проблема:
Вот только при создании книги на основе шаблона xlt на этот момент книга ещё не будет сохранена.
Как в этом случае указать макросу, в какую папку на диске сохранять файл?


Я бы использовал в качестве шаблона XLS
Открыли файл - нажали СОХРАНИТЬ - файл сохранился в той же папке под новым именем (с индексом на единицу больше)
EducatedFool вне форума Ответить с цитированием
Старый 06.12.2009, 23:04   #5
PVAOD
Пользователь
 
Регистрация: 06.12.2009
Сообщений: 11
По умолчанию

Звучит, вроде,неплохо, красиво.
Ну, и как это выглядит на языке математики теперь?
Идею-то и я выдвинул ,например, со счётчиками, но вот как осуществить - не знаю. Потому, собственно, и прошу помощи.
Пожалуйста!
PVAOD вне форума Ответить с цитированием
Старый 06.12.2009, 23:13   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Вот весь код:

Код:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If Not SaveAsUI Then    ' если пользователь нажал СОХРАНИТЬ, а не СОХРАНИТЬ КАК...
        n = Val(GetSetting("excel", "DocNumber", "n", 0)) ' читаем из реестра номер последнего документа
        n = n + 1    ' увеличиваем его на единицу
        SaveSetting "excel", "DocNumber", "n", n    ' записываем в реестр
        Cancel = True    ' отменяем команду сохранения под тем же именем
        Application.EnableEvents = False ' временно отключаем обработку событий книги
        ThisWorkbook.SaveAs Format(n, "000")    ' сохраняем под нужным именем
        Application.EnableEvents = True ' включаем обратно  обработку событий книги
    End If
End Sub

Сохраните этот файл на своём компе под любым именем, а потом нажимайте Ctrl + S
Каждый раз файл будет сохраняться под новым именем.
EducatedFool вне форума Ответить с цитированием
Старый 06.12.2009, 23:20   #7
PVAOD
Пользователь
 
Регистрация: 06.12.2009
Сообщений: 11
По умолчанию

Благодарю за предложенный вариант.
Но!
А как же с автономером на листе (при открытии)?
И можно ли посмотреть вариант решения с использованием .xlt ?
PVAOD вне форума Ответить с цитированием
Старый 06.12.2009, 23:23   #8
PVAOD
Пользователь
 
Регистрация: 06.12.2009
Сообщений: 11
По умолчанию

И нажиматься будет ТОЛЬКО "Сохранить", а не "Сохранить как...", потому что это должен делать макрос с безусловным сохранением изменений...
PVAOD вне форума Ответить с цитированием
Старый 06.12.2009, 23:25   #9
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
А как же с автономером на листе (при открытии)?
Нужно добавить в код всего одну строку:
Код:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If Not SaveAsUI Then    ' пользователь нажал СОХРАНИТЬ, а не СОХРАНИТЬ КАК...
        ' читаем из реестра номер последнего документа
        n = Val(GetSetting("excel", "DocNumber", "n", 0))
        n = n + 1    ' увеличиваем его на единицу
        SaveSetting "excel", "DocNumber", "n", n    ' записываем в реестр
        [a1] = "Это книга с номером " & n
        Cancel = True    ' отменяем команду сохранения под тем же именем
        Application.EnableEvents = False    ' временно отключаем обработку событий книги
        ThisWorkbook.SaveAs Format(n, "000")    ' сохраняем под нужным именем
        Application.EnableEvents = True    ' включаем обратно  обработку событий книги
    End If
End Sub
Цитата:
И можно ли посмотреть вариант решения с использованием .xlt ?
Там будет всё то же самое, кроме одного: при создании книги из шаблона вновь созданная книга ещё ни разу не сохранена.
Поэтому макрос не знает, в какую папку сохранять файл...
EducatedFool вне форума Ответить с цитированием
Старый 06.12.2009, 23:27   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
И нажиматься будет ТОЛЬКО "Сохранить", а не "Сохранить как...", потому что это должен делать макрос с безусловным сохранением изменений...
Да без проблем - надо убрать в коде 2 строки:

Код:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
        ' читаем из реестра номер последнего документа
        n = Val(GetSetting("excel", "DocNumber", "n", 0))
        n = n + 1    ' увеличиваем его на единицу
        SaveSetting "excel", "DocNumber", "n", n    ' записываем в реестр
        [a1] = "Это книга с номером " & n
        Cancel = True    ' отменяем команду сохранения под тем же именем
        Application.EnableEvents = False    ' временно отключаем обработку событий книги
        ThisWorkbook.SaveAs Format(n, "000")    ' сохраняем под нужным именем
        Application.EnableEvents = True    ' включаем обратно  обработку событий книги
End Sub
Теперь нажатие СОХРАНИТЬ КАК равносильно нажатию СОХРАНИТЬ - даже запрос имени файла выдаваться не будет.
EducatedFool вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите автоматизировать рутинный процесс maximax Microsoft Office Excel 29 21.09.2010 20:30
автоматизировать операцию Lakdi Microsoft Office Excel 1 29.09.2009 04:53
Как автоматизировать функцию? MilanAC Помощь студентам 2 13.08.2009 15:11
Автоматизировать ввод Radmir Microsoft Office Excel 1 23.02.2008 13:13
помогите автоматизировать тест в нтмl при помощи javascript dimitriy1987 JavaScript, Ajax 23 07.11.2007 15:53