powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Помогите горю: Заполнение таблицы Excel
11 сообщений из 11, страница 1 из 1
Помогите горю: Заполнение таблицы Excel
    #37764547
b2w
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
b2w
Гость
Помогите горю!
Есть табличка: столбцы (80 столбцов) - подразделения, каждое имеет свой номер, строки (800 стр.) - продукты, так же пронумерованы. Данная табличка с оформлением, т.е. периодически строки Итого, доли и т.п., строи и столбцы идут не подряд. Это добро надо заполнить данными. Данные на другом листе № продукта, № подразделения, значение, всего около 10 000 срок. Написал алгоритм, которые работает больше часа, помогите оптимизировать!!! Что накосячил? Заранее спасибо!!!

Код: 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.
Sub get_fact()

Dim nch As Date
Dim knc As Date
Dim rng As Range
Dim i As Integer
Dim FinalRow As Integer
Dim FC As Integer
Dim LC As Integer
Dim LR As Integer
Dim cl_c As Integer
Dim cl_r As Integer
Dim NZFU As Integer
Dim CODE As String
Dim BLC As Integer
Dim PK As Integer
Dim NMZFU As Integer
Dim SMM As Integer
Dim NZFU1 As Integer
Dim CODE1 As String

   With Application
        .ScreenUpdating = False
        .Calculation = xlManual
        .MaxChange = 0.001
    End With

nch = Now()


BLC = ThisWorkbook.Worksheets("fct").Cells(1, 1).End(xlToRight).Column

For i = 1 To BLC
If ThisWorkbook.Worksheets("fct").Cells(1, i).Value = "CodPkz" Then PK = i
If ThisWorkbook.Worksheets("fct").Cells(1, i).Value = "nZFUbjt" Then NMZFU = i
If ThisWorkbook.Worksheets("fct").Cells(1, i).Value = "Itog" Then SMM = i
Next i

FinalRow = ThisWorkbook.Worksheets("fct").Cells(65536, 1).End(xlUp).Row
FCL:
FC = InputBox("Введите номер первого столбца факта", "Первый столбец", 0)
If FC = 0 Then GoTo FCL
LCL:
LC = InputBox("Введите номер последнего столбца факта", "Последний столбец", 0)
If LC = 0 Then GoTo LCL
LR = ThisWorkbook.Worksheets("Frms").Cells(65536, 1).End(xlUp).Row

Set rng = ThisWorkbook.Worksheets("Frms").Range(Cells(7, FC), Cells(LR, LC))


For Each cl In rng

If cl.HasFormula Then GoTo Lop
cl.ClearContents
NZFU = 0
CODE = ""

cl_r = cl.Row
cl_c = cl.Column
If Not IsNumeric(ThisWorkbook.Worksheets("Frms").Cells(2, cl_c).Value) Then GoTo Lop
NZFU = ThisWorkbook.Worksheets("Frms").Cells(2, cl_c).Value
If NZFU = 0 Then GoTo Lop
CODE = ThisWorkbook.Worksheets("Frms").Cells(cl_r, 1).Value
If CODE = "" Then GoTo Lop


For cnt = 2 To FinalRow
NZFU1 = 0
CODE1 = ""

NZFU1 = ThisWorkbook.Worksheets("fct").Cells(cnt, NMZFU).Value
CODE1 = ThisWorkbook.Worksheets("fct").Cells(cnt, PK).Value



If NZFU1 = NZFU And CODE1 = CODE Then
cl.Value = cl.Value + ThisWorkbook.Worksheets("fct").Cells(cnt, SMM).Value
ThisWorkbook.Worksheets("fct").Cells(cnt, BLC + 1).Value = ThisWorkbook.Worksheets("fct").Cells(cnt, BLC + 1).Value + 1
'GoTo lop1
End If


lop1:
Next cnt

Lop:
Next cl

knc = Now()

    With Application
        .ScreenUpdating = True
        .Calculation = xlAutomatic
        .MaxChange = 0.001
    End With

MsgBox "Все, начали: " & nch & " закончили: " & knc
End Sub
...
Рейтинг: 0 / 0
Помогите горю: Заполнение таблицы Excel
    #37764669
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕсть табличка: столбцы (80 столбцов) - подразделения, каждое имеет свой номер,
строки (800 стр.) - продукты, так же пронумерованы.
Данная табличка с оформлением, т.е. периодически строки Итого, доли и т.п.,
строи и столбцы идут не подряд.

Это добро надо заполнить данными.
Данные на другом листе № продукта, № подразделения, значение, всего около 10 000 срок.
Написал алгоритм, которые работает больше часа, помогите оптимизировать!!!
Что накосячил? Заранее спасибо!!!
b2w,

совершенно не имею никакого желания создавать отладочный файл
90 столбцов
10 строк
...
Рейтинг: 0 / 0
Помогите горю: Заполнение таблицы Excel
    #37764729
b2w
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
b2w
Гость
Прошу прощения.
Вот файлик: http://narod.ru/disk/46807100001.90b39119e662b950e5077ddc78e0f03a/Pr.zip.html , на народе, т.к. больше 150 кБ
Заполняются столбцы с 23 по 78.
...
Рейтинг: 0 / 0
Помогите горю: Заполнение таблицы Excel
    #37764850
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
b2w,

вроде ничего особенного
--обычная сводная по изделию(9)-цеху(15)-сумме(19)
----но изделия не по алфавиту, а по группам с итогами
----цеха аналогично
--итогов побольше(не только сумма, но и средние)

большое время
--от подсчета итогов на 800 изделий--800 циклов на 10000 строк

может что и просмотрела да и сложно читать , не зная смысла абревиатур наименований

завтра,если не лень будет --посмотрю
...
Рейтинг: 0 / 0
Помогите горю: Заполнение таблицы Excel
    #37764928
ElenHim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
b2w,

Задача на распределение, да?На hh.ru периодически ищут людей, которые умеют это делать за несколько секунд. Оклады им 70+ предлагают. Ничего личного, но подумайте об этом.
...
Рейтинг: 0 / 0
Помогите горю: Заполнение таблицы Excel
    #37764991
b2w
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
b2w
Гость
To ПЕНСИОНЕРКА,

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

To ElenHim,

В какой то мере Вы правы, только это конечная стадия - представление, все распределения (аллокации) делается в базе за несколько секунд, а вот их отображение в красивом виде больше часа :(
...
Рейтинг: 0 / 0
Помогите горю: Заполнение таблицы Excel
    #37765353
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
b2w,
интересно, как отработает на полных данных
Код: 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.
Option Explicit
'
' код добавить в стандартынй модуль (!) _НЕ_ Вашей книги со сводной таблицей
' (!) книга с Вашей сводной таблицей должна быть ЗАКРЫТА
' запускать Sub pr_itog2()
' в первом диалоге выбираете книгу с Вашей сводной
' второй и третий диалоги для задания границ обработки аналогичны Вашим 
'

' ********************************************************
' no comment
Private Sub AUXbefore()
    With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
        .CalculateBeforeSave = False
    End With
End Sub

' ********************************************************
' no comment
Private Sub AUXafter()
    With Application
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
        .CalculateBeforeSave = True
    End With
End Sub

' ********************************************************
' процедура обновления сводной
' (!) файл со сводной должен быть ЗАКРЫТ
Sub pr_itog2()
    ' заготовка строки соединения (! pre Excel 12)
    Const S_CN$ = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=No;IMEX=2';Data Source="
    ' имя первого листа во временном файле
    Const S_WS1$ = "TDSheet"
    ' имена листов сводного и с фактичексими данными
    Const S_WS_FORM$ = "Frms", S_WS_FACT$ = "fct"
    ' имена полей листа с фактическими данными
    Const S_PK$ = "CodPkz", S_UNIT$ = "nZFUbjt", S_SMM$ = "Itog"
    ' сторка с номерами подразделений на сводном листе
    Const L_FORM_UNITROW& = 2
    ' первая строка с данными на сводном листе
    Const L_FORM_FIRSTROW& = 7
    
    Dim cn As Object, wb As Object
    Dim scn$, SQLbase$, SQLpfx$, SQLsfx$, tmpFile$, s$
    
    Dim FC&, LC&, FR&, LR&
    Dim BLC&, BLR&
    Dim PK&, NMZFU&, SMM&
    
    Dim i&, k&, a
    
    Dim t!
    
    ' выбор книги со сводной
    s = Application.GetOpenFilename("Excel Files (*.xls), *.xls", , "План-факт")
    If s = "False" Then Exit Sub
    
    t = Timer '### for debug only
    
    Call AUXbefore
    
    ' открытие книги со сводной
    Set wb = Workbooks.Open(s, , True)
    
    ' структура листа с факт.данными
    With wb.Worksheets(S_WS_FACT)
        BLR = .Cells(1, 1).End(xlDown).Row
        BLC = .Cells(1, 1).End(xlToRight).Column
        PK = 0: NMZFU = 0: SMM = 0: k = 0
        For i = BLC To 1 Step -1
            If SMM = 0 Then
                If StrComp(.Cells(1, i).Value2, S_SMM) = 0 Then SMM = i: k = k + 1
            ElseIf NMZFU = 0 Then
                If StrComp(.Cells(1, i).Value2, S_UNIT) = 0 Then NMZFU = i: k = k + 1
            ElseIf PK = 0 Then
                If StrComp(.Cells(1, i).Value2, S_PK) = 0 Then PK = i: k = k + 1
            End If
            If k = 3 Then Exit For
        Next i
        If k <> 3 Then
        ' требуемые поля не найдены
            wb.Close False
            Set wb = Nothing
            MsgBox "fact data not found!", vbExclamation, "PR_ITOG2"
            Call AUXafter: Exit Sub
        End If
        
        ' текст запроса для заполнения временного файла
        SQLpfx = "select F" & PK & ",F" & NMZFU & ",sum(F" & SMM & ")"
        SQLpfx = SQLpfx & " from [" & S_WS_FACT & "$A2:" & .Cells(BLR, BLC).Address(0, 0)
        SQLpfx = SQLpfx & "] where F" & PK & ">'' group by F" & PK & ",F" & NMZFU
        
    End With 'wb.Worksheets(S_WS_FACT)
    
    ' FullName временного файла
    tmpFile = Environ$("TEMP") & "\tmp" & CLng(Date) & Int(Timer) & ".xls"
    
    ' структура сводного листа
    With wb.Worksheets(S_WS_FORM)
        FC = 0: LC = 0
'FC = 23: LC = 78                               '### debug

'### 2do check FC,LC values
        Do While FC = 0
            FC = InputBox("Введите номер первого столбца факта", "Первый столбец", 0)
        Loop
        Do While LC = 0
            LC = InputBox("Введите номер последнего столбца факта", "Последний столбец", 0)
        Loop
        
        FR = L_FORM_FIRSTROW: LR = .Cells(65535, 1).End(xlUp).Row
                
        ' заготовка текста запроса для обновления сводного листа
        SQLbase = "]) AS A,(SELECT F1 AS PK,F2 AS NMZFU,F3 AS SM"
        SQLbase = SQLbase & " FROM [" & S_WS1 & "$] in '" & tmpFile & "' 'Excel 8.0;HDR=No;IMEX=1') AS B"
        SQLbase = SQLbase & " WHERE B.PK=A.PK AND B.NMZFU="
        SQLbase = " AS ZZ FROM [" & S_WS_FORM & "$A" & FR & ":" & .Cells(LR, LC).Address(0, 0) & SQLbase
        
        ' заготовка текста запроса для очистки сводных данных перед обновлением
        s = " AS ZZ FROM [" & S_WS_FORM & "$A" & L_FORM_FIRSTROW & ":" & .Cells(LR, LC).Address(0, 0) & "] WHERE F1>'') SET ZZ=null"
        
        ' массив с номерами подразделений
        a = .Range(.Cells(L_FORM_UNITROW, FC), .Cells(L_FORM_UNITROW, LC)).Value
    End With 'wb.Worksheets(S_WS_FORM)
    
    ' строка соединения
    scn = S_CN & wb.FullName
    
    ' закрытие книги со сводной
    wb.Close False
    Set wb = Nothing
    
    ' создание и открытие соединения ADO
    Set cn = CreateObject("adodb.connection")
    cn.Open scn
    
    ' создание, заполнение и сохранение временной книги
    With Workbooks.Add
        With .Worksheets(1)
            .Name = S_WS1
            .Columns(1).NumberFormat = "@"
            cn.BeginTrans
            .Cells(1, 1).CopyFromRecordset cn.Execute(SQLpfx, , 1)
            cn.CommitTrans
        End With
        .SaveAs tmpFile
        .Close
    End With
    
    ' префикс и суффикс текста запроса для обновления сводного листа
    SQLpfx = "UPDATE (SELECT A.PK AS PKA,A.ZZ,B.SM FROM (SELECT F1 AS PK, F"
    SQLsfx = ") SET ZZ=SM WHERE PKA>''"
    
    ' обновление сводного листа
    cn.BeginTrans
    For i = 1 To UBound(a, 2)
    If a(1, i) > 0 Then
        k = FC + i - 1                                                      ' номер обрабатываемого столбца
        cn.Execute "UPDATE (SELECT F" & k & s, 0&, 1 Or &H80&               ' аналог ClearContents
        cn.Execute SQLpfx & k & SQLbase & a(1, i) & SQLsfx, 0&, 1 Or &H80&  ' обновление данных
    End If
    Next i
    cn.CommitTrans
    
    ' закрытие соединения ADO
    cn.Close
    Set cn = Nothing
    
    Erase a
    
    Call AUXafter
                
    ' удаление временного файла
    Kill tmpFile
                
    MsgBox "time expended: " & Int(Timer - t) & " sec", , "PR_ITOG2" '### for debug only
End Sub

...
Рейтинг: 0 / 0
Помогите горю: Заполнение таблицы Excel
    #37765402
ElenHim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что мешает итоговое представление в базе расчитать, а в Excel уже результат выгрузить?
Можно ещё дальше пойти - формировать в БД документ xmlss, в этом случае на стороне БД можно и форматирование применить.
Годный пример на MSDN: Distributing Enterprise Data via XML with SQL Server 2000 and Excel 2002

В принципе, этот пример порядком устарел(так, возможности SQL Server 2008 работе с xml гораздо шире), но для начала сойдёт.
...
Рейтинг: 0 / 0
Помогите горю: Заполнение таблицы Excel
    #37765440
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Массивы работают в 43 раза быстрее, чем обращение к ячейкам (один раз замерял :) ).
Так что есть смысл.
Может быть ещё можно словарь подключить, если нужно собрать сводные данные по уникальным.
Задачу в целом из объяснения не понял, вникать неохота.
Из fct тянете в frms?
Вообще больше часа - это ненормально.
Подозреваю, что на словаре и массивах можно секунд за 10 уложиться. А то и быстрее.
...
Рейтинг: 0 / 0
Помогите горю: Заполнение таблицы Excel
    #37769011
b2w
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
b2w
Гость
Огромное всем спасибо!
Пока оставил как есть, в перспективе будем менять на сводные таблицы...

Особая благодарность "скукотища", когда данные выверели, использовал Ваш вариант!!!
...
Рейтинг: 0 / 0
Помогите горю: Заполнение таблицы Excel
    #37769301
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
b2w,
интересно время обработки Ваших "(80 столбцов) ... (800 стр.) - продукты ... Данные на другом листе ... всего около 10 000 срок".
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Помогите горю: Заполнение таблицы Excel
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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