powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Обработка данных xls для создания отчета в xls
5 сообщений из 30, страница 2 из 2
Обработка данных xls для создания отчета в xls
    #37671145
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: balbes
> За одно может и код причешете, жду советов по оптимизации...

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

Функция LsClRg - по моему через чур сложный алгоритм получения последнего используемого адреса. Не проще сразу
подставлять:
Код: vbnet
1.
2.
3.
4.
5.
6.
Function LsClRg(Sh As Worksheet) As Range
'Адрес последнего столбца +1
Dim r As Range
    Set r = Sh.Cells.SpecialCells(xlLastCell)
    Set LsClRg = Sh.Range(Sh.Cells(2, r.Column + 1), Sh.Cells(r.Row, r.Column + 1))
End Function



Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Обработка данных xls для создания отчета в xls
    #37671192
balbes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi Игорь Горбонос огромное спб.
так действительно проще... :)
...
Рейтинг: 0 / 0
Обработка данных xls для создания отчета в xls
    #37672105
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: balbes
> За одно может и код причешете, жду советов по оптимизации...

как-то так
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
Option Explicit

Public Sub Макрос3()
Dim w As Workbook, sh As Worksheet, nLastRow As Long, shPivot As Worksheet

' Получаем книгу с которой будем работать
Set w = ActiveWorkbook

    Application.ScreenUpdating = False
'Фильтр на несоответствие
    With w.Sheets("Лист1").Range("A1").CurrentRegion
        .AutoFilter Field:=1, Criteria1:="=41**", Operator:=xlAnd
        .AutoFilter Field:=2, Criteria1:="<>"
'Вставляем в лист2
        .Copy w.Sheets("Лист2").Range("A1")
    End With

'Подтягиваем значения из справочника
    With w.Sheets("Лист2")
        nLastRow = .Cells.End(xlDown).Row
        .Columns("E").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
        .Range("E1:E" & CStr(nLastRow)).FormulaR1C1 = "=VLOOKUP(RC[-1],Справочник!R1C1:R22C2,2)"
    End With

'Вставляем шапку (Переименуем колонки)
    With Sheets("Лист2")
        .Range("A1").Value = "Конт. счет"
        .Range("B1").Value = "Потребитель"
        .Range("C1").Value = "№ дата, дог."
        .Range("D1").Value = "№ уст-ки"
        .Range("E1").Value = "Вид установки"
        .Range("F1").Value = "ФАКТ"
        .Range("G1").Value = "ПЛАН"
'    Sheets("Лист2").Range("H1").Value = "отк. кВтч"
'    Sheets("Лист2").Range("I1").Value = "отк. %"
    End With

'вАяем сводную таблицу
    Set shPivot = CheckSheet(w, "Сводная")
    Call CrPvTab(w, shPivot)
'Фильтруем Сводную таблицу по категориям и формируем вкладки
' Прочие
'
    Call ClearFl(shPivot, "Прочие*")
    Call CrSheet(w, shPivot, "Прочие")
' Бюджет
'
    Call ClearFl(shPivot, "Бюджетные*")
    Call CrSheet(w, shPivot, "Бюджет")
' Сельхоз
'
    Call ClearFl(shPivot, "Сельскохоз*")
    Call CrSheet(w, shPivot, "Сельхоз")
' Население
'
    Call ClearFl(shPivot, "*насел*")
    Call CrSheet(w, shPivot, "Население")
' Компенсация
'
    Call ClearFl(shPivot, "Компенсация*")
    Call CrSheet(w, shPivot, "Компенсация")

Application.ScreenUpdating = True

End Sub

Public Sub CrPvTab(w As Workbook, sh As Worksheet)
'
' формируем сводную таблицу
'
    w.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        "Лист2!R1C1:R65536C7", Version:=xlPivotTableVersion10).CreatePivotTable _
        TableDestination:=sh.Name & "!R3C1", TableName:=sh.Name, _
        DefaultVersion:=xlPivotTableVersion10
    With sh.PivotTables(sh.Name)
        With .PivotFields("Вид установки")
            .Orientation = xlPageField
            .Position = 1
        End With
        With .PivotFields("Потребитель")
            .Orientation = xlRowField
            .Position = 1
        End With
        With .PivotFields("№ дата, дог.")
            .Orientation = xlRowField
            .Position = 2
        End With

        With .PivotFields("Потребитель")
            .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, _
                False, False)
        End With
        With .PivotFields("№ дата, дог.")
            .Subtotals = Array(False, False, False, False, False, False, False, False, False, False, _
                False, False)
        End With

        .AddDataField .PivotFields("ФАКТ"), "Количество по полю ФАКТ", xlCount
        .AddDataField .PivotFields("ПЛАН"), "Количество по полю ПЛАН", xlCount

        With .DataPivotField
            .Orientation = xlColumnField
            .Position = 1
        End With
        With .PivotFields( _
            "Количество по полю ФАКТ")
            .Caption = "Сумма по полю ФАКТ"
            .Function = xlSum
        End With

        With .PivotFields( _
            "Количество по полю ПЛАН")
            .Caption = "Сумма по полю ПЛАН"
            .Function = xlSum
        End With
    End With

End Sub

Sub ClearFl(sh As Worksheet, sFilters As String)
Dim pi As PivotItem
' Скрываем и показываем нужные поля сводной
    With sh.PivotTables(sh.Name).PivotFields("Вид установки")
        For Each pi In .PivotItems
            If pi.Name Like sFilters Then
                pi.Visible = True
            Else
                pi.Visible = False
            End If
        Next pi
    End With
End Sub

Sub CrSheet(w As Workbook, sh As Worksheet, sNameSheet As String)
'Копируем сводную таблицу
Dim shDest As Worksheet

    Set shDest = CheckSheet(w, sNameSheet)
    LsClRg(sh, 4).Copy
    shDest.Cells.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
'Вставляем формЫлы
    Call FmlAdd(shDest)
'Вставляем шапку
    Call RenTab(shDest)
End Sub

Sub FmlAdd(sh As Worksheet)
' Здесь как-то не понятно, в один и тот-же диапазон вставляем разные значения. Правильно ли это???
'Вставляем формулы кВтч
Dim r As Range
    Set r = LsClRg(sh)
    With r
        .FormulaR1C1 = "=RC[-2]-RC[-1]"
        .NumberFormat = "General"
'Вставляем формулы %
        .FormulaR1C1 = "=IF(RC[-3]=0,0,RC[-3]/RC[-2])-1"
        .NumberFormat = "0.00%"
    End With
End Sub

Function LsClRg(sh As Worksheet, Optional nStartRowCopy As Long = 2) As Range
'Адрес последнего столбца +1
Dim r As Range
    Set r = sh.Cells.SpecialCells(xlLastCell)
    Set LsClRg = sh.Range(sh.Cells(nStartRowCopy, r.Column + 1), sh.Cells(r.Row, r.Column + 1))
End Function

Sub RenTab(sh As Worksheet)
'Вставляем шапку (Переименуем колонки)
    With sh
        .Range("A1").Value = "Потребитель"
        .Range("B1").Value = "№ дата, дог."
        .Range("C1").Value = "№ уст-ки"
        .Range("D1").Value = "Вид установки"
        .Range("E1").Value = "ФАКТ"
        .Range("F1").Value = "ПЛАН"
        .Range("G1").Value = "отк. кВтч"
        .Range("H1").Value = "отк. %"
    End With
End Sub

Private Function CheckSheet(w As Workbook, sName As String) As Worksheet
    On Error GoTo labErr
    ' Пробуем получить лист, если он есть, получаем и возвращаем, если листа нет
    ' получаем ошибку и по ней добавляем лист
    Set CheckSheet = w.Sheets(sName)
    Exit Function
labErr:
    Set CheckSheet = w.Sheets.Add
    CheckSheet.Name = sName
End Function



Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Обработка данных xls для создания отчета в xls
    #37673361
balbes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GE Игорь Горбонос

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Sub FmlAdd(sh As Worksheet)
' Здесь как-то не понятно, в один и тот-же диапазон вставляем разные значения. Правильно ли это???
'Вставляем формулы кВтч
Dim r As Range
    Set r = LsClRg(sh)
    With r
        .FormulaR1C1 = "=RC[-2]-RC[-1]"
        .NumberFormat = "General"
'Вставляем формулы %
        .FormulaR1C1 = "=IF(RC[-3]=0,0,RC[-3]/RC[-2])-1"
        .NumberFormat = "0.00%"
    End With
End Sub

Посто LsClRg(sh) ищет диапазон последнего столбца и добавляет к ниму +1
LsClRg(sh) должен каждый раз вызываться пред вставкой в последний столбик...
...
Рейтинг: 0 / 0
Обработка данных xls для создания отчета в xls
    #37674055
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: balbes
> LsClRg(sh) должен каждый раз вызываться пред вставкой в последний столбик...

Тьфу ты блин! Протупил. Сори. Это я недосмотрел исходный код. Все правильно. Тогда, наверное, можно посмотреть в сторону
Offset, для избежания повторного вызова LsClRg(sh) только со смещением нужно разобратся, а то я с ним мало работал, ещё
в кровь не въелось, что там и куда

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
5 сообщений из 30, страница 2 из 2
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Обработка данных xls для создания отчета в xls
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]