Страницы: 1
RSS
Выгрузка Excel(2016) по заданным параметрам., Выгрузка Excel(2016) по заданным параметрам, тем который задаём по потребность.
 
При выгрузке в Excel (2016) необходимо, в автоматическом режиме форматировать в умную таблицу, убрать ненужные столбцы и внести формулу на один столбец. Приходится часто выгружать таблицу и ручками убирать лишние столбцы форматировать в умную таблицу и вносить формулу с подитогом.Красным выделено, что убрать. Жёлтым, что необходимо добавить. Каким образом можно автоматизировать данную выгрузку? Заранее всем участвующим в данном вопросе благодарен.
 
Код
Option Explicit

Sub Таблица_поумничай()
    CloseEmptyWb
    ActiveSheet.Copy
    
    Dim xx As Long, colName As Variant
    For xx = ActiveSheet.UsedRange.Columns.Count To ActiveSheet.UsedRange.Column Step -1
        For Each colName In Array("Приоритет", "Осталось на выполнение", "Категории")
            If Cells(1, xx).Value = colName Then
                Columns(xx).EntireColumn.Delete
            End If
        Next
    Next
    ActiveSheet.Shapes(1).Delete
    ActiveSheet.ListObjects.Add(xlSrcRange, ActiveSheet.UsedRange, , xlYes).Name = "Таблица1"
    ActiveSheet.ListObjects(1).TableStyle = "TableStyleLight13"
    ActiveSheet.ListObjects(1).ShowTotals = True
    ActiveSheet.ListObjects(1).ListColumns("Статус").TotalsCalculation = xlTotalsCalculationCount
    ActiveSheet.ListObjects(1).ListColumns("Изменена").TotalsCalculation = xlTotalsCalculationNone
    ActiveSheet.ListObjects(1).Range.Select
End Sub

Private Sub CloseEmptyWb()
    Dim wb As Workbook
    For Each wb In Application.Workbooks
        If wb.Path = "" Then wb.Close False
    Next
End Sub

 
PQ
Код
let
        Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Removed Columns" = Table.RemoveColumns(Source,{"Приоритет", "Осталось на выполнение", "Категории"}),
        #"Try Type" = Table.TransformColumnTypes(#"Removed Columns", {{"Изменена", type datetime}}, "sk-SK"), 
       StatusList = Table.Column(#"Try Type", "Статус"),
    StatusNonEmpty = List.Select(StatusList, each _ <> null and (not (Value.Is(_, type text) and Text.Trim(Text.From(_)) = ""))),
    CountStatus = List.Count(StatusNonEmpty),
        Cols = Table.ColumnNames(#"Try Type"),
    FooterRow = List.Transform(
        Cols,
        (c) =>
            if c = "№" then "Σ"
            else if c = "Статус" then Number.ToText(CountStatus)
            else null
    ),
    Footer = Table.FromRows({FooterRow}, Cols),

        Result = Table.Combine({#"Try Type", Footer})
in
    Result
Изменено: draginoid - 03.03.2026 16:01:50
 
Цитата
написал:
Option Explicit Sub Таблица_поумничай()    CloseEmptyWb    ActiveSheet.Copy         Dim xx As Long, colName As Variant    For xx = ActiveSheet.UsedRange.Columns.Count To ActiveSheet.UsedRange.Column Step -1        For Each colName In Array("Приоритет", "Осталось на выполнение", "Категории")            If Cells(1, xx).Value = colName Then                Columns(xx).EntireColumn.Delete            End If        Next    Next    ActiveSheet.Shapes(1).Delete    ActiveSheet.ListObjects.Add(xlSrcRange, ActiveSheet.UsedRange, , xlYes).Name = "Таблица1"    ActiveSheet.ListObjects(1).TableStyle = "TableStyleLight13"    ActiveSheet.ListObjects(1).ShowTotals = True    ActiveSheet.ListObjects(1).ListColumns("Статус").TotalsCalculation = xlTotalsCalculationCount    ActiveSheet.ListObjects(1).ListColumns("Изменена").TotalsCalculation = xlTotalsCalculationNone    ActiveSheet.ListObjects(1).Range.SelectEnd Sub Private Sub CloseEmptyWb()    Dim wb As Workbook    For Each wb In Application.Workbooks        If wb.Path = "" Then wb.Close False    NextEnd Sub
Спасибо. В данном макросе не отформатировано под дату колонка "F" и "J"
 
Цитата
написал:
Option Explicit

Sub Таблица_поумничай()
   CloseEmptyWb
   ActiveSheet.Copy
   
   Dim xx As Long, colName As Variant
   For xx = ActiveSheet.UsedRange.Columns.Count To ActiveSheet.UsedRange.Column Step -1
       For Each colName In Array("Приоритет", "Осталось на выполнение", "Категории")
           If Cells(1, xx).Value = colName Then
               Columns(xx).EntireColumn.Delete
           End If
       Next
   Next
   ActiveSheet.Shapes(1).Delete
   ActiveSheet.ListObjects.Add(xlSrcRange, ActiveSheet.UsedRange, , xlYes).Name = "Таблица1"
   ActiveSheet.ListObjects(1).TableStyle = "TableStyleLight13"
   ActiveSheet.ListObjects(1).ShowTotals = True
   ActiveSheet.ListObjects(1).ListColumns("Статус").TotalsCalculation = xlTotalsCalculationCount
   ActiveSheet.ListObjects(1).ListColumns("Изменена").TotalsCalculation = xlTotalsCalculationNone
   ActiveSheet.ListObjects(1).Range.Select
End Sub

Private Sub CloseEmptyWb()
   Dim wb As Workbook
   For Each wb In Application.Workbooks
       If wb.Path = "" Then wb.Close False
   Next
End Sub
Код ваш рабочий, но при выгрузке большего объёма данных (этот файл из-за ограничений сайта по объёмам данных не смог направить) пропадает подитог в столбце "B"
 
Цитата
написал:
В данном макросе не отформатировано под дату колонка "F" и "J"
Верно, столбцы F и J дополнительно не форматируются.
А должны? Пересмотрел сообщение #1, там ни слова про эту часть.
 
Цитата
написал:
Option Explicit Sub Таблица_поумничай()    CloseEmptyWb    ActiveSheet.Copy         Dim xx As Long, colName As Variant    For xx = ActiveSheet.UsedRange.Columns.Count To ActiveSheet.UsedRange.Column Step -1        For Each colName In Array("Приоритет", "Осталось на выполнение", "Категории")            If Cells(1, xx).Value = colName Then                Columns(xx).EntireColumn.Delete            End If        Next    Next    ActiveSheet.Shapes(1).Delete    ActiveSheet.ListObjects.Add(xlSrcRange, ActiveSheet.UsedRange, , xlYes).Name = "Таблица1"    ActiveSheet.ListObjects(1).TableStyle = "TableStyleLight13"    ActiveSheet.ListObjects(1).ShowTotals = True    ActiveSheet.ListObjects(1).ListColumns("Статус").TotalsCalculation = xlTotalsCalculationCount    ActiveSheet.ListObjects(1).ListColumns("Изменена").TotalsCalculation = xlTotalsCalculationNone    ActiveSheet.ListObjects(1).Range.SelectEnd Sub Private Sub CloseEmptyWb()    Dim wb As Workbook    For Each wb In Application.Workbooks        If wb.Path = "" Then wb.Close False    NextEnd Sub
Так же не форматируется в умную таблицу.
 
Цитата
написал:
Так же не форматируется в умную таблицу.
Случайно умную со сводной таблицей не путаете?
 
Нет, не путаю.  
 
Скажу словами великого Лёвы:
- А это что, абориген хренов?!  :D
Цитата
написал:
ActiveSheet.ListObjects.Add(xlSrcRange, ActiveSheet.UsedRange, , xlYes).Name = "Таблица1"
 
Цитата
написал:
Option Explicit Sub Таблица_поумничай()    CloseEmptyWb    ActiveSheet.Copy         Dim xx As Long, colName As Variant    For xx = ActiveSheet.UsedRange.Columns.Count To ActiveSheet.UsedRange.Column Step -1        For Each colName In Array("Приоритет", "Осталось на выполнение", "Категории")            If Cells(1, xx).Value = colName Then                Columns(xx).EntireColumn.Delete            End If        Next    Next    ActiveSheet.Shapes(1).Delete    ActiveSheet.ListObjects.Add(xlSrcRange, ActiveSheet.UsedRange, , xlYes).Name = "Таблица1"    ActiveSheet.ListObjects(1).TableStyle = "TableStyleLight13"    ActiveSheet.ListObjects(1).ShowTotals = True    ActiveSheet.ListObjects(1).ListColumns("Статус").TotalsCalculation = xlTotalsCalculationCount    ActiveSheet.ListObjects(1).ListColumns("Изменена").TotalsCalculation = xlTotalsCalculationNone    ActiveSheet.ListObjects(1).Range.SelectEnd Sub Private Sub CloseEmptyWb()    Dim wb As Workbook    For Each wb In Application.Workbooks        If wb.Path = "" Then wb.Close False    NextEnd Sub
Можно вас попросить прокомментировать все действия. Я хотел бы добавить ещё действие, что бы убрать столбец "Исполнители". В Excel слаб, поэтому прошу, возможно по делитански. Спасибо.

Например:
Next    ActiveSheet.Shapes(1).Delete       "удаляет ....................."
 
Алексей Панов, добрый день.
Цитата
написал:
Можно вас попросить прокомментировать все действия.
ИИ хорошо комментирует код :)
И лучше не цитировать целый код при каждом ответе.  
 
Цитата
написал:
Можно вас попросить прокомментировать все действия.
Код
Option Explicit 'В модуле обязательно объявлять переменные. Да, да, оказывается в VBA можно не объявлять переменные.
 
Sub Таблица_поумничай()     'Название макроса
    CloseEmptyWb    'Вызов вспомогательной процедуры для закрытия "пустых" книг.
    ActiveSheet.Copy    'Копируем активный лист в новую книгу.
     
    Dim xx As Long, colName As Variant
    For xx = ActiveSheet.UsedRange.Columns.Count To ActiveSheet.UsedRange.Column Step -1    'Перебираем столбцы с последнего до первого
        For Each colName In Array("Приоритет", "Осталось на выполнение", "Категории")   'Перебираем названия столбцов для удаления
            If Cells(1, xx).Value = colName Then    'Если значение в первой строке равно названию для удаления
                Columns(xx).EntireColumn.Delete     'удаляем весь столбец
            End If
        Next
    Next
    ActiveSheet.Shapes(1).Delete    'Удаляем кнопку, которая скопировалась вместе с листом.
    ActiveSheet.ListObjects.Add(xlSrcRange, ActiveSheet.UsedRange, , xlYes).Name = "Таблица1"   'Создаём умную таблицу.
    ActiveSheet.ListObjects(1).TableStyle = "TableStyleLight13" 'Задаём стиль умной таблицы
    ActiveSheet.ListObjects(1).ShowTotals = True    'Отображаем строку итогов.
    ActiveSheet.ListObjects(1).ListColumns("Статус").TotalsCalculation = xlTotalsCalculationCount   'В строке итогов в столбце Статус ставим формулу подсчёта значений
    ActiveSheet.ListObjects(1).ListColumns("Изменена").TotalsCalculation = xlTotalsCalculationNone  'В строке итогов в столбце Изменена ставим формулу подсчёта значений
    ActiveSheet.ListObjects(1).Range.Select 'Выделяем диапазон умной таблицы.
End Sub
 
Private Sub CloseEmptyWb() 'Вспомогательная процедура для закрытия "пустых" книг.
    Dim wb As Workbook
    For Each wb In Application.Workbooks    'Перебираем книги в приложении
        If wb.Path = "" Then wb.Close False 'Если книга не была ни разу сохранена, закрыть без сохранения.
    Next
End Sub
Цитата
написал:
Я хотел бы добавить ещё действие, что бы убрать столбец "Исполнители".
Напишите, нашли ли, куда внести изменения, интересно всё-таки.
 
Цитата
написал:
Напишите, нашли ли, куда внести изменения, интересно всё-таки.
Не нашёл...
 
Цитата
написал:
For Each colName In Array("Приоритет", "Осталось на выполнение", "Категории")
это?
 
Цитата
написал:
For Each colName In Array("Приоритет", "Осталось на выполнение", "Категории")это?
Верно. Знания приобретены, уже можно пробовать свои силы на этом форуме в качестве помогатора )
 
Цитата
написал:
Option Explicit Sub Таблица_поумничай()    CloseEmptyWb    ActiveSheet.Copy         Dim xx As Long, colName As Variant    For xx = ActiveSheet.UsedRange.Columns.Count To ActiveSheet.UsedRange.Column Step -1        For Each colName In Array("Приоритет", "Осталось на выполнение", "Категории")            If Cells(1, xx).Value = colName Then                Columns(xx).EntireColumn.Delete            End If        Next    Next    ActiveSheet.Shapes(1).Delete    ActiveSheet.ListObjects.Add(xlSrcRange, ActiveSheet.UsedRange, , xlYes).Name = "Таблица1"    ActiveSheet.ListObjects(1).TableStyle = "TableStyleLight13"    ActiveSheet.ListObjects(1).ShowTotals = True    ActiveSheet.ListObjects(1).ListColumns("Статус").TotalsCalculation = xlTotalsCalculationCount    ActiveSheet.ListObjects(1).ListColumns("Изменена").TotalsCalculation = xlTotalsCalculationNone    ActiveSheet.ListObjects(1).Range.SelectEnd Sub Private Sub CloseEmptyWb()    Dim wb As Workbook    For Each wb In Application.Workbooks        If wb.Path = "" Then wb.Close False    NextEnd Sub
Не могу понять по какой причине перестала работать функция в макросе: "Создание умной таблицы" "Расчёт промежуточного итога". Скажите, куда можно направить файль (не проходит из-за большого объёма) .
 
Промежуточные итоги могут не вставляться, например, по следующим причинам:
- нет столбцов "Статус" или "Изменена"
- таблица занимает все строки 1048576 на листе , для промежуточных итогов не осталось места
Код
Option Explicit 'В модуле обязательно объявлять переменные. Да, да, оказывается в VBA можно не объявлять переменные.
  
Sub Таблица_поумничай()     'Название макроса
    CloseEmptyWb    'Вызов вспомогательной процедуры для закрытия "пустых" книг.
    ActiveSheet.Copy    'Копируем активный лист в новую книгу.
      
    Dim xx As Long, colName As Variant
    For xx = ActiveSheet.UsedRange.Columns.Count To ActiveSheet.UsedRange.Column Step -1    'Перебираем столбцы с последнего до первого
        For Each colName In Array("Приоритет", "Осталось на выполнение", "Категории")   'Перебираем названия столбцов для удаления
            If Cells(1, xx).Value = colName Then    'Если значение в первой строке равно названию для удаления
                Columns(xx).EntireColumn.Delete     'удаляем весь столбец
            End If
        Next
    Next
    If ActiveSheet.Shapes.Count > 0 Then ActiveSheet.Shapes(1).Delete      'Удаляем кнопку, которая скопировалась вместе с листом.
    ActiveSheet.ListObjects.Add(xlSrcRange, ActiveSheet.UsedRange, , xlYes).Name = "Таблица1"   'Создаём умную таблицу.
    Dim tb As ListObject
    Set tb = ActiveSheet.ListObjects(ActiveSheet.ListObjects.Count)
    
    tb.TableStyle = "TableStyleLight13" 'Задаём стиль умной таблицы
    On Error Resume Next
    tb.ShowTotals = True    'Отображаем строку итогов.
    tb.ListColumns("Статус").TotalsCalculation = xlTotalsCalculationCount   'В строке итогов в столбце Статус ставим формулу подсчёта значений
    tb.ListColumns("Изменена").TotalsCalculation = xlTotalsCalculationNone  'В строке итогов в столбце Изменена ставим формулу подсчёта значений
    On Error GoTo 0
    tb.Range.Select 'Выделяем диапазон умной таблицы.
End Sub
  
Private Sub CloseEmptyWb() 'Вспомогательная процедура для закрытия "пустых" книг.
    Dim wb As Workbook
    For Each wb In Application.Workbooks    'Перебираем книги в приложении
        If wb.Path = "" Then wb.Close False 'Если книга не была ни разу сохранена, закрыть без сохранения.
    Next
End Sub
 
Цитата
написал:
Промежуточные итоги могут не вставляться, например, по следующим причинам:- нет столбцов "Статус" или "Изменена"- таблица занимает все строки 1048576 на листе , для промежуточных итогов не осталось места
Заново скопировал макрос, всё заработало.
Для форматирования прописал:

Sub ЗдигСтолбцов()
'
' ЗдвигСтолбцов Макрос
'

'
   ActiveWindow.ScrollColumn = 2
   ActiveWindow.ScrollColumn = 3
   Columns("D:D").ColumnWidth = 45
   ActiveWindow.ScrollColumn = 2
   ActiveWindow.ScrollColumn = 1
   Columns("C:C").ColumnWidth = 50.86      'устанавливаем ширину столбца "С"'
   Columns("D:D").ColumnWidth = 14.86      'устанавливаем ширину столбца "D"'
   Columns("B:B").ColumnWidth = 10.86      'устанавливаем ширину столбца "B"'
   Columns("E:E").ColumnWidth = 14.86      'устанавливаем ширину столбца "E"'
   Range("B4055").Select
   ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$F$4056"), , xlYes).Name = _
       "Таблица1"
   Range("Таблица1[#All]").Select
End Sub

Подскажите, в каком месте можно пристроить, что бы не запускать отдельно?
 
Цитата
написал:
в каком месте можно пристроить, что бы не запускать отдельно?
Кроме строки с созданием умной таблицы, в любом.
Цитата
написал:
ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$F$4056"), , xlYes).Name = "Таблица1"
 
Цитата
написал:
Кроме строки с созданием умной таблицы, в любом.
Подскажите, где можно посмотреть сборник макросов (возможно опубликованных, как самые популярные)?
 
Первое, что приходит на ум planetaexcel.ru - хотя, вероятно, Вы про неё уже что-то знаете. :D
Интересные можно найти тут Приемы :: Планета Excel
Тренинг "Программирование макросов на VBA в Excel" (3 дня)
Тренинг "VBA Pro: Профессиональная разработка на VBA в Excel"
Страницы: 1
Читают тему
Наверх