Профессиональные приемы работы в Microsoft Excel

Пожалуйста, войдите или зарегистрируйтесь.


Расширенный поиск  

Новости:

К первому сообщению темы должен быть прикреплен файл примера в формате xls*.
Приложив пример, Вы избавите себя и других от вопросов типа "А какой критерий?", "А куда выводить результат?", "А сколько строк?" и все тех же просьб выложить файл. Рисовать за Вас Ваши же таблички с заданиями, а затем и решение к ним, никто желанием не горит. Да и, как показывает практика, в большинстве случаев без файла решения не найти.

Автор Тема: Создание книги эксель на основе открытой книги нажатием на кнопку  (Прочитано 193 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Sveta

  • Пользователь
  • **
  • Уважение: +0/-0
  • Оффлайн Оффлайн
  • Сообщений: 11

Добрый день, дорогие профессионалы!
Прошу у вас срочной помощи!
Ситуация такова:
   Есть книга эксель, которая содержит несколько листов (их очень много). На каждом листе имеются таблицы, содержащие определенную информацию (на каждом листе разные таблицы, в файле из вложения предложены одинаковые таблицы).
   Таблицы имеют 2 столбца "Текущие" и "На конец месяца", которые есть абсолютно на каждом листке книги. 
   Необходимо установить кнопку, при нажатии на которую создавался точно такая же книга (для нового месяца), со всеми вложенными листами в нее и таблицами, но с пустым столбцом "Текущие" (не содержащие никаких значений), т.к. он должен заполнятся вручную, а в столбец "На конец месяца" переносились бы автоматически данными из столбца "Текущие". Можно ли это вообще реализовать и как?? ???

Нашла в интернете код макроса, но он для создания резервной копии.
Sub Macros15()
    ThisWorkbook.SaveCopyAs _
    Filename:=ThisWorkbook.Path & "\" & _
    ThisWorkbook.Name & "" & _
    Format(Date, "dd-mm-yy")
    End Sub
Пожалуйста, помогите мне, если можно...
Откликнитесь... Заранее спасибо!
« Последнее редактирование: 14.08.2018, 20:06:38 от vikttur »
Записан

runner

  • Постоялец
  • ***
  • Уважение: +7/-0
  • Оффлайн Оффлайн
  • Сообщений: 145

Я бы сделал так - записал макрорекордером процесс переноса данных из "Текущие" в "На конец месяца" значениями  и очистку исходных данных. После чего добавил бы сохранение под именем формируемым по маске с использованием функций СЕГОДНЯ, МЕСЯЦ или чего-то ещё, по желанию.
Записан

Sveta

  • Пользователь
  • **
  • Уважение: +0/-0
  • Оффлайн Оффлайн
  • Сообщений: 11

Теоретически я понимаю, но как реализовать кодом и что куда писать - нет(

И как макрорекордером записывать, если для этого надо чтобы новая книга уже была создана и из текущей книги в новую уже переписывать данные столбцов. Т.е. в коде первым должен идти процесс создания новой книги, а потом уже перенос данных...
Или я неправильно поняла?
« Последнее редактирование: 10.08.2018, 17:09:44 от vikttur »
Записан

runner

  • Постоялец
  • ***
  • Уважение: +7/-0
  • Оффлайн Оффлайн
  • Сообщений: 145

Sub CopyToNext()
'
' CopyToNext Макрос
'

'
    Sheets("данные1").Select 'начало секции
    Range("D5:D100").Select 'перемещаемый диапазон
    Selection.Copy
    Range("E5").Select  'первая ячейка диапазона куда перемещаем
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("D5:D100").Select
    Application.CutCopyMode = False
    Selection.ClearContents 'очистка исходного диапазона
    Range("A1:S1").Select   'конец секции
    Sheets("данные2").Select 'начало секции
    Range("D5:D100").Select 'перемещаемый диапазон
    Selection.Copy
    Range("E5").Select  'первая ячейка диапазона куда перемещаем
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("D5:D100").Select
    Application.CutCopyMode = False
    Selection.ClearContents 'очистка исходного диапазона
    Range("A1:S1").Select   'конец секции
    Sheets("данные1").Select
    Range("T1").Select
    ActiveCell.FormulaR1C1 = "=""Акт_""&TEXT(NOW(),""ГГГГ-ММ-ДД"")" 'формирование имени файла
    Range("T1").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    Application.ReplaceFormat.Clear 'очистка формата замены
    Dim WbFname$, TFname$, Twb As Workbook
    WbFname = ActiveWorkbook.FullName 'Запоминаем путь к активной книге
    Application.DisplayAlerts = False 'убирает предупреждение о замене и совместимости
    TFname = "C:\Users\*********************\" & Range("T1").Value 'Формируем путь сохранения с именем файла
    'Сохраняем книгу при этом активная книга закрывается и открывается сохраненная
    ActiveWorkbook.SaveAs Filename:=TFname, FileFormat:=xlExcel8, CreateBackup:=False
    Set Twb = ActiveWorkbook 'Запоминаем активную книгу в переменную
    ActiveWorkbook.Close False 'Закрываем книгу из переменной
    Range("A1").Select
End Sub

На один лист(вкладку) приходится одна "секция".
Я в коде сделал две, надо повторить их в том количестве, сколько их в файле, в каждой меняя ("данные1") на ("данные2")("данные3")("данные4") и так далее
Указал диапазон D5:D100, но, конечно же, можно поставить с бОльшим запасом, чтобы хватило наверняка.
И уже после всех секций завершающая часть кода начинающаяся с
    Sheets("данные1").Select
    Range("T1").Select
    ActiveCell.FormulaR1C1 = "=""Акт_""&TEXT(NOW(),""ГГГГ-ММ-ДД"")" 'формирование имени файла

В строке со звёздочками пропишите путь сохранения, как Вам надо.
Если в названии текущее число лишнее -в записи "ГГГГ-ММ-ДД" удалите "-ДД"  - останется только год и месяц.
В качестве побочного эффекта на первом листе в ячейке T1 останется имя файла

Часть кода с сохранением файла принадлежит кому-то из уважаемых форумчан, к стыду своему, не помню кому.


всё сделано исходя из того, что листы(вкладки) одинаковы по структуре. Если это не так, то надо изменить соответственно диапазон копирования[D5:D100] и адрес первой ячейки диапазона куда данные перемещаются [E5].
« Последнее редактирование: 10.08.2018, 16:07:21 от runner »
Записан

Sveta

  • Пользователь
  • **
  • Уважение: +0/-0
  • Оффлайн Оффлайн
  • Сообщений: 11

Большое спасибо за отклик.
Если не возражаете, еще один вопрос.

 Если у меня строки в таблицах будут добавляться, то все придется переделывать.
Можно ли сделать в цикле?
Например, в столбце АА поставить ключевое слово, например, "начало" (откуда уже идет основная таблица без шапки), т.е. программа будет понимать, что отсюда начинать обрабатывать.  Сделать условие, что если в колонке С есть текст, то переносим данные из колонки "Текущие" в "На конец месяца", и где-то в том же столбце АА есть другое ключевое слово - "конец", которое показывает, что обработку закончить на данном листе.

Не понимаю как правильно написать код, т.к. я вообще не программист. Начала так: (но это грубо говоря для перебора всех листов, которые надо обработать, т.к. в книге листов много, а переносить данные надо не на всех листах. Здесь у меня в том же столбце АА есть символ "!!!", чтобы программа понимала какие листы обрабатывать), но что-то даже это не работает.
Sub Create()
Dim WS_Count As Integer
Dim I As Integer
Dim Y As Integer
Dim r1 As Integer
Dim r2 As Integer

WS_Count = ActiveWorkbook.Worksheets.Count

 For I = 1 To WS_Count
     For r2 = 1 To 50
     If Cells(r1, r2).Value = "!!!" Then MsgBox ("!!!")
    Next 
 Next I
End Sub
« Последнее редактирование: 14.08.2018, 20:07:44 от vikttur »
Записан

runner

  • Постоялец
  • ***
  • Уважение: +7/-0
  • Оффлайн Оффлайн
  • Сообщений: 145

Если строки будут добавляться, но структура столбцов и первая задействованная строка неизменны,  то просто увеличьте диапазон до размера заведомо превышающего возможное количество добавляемых строк - пусть будет не D5:D100 а D5:D1000 - уверен, тормозов не заметите.

Я тоже не программист, к сожалению, поэтому такой цикл не напишу :(
Кстати, я бы использовал в качестве опорного вместо "!" какой-нибудь другой знак - восклицательный знак при поиске может восприниматься как любой единичный символ (как звёздочка - любое количество любых символов)
Записан

GWolf

  • Старожил
  • ****
  • Уважение: +50/-0
  • Оффлайн Оффлайн
  • Сообщений: 926

... но что-то даже это не работает.

Доброго времени суток!

Ваш код, к сожалению, работать и не будет. Ну, в смысле - по листам "ходить".
А вот так: Sub stepS()
    Dim Wss As Worksheet
   
    For Each Wss In ActiveWorkbook.Worksheets
        Wss.Select '- это просто, что бы было видно, что действительно "шагаем"
        MsgBox Wss.Name ' - ну а тут оповещаем где находимся.
    Next
End Sub
будет.

Будут вопросы - спрашивайте.
« Последнее редактирование: 15.08.2018, 16:14:45 от GWolf »
Записан
Путей к вершине - множество. Этот один из многих!
 



Темы без ответов

30.09.2018 10:24 Расчет процентов за определенный период (месяц) с учетом изменений и платежей 394
03.03.2018 00:00 Подсчет отработанного времени, за исключением заранее определенных перерывов 1190
14.02.2018 10:11 Подготовить читабельную отчетность по платежам 1189
23.01.2018 13:46 Найти вероятность повторной покупки 1083
12.01.2018 23:56 Сделать отчет на Power BI (Dashboard) 1522
06.09.2017 10:43 Solver VBA не решает гиперболическое уравнение, но при этом решает гармоническое 1367
17.08.2017 12:15 Гиперссылка и фильтр одновременно макрос 1729
23.05.2017 11:20 Копирование данных из одной таблицы в умную таблицу по условию 3480
15.03.2017 15:45 автозамена картинок PowerPoint 1975
11.03.2017 13:43 Изменить нумерацию страниц 2103





Яндекс цитирования msexcel.ru Яндекс.Метрика

Страница сгенерирована за 0.147 секунд. Запросов: 113.