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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2010, 12:29   #21
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Да, действительно , спасибо. Но если в итоге делать код в третьем файле, то можно имена листов вообще не анализировать, наверняка в приходящей справке лишнего не будет.
Пока исправил текущий код.
Ну так если уже вручную перелопачено - можно проверить. Себя и коды.
Хотя я себе конкурентов не вижу
Вложения
Тип файла: rar справка 3 hugo.rar (35.4 Кб, 14 просмотров)
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 04.08.2010 в 12:38.
Hugo121 вне форума Ответить с цитированием
Старый 04.08.2010, 18:38   #22
KL (XL)
Форумчанин
 
Аватар для KL (XL)
 
Регистрация: 04.08.2009
Сообщений: 112
По умолчанию

Вот процедура для создания списка сумм по кодам, который у меня бегает достаточно быстро. Может, не так как код Hugo121, но глазу это незаметно и, к тому же, он позволяет ручные манипуляции с отчетом (особенно не слишком посвященным в VBA)

PHP код:
Option Explicit

Sub CreateList
()
    
Dim pc As PivotCache
    Dim pt 
As PivotTable
    Dim pi 
As PivotItem
    Dim ws 
As Worksheet
    Dim wsRep 
As Worksheet
    Dim arrPages
()
    
Dim strDest As String
    Dim t 
As Double
    
    ReDim arrPages
(0)
    
Application.ScreenUpdating False
    With ThisWorkbook
        Set wsRep 
= .Worksheets("Sheet1")
        
wsRep.Cells.Clear
        t 
Timer
        
For Each ws In .Worksheets
            
If ws.Name Like "Документ (*)" Then
                With ws
                    arrPages
(UBound(arrPages)) = _
                        
Array( _
                        
.Range(.[A8], .Cells(.Rows.Count1).End(xlUp).Offset(, 13)).Address(, , xlR1C1, -1), _
                        ws
.Name _
                        
)
                
End With
                ReDim Preserve arrPages
(UBound(arrPages) + 1)
            
End If
        
Next ws
        ReDim Preserve arrPages
(UBound(arrPages) - 1)
        
        
Set pc ActiveWorkbook.PivotCaches.Add_
            SourceType
:=xlConsolidation_
            SourceData
:=arrPages)
        
        
strDest wsRep.Range("A1").Address(, , xlR1C1True)
        
        
Set pt pc.CreatePivotTable_
            TableDestination
:=strDest_
            TableName
:="Отчет")
    
End With
    
    With pt
        
.DataPivotField.PivotItems(1).Position 1
        With 
.DataFields(1)
            .
Caption "Суммы по кодам"
            
.Function = xlSum
        End With
        
.PivotFields(1).Caption "Список Кодов"
        
.PivotFields(4).Caption "Документ"
        
With .PivotFields(2)
            .
Caption "Поле"
            
For Each pi In .PivotItems
                
If pi.Caption <> "13" Then pi.Visible False
            Next pi
        End With
        
.RowGrand False
        
.ColumnGrand False
    End With
    Application
.ScreenUpdating True
    MsgBox Timer 
t
End Sub 
протестировано:
Win 7 Ultimate EN, MSO 2010 Pro EN
Win XP Pro EN, MSO 2003 Pro EN MUI RU
KL [MVP - Microsoft Office Excel]
CPU: Intel Core 2, 2.17GHz | RAM: 3.25GB (4GB) | GPU: nVidia Quadro FX 2500M
OS: Windows 7 Ultimate x64 EN | MSO: 2010 Professional Plus x86 EN

Последний раз редактировалось KL (XL); 04.08.2010 в 20:02.
KL (XL) вне форума Ответить с цитированием
Старый 04.08.2010, 19:04   #23
KL (XL)
Форумчанин
 
Аватар для KL (XL)
 
Регистрация: 04.08.2009
Сообщений: 112
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Да, действительно , спасибо. Но если в итоге делать код в третьем файле, то можно имена листов вообще не анализировать, наверняка в приходящей справке лишнего не будет.
Пока исправил текущий код.
Ну так если уже вручную перелопачено - можно проверить. Себя и коды.
Хотя я себе конкурентов не вижу
У меня в Win 7, MSO2010

строка

PHP код:
   Set objDialog CreateObject("UserAccounts.CommonDialog"
выдает ошибку:

Цитата:
-------------------------------------
Run-time error '429'
Activex component can't create object
-------------------------------------
не смотря на присутствие в системе comdlg32.dll
KL [MVP - Microsoft Office Excel]
CPU: Intel Core 2, 2.17GHz | RAM: 3.25GB (4GB) | GPU: nVidia Quadro FX 2500M
OS: Windows 7 Ultimate x64 EN | MSO: 2010 Professional Plus x86 EN
KL (XL) вне форума Ответить с цитированием
Старый 04.08.2010, 19:34   #24
biv
Пользователь
 
Регистрация: 05.07.2010
Сообщений: 12
Хорошо

Цитата:
Сообщение от IgorGO Посмотреть сообщение
biv, а Вы переживали...
то все молчали по очереди, то набросали разных вариантов.
...А отчет небось пришлось вручную колбасить?
Вы правы, колбасили вручную. Но.. я сейчас пойду в отпуск, съезжу в гости (тк опять месяц впереди) и сяду просмотрю все варианты. Пока бегло просмотрела..... ну вы и умные ребята!!!!!!!..... а для меня это темный лес(но постараюсь пробраться сквозь дебри) .
Спасибо всем огромное!!!!!!!
biv вне форума Ответить с цитированием
Старый 04.08.2010, 22:38   #25
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

KL (XL), там просто суммы по кодам мало, там сперва надо эти коды частично изменить. И кстати Ваш код тоже у меня не идёт - сперва "Лист1", а затем .DataPivotField.PivotItems(1).Posit ion = 1.
А UserAccounts.CommonDialog можно заменить, сейчас не помню чем, но можно
Ну и ведь можно выбрать файл и привычным всем диалогом, который правда у меня на 2000 не работает, поэтому я им не пользуюсь
Или просто сперва переименовать файл, как нужно коду ("C:\temp\biv\отчет.txt"), тогда диалога не будет.
Вот, нашёл про диалоги, выбор на любой вкус: http://forum.script-coding.info/view...pid=6509#p6509
P.S. Нашёл ещё в своём коде косячок (сразу видно, откуда диалог взялся ):
строку
If intResult = 0 Then Wscript.Quit
надо заменить на
If intResult = 0 Then Exit Sub
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 04.08.2010 в 23:15.
Hugo121 вне форума Ответить с цитированием
Старый 05.08.2010, 01:18   #26
KL (XL)
Форумчанин
 
Аватар для KL (XL)
 
Регистрация: 04.08.2009
Сообщений: 112
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
...там просто суммы по кодам мало, там сперва надо эти коды частично изменить...
Действительно, проглядел

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
...И кстати Ваш код тоже у меня не идёт - сперва "Лист1", а затем .DataPivotField.PivotItems(1).Posit ion = 1...
Это чрезвычайно странно - у меня же в коде вроде нет нигде "Лист1", я использую имя уже существующего листа "Sheet1".

А второй сбой (.DataPivotField.PivotItems(1).Posi tion = 1) какую ошибку выдает? Скорее всего дело в версии Office 2000, а "мы с Microsoft" версии ранее 2003 не поддерживаем :P

Кстати, храните дистрибутив своего MSO2000 как зеницу ока - это уже раритет, его даже у Microsoft нет. Мне как-то понадобилось найти легальные дистрибутивы MSO 97 и 2000, я Microsoft по всему миру, включая Redmond, на уши поставил, так и не нашли. Пришлось качать нелегальщину. Она как, а скоро уже MSO2003 станет EOL

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
...Ну и ведь можно выбрать файл и привычным всем диалогом...
Да, лучше так наверное
KL [MVP - Microsoft Office Excel]
CPU: Intel Core 2, 2.17GHz | RAM: 3.25GB (4GB) | GPU: nVidia Quadro FX 2500M
OS: Windows 7 Ultimate x64 EN | MSO: 2010 Professional Plus x86 EN

Последний раз редактировалось KL (XL); 05.08.2010 в 01:37.
KL (XL) вне форума Ответить с цитированием
Старый 05.08.2010, 04:40   #27
KL (XL)
Форумчанин
 
Аватар для KL (XL)
 
Регистрация: 04.08.2009
Сообщений: 112
По умолчанию

Вот это должно быть очень быстро (у меня в среднем 0,035 сек):

PHP код:
Sub CreateList2()
    
Dim ws As Worksheet
    Dim wsRep 
As Worksheet
    Dim rng 
As Range
    Dim Arr
    Dim i 
As Long
    Dim Dict 
As Object
    Dim t 
As Double
    
    Set wsRep 
ThisWorkbook.Worksheets("Sheet1")
    
wsRep.Cells.Clear
    t 
Timer
    Set Dict 
CreateObject("Scripting.Dictionary")
    
    For 
Each ws In ThisWorkbook.Worksheets
        Set rng 
ws.Range(ws.Cells(81), ws.Cells(ws.Rows.Count1).End(xlUp))
        If 
ws.Name Like "Документ (*)" Then
            With Application
                Arr 
= Array(.Replace(.Replace(rng13"000"), 144"0000"), rng.Offset(, 12).Value)
                For 
1 To UBound(Arr(0))
                    
With Dict
                        
If Arr(0)(i1Like "####################" Then
                            
If .Exists(Arr(0)(i1)) Then
                                
.Item(Arr(0)(i1)) = .Item(Arr(0)(i1)) + Arr(1)(i1)
                            Else
                                .
Add Arr(0)(i1), Arr(1)(i1)
                            
End If
                        
End If
                    
End With
                Next i
            End With
        End 
If
    
Next ws
    
    With wsRep
        With 
.Range("A1").Resize(Dict.Count)
            .
NumberFormat "@"
            
.Value Application.Transpose(Dict.keys)
        
End With
        
.Range("B1").Resize(Dict.Count) = Application.Transpose(Dict.items)
    
End With
    
    MsgBox Timer 
t
End Sub 
KL [MVP - Microsoft Office Excel]
CPU: Intel Core 2, 2.17GHz | RAM: 3.25GB (4GB) | GPU: nVidia Quadro FX 2500M
OS: Windows 7 Ultimate x64 EN | MSO: 2010 Professional Plus x86 EN

Последний раз редактировалось KL (XL); 05.08.2010 в 05:01.
KL (XL) вне форума Ответить с цитированием
Старый 05.08.2010, 09:22   #28
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Да, с "Лист1" я ошибся, это у меня в книге "Лист1", поэтому Ваш ThisWorkbook.Worksheets("Sheet1") и не пошёл, пришлось менять на ThisWorkbook.Worksheets(13)
Ну а с 2000 - что стоит на работе, с тем и работаем... Это дома есть немного выбор
Последний вариант на Dictionary - Superбыстрый. Буду изучать.
Проверил на 2000 - результат один-в-один с моим, но быстрее, но мой ещё и сравнивает сразу
А чтоб с словарём сравнить - массив добавлять надо? Места то ведь больше нет для пометок, как у меня в массиве?
Но это будет всё равно быстрее - один раз создать массив, чем как у меня, 134 раза ReDim Preserve b(3, x)...
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 05.08.2010 в 10:31.
Hugo121 вне форума Ответить с цитированием
Старый 05.08.2010, 14:11   #29
KL (XL)
Форумчанин
 
Аватар для KL (XL)
 
Регистрация: 04.08.2009
Сообщений: 112
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
А чтоб с словарём сравнить - массив добавлять надо? Места то ведь больше нет для пометок, как у меня в массиве?
На самом деле места полно, так как никто не запрещает присваивать проперти Item не текстовые значения, а массивы, где первый элемент - сумма по документам, а второй - значение из текстового файла
KL [MVP - Microsoft Office Excel]
CPU: Intel Core 2, 2.17GHz | RAM: 3.25GB (4GB) | GPU: nVidia Quadro FX 2500M
OS: Windows 7 Ultimate x64 EN | MSO: 2010 Professional Plus x86 EN

Последний раз редактировалось KL (XL); 05.08.2010 в 14:13.
KL (XL) вне форума Ответить с цитированием
Старый 20.08.2010, 10:36   #30
biv
Пользователь
 
Регистрация: 05.07.2010
Сообщений: 12
По умолчанию

Ребята, спасибо вам огромное!!!!!!!!
Посидела, поразбиралась - поняла, что к чему. Программу написать и подкорректировать - не смогу (это только ваши светлые и умные головы могут), но вставить эту программу в файл, вроде,получилось.
Скопировала все ваши решения и теперь 1-го числа буду пробовать. О результатах обязательно отпишусь.
ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ ВСЕМ!!!!!!!!!!!!!!!!!!!!!!!!!
biv вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сгруппировать код segail Microsoft Office Excel 2 02.07.2010 14:46
Как вывести данные активной строки excel? kipish_lp Microsoft Office Excel 4 25.02.2010 17:18
Как удалить все строки в Excel содержащие.. Dux Microsoft Office Excel 15 11.09.2009 04:41
Как в Excel красить строки? Xamer Microsoft Office Excel 1 24.06.2009 11:53