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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2011, 00:42   #31
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Нет, не так.
В коде сформирован массив "c".
Теперь нужно получить массив из Ваших упорядоченных данных, циклом в цикле сравнить эти два массива и совпадения переложить в третий массив (только суммы), который выгрузить в готовую таблицу.
Только одна итоговая выгрузка, без новых книг и таблиц. Вся сортировка в памяти, кодом.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 17.03.2011, 01:06   #32
igsxor
Пользователь
 
Регистрация: 15.03.2011
Сообщений: 35
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Нет, не так.
В коде сформирован массив "c".
Теперь нужно получить массив из Ваших упорядоченных данных, циклом в цикле сравнить эти два массива и совпадения переложить в третий массив (только суммы), который выгрузить в готовую таблицу.
Только одна итоговая выгрузка, без новых книг и таблиц. Вся сортировка в памяти, кодом.
Голова уже не варит
Я синтаксис плохо воспринимаю по коду.

HUGO выручайте,действительно вопрос остро стоит

Последний раз редактировалось igsxor; 17.03.2011 в 01:11.
igsxor вне форума Ответить с цитированием
Старый 17.03.2011, 01:29   #33
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Ваш вопрос решается штатными средствами -сводной таблицей.

во вложении пример создания сводной таблицы при помощи ADO
Вложения
Тип файла: rar изначальные данные.rar (804.0 Кб, 11 просмотров)
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 17.03.2011, 09:41   #34
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Сводная неплохо, но как дальше?

Я свой код дополнил - выгружает результат как выше написал, сразу в файл 2_готовая табл.xlsx.
Т.к. так и не определились, как подвязаться к файлу "2_готовая табл.xlsx", то я сделал как мне проще:
Set gottabl = Workbooks("2_готовая табл.xlsx")
т.е. эта книга тоже уже должна быть открыта.
В процессе обнаружился косяк в данных - в Вашей "2_готовая табл.xlsx" в B7 число, а далее ниже почти до конца текст.
Поэтому в коде сравнивается текст:
If CStr(d(i, 1)) = CStr(c(ii, 1)) Then
иначе совпадения были только по 4-м кодам - первому и трём внизу.

Код:
Option Explicit

Sub Otbor()
    Dim a(), b, c, d, e, i As Long, ii As Long, j As Long, jj As Long, k As Long, temp As String
    Dim gottabl As Workbook
    Set gottabl = Workbooks("2_готовая табл.xlsx")

    a = Range("A2:I" & Range("A" & Rows.Count).End(xlUp).Row).Value
    ReDim b(1 To UBound(a), 1 To 3)

    With CreateObject("Scripting.Dictionary")
        For i = 1 To UBound(a)
            temp = a(i, 1) & a(i, 5)
            If Not .Exists(temp) Then
                j = j + 1: .Item(temp) = j
                b(j, 1) = a(i, 1)
                b(j, 2) = a(i, 5)
                b(j, 3) = a(i, 9)
            Else
                k = .Item(temp)
                b(k, 3) = b(k, 3) + a(i, 9)
            End If
        Next
    End With



    With CreateObject("Scripting.Dictionary")

        For i = 1 To j
            temp = b(i, 1)
            If Not .Exists(temp) Then jj = jj + 1: .Item(temp) = jj
        Next

        ReDim c(1 To .Count, 1 To 4)

        For i = 1 To UBound(b)
            temp = b(i, 1)
            If Len(temp) Then
                c(.Item(temp), 1) = b(i, 1)
                Select Case b(i, 2)
                Case "Х"
                    c(.Item(temp), 2) = b(i, 3)
                Case "Г"
                    c(.Item(temp), 4) = b(i, 3)
                End Select
            End If
        Next

    End With

With gottabl.Sheets(1)
    d = .Range("B7:B" & .Range("B" & .Rows.Count).End(xlUp).Row).Value

ReDim e(1 To UBound(d), 1 To 3)

For i = 1 To UBound(d)
For ii = 1 To UBound(c)
If CStr(d(i, 1)) = CStr(c(ii, 1)) Then e(i, 1) = c(ii, 2): e(i, 3) = c(ii, 4):  Exit For
Next ii, i

 .Range("C7:E7").Resize(UBound(e)) = e
End With

End Sub
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 17.03.2011 в 09:46.
Hugo121 вне форума Ответить с цитированием
Старый 17.03.2011, 10:28   #35
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Посоревновался с ADO - сперва правил код для 2000XL:

'Public Const sCn11 = "Provider=Microsoft.ACE.OLEDB.12.0; ;Data Source="
Public Const sCn11 = "Provider= Microsoft.Jet.OLEDB.4.0;Data Source="
'Public Const sCn12 = ";Extended Properties=""Excel 12.0;HDR=YES"";"
Public Const sCn12 = ";Extended Properties=""Excel 8.0;HDR=YES;"";"

потом засекал время:

0.34375
0.359375

0.5
0.515625

Сводная медленнее.
И как по мне - свои массивы можно крутить как угодно, с сводной сложнее.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 17.03.2011, 12:50   #36
igsxor
Пользователь
 
Регистрация: 15.03.2011
Сообщений: 35
По умолчанию

А как сделать выгрузку в эту книгу в 2 лист.И в 2ом листе изначально создать шаблон готовой табл с дополнит столбцом.Изменил немного код.
Код:
  With Workbooks.Add.Worksheets(1) 
         'With Workbooks.Open("C:\готовая_таблица.xlsx")
        .[C6] = "№№ лиц.счета_2": [D6] = "объем(х)": [F6] = "объем(г)"
        .Range("C7:F7").Resize(jj) = c
        .UsedRange.EntireColumn.AutoFit
    End With
igsxor вне форума Ответить с цитированием
Старый 17.03.2011, 13:35   #37
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Worksheets(2)
Может быть можно не создавать динамически кодом шаблон (т.к. если шаблон сложный, то кодом много гемора), а использовать готовый шаблон в файле.
Типа (как там в коде закомментировано)
Код:
With Workbooks.Open(FullName, ReadOnly:=True)
'делаем дело, сохраняем SaveCopyAs
.Close 0
End With
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 18.03.2011, 17:51   #38
igsxor
Пользователь
 
Регистрация: 15.03.2011
Сообщений: 35
По умолчанию

Почему-то код последний не заработал.=)
Расскажи как его запус
igsxor вне форума Ответить с цитированием
Старый 18.03.2011, 17:55   #39
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Работает:
Код:
Sub tt()
    With Workbooks.Open("C:\temp\Книга1.xls").Worksheets(1)
        .[C6] = "№№ лиц.счета_2": [D6] = "объем(х)": [F6] = "объем(г)"
        .UsedRange.EntireColumn.AutoFit
    End With
End Sub
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 18.03.2011, 17:59   #40
igsxor
Пользователь
 
Регистрация: 15.03.2011
Сообщений: 35
По умолчанию

Плин,hugo,давай по порядку.)
Создаю новый макрос,копирую твой код,дальше в какой книге его запускать.
Мне щас просто тяжело въезжать,дни напряжные были невыспался а сделать нужно.
Я уже себе и книгу заказал.Вот жду поставки.
igsxor вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос группировки данных в таблице magana Microsoft Office Excel 1 28.01.2011 23:52
Обновление данных из табл в др. Ал3 Microsoft Office Access 1 04.07.2010 00:27
Результат перевода из 10й сис-мы в 16-ю занести в табл(10-е число - 16), до тех пор пока не будет введено Maemi_IT Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 11.01.2010 21:27
Кол-во данных в таблице dani92 БД в Delphi 1 02.04.2009 07:58
Как выпонить действия по двойному слику на созданной таблице Tiolic Общие вопросы Delphi 2 21.06.2007 09:53