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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2010, 12:01   #1
sn00p
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 40
По умолчанию "свернуть" таблицу

всем дня доброго!
сильно не пинайте, занимаюсь программерством под XL не так много, 2 недели...
задача стоит вот такая = есть большая таблица , в среднем 13500 записей, 10 столбцов, мне ее нужно обработать и на выходе получить таблицу , но без дубликатов. удаление дубликатов - это просто..2010 это умеет сам делать и с этим нет проблем. сложность возникает в следующем - у каждой строки есть 2 критерия, по которым нужно их суммировать - это номер документа и штрих код(шк), для этих целей прекрасно подходит ф-ия sumisf и она работает хорошо, все что надо делает.
собственно вот кусок кода, в котором я делаю 2 массива = 1й большой, в нем шк, 2й маленький и в нем номера документов(номера документов более уникальны)
Код:
For i = 1 To ilastrow
uniq1.Add Cells(i, 5), CStr(Cells(i, 5))
Next i

For g = 1 To ilastrow
uniq2.Add Cells(g, 1), CStr(Cells(g, 1))
Next g
далее внутри этих циклов , имея совокупность уникального шк и номера док-та я уже суммирую таблицу

Код:
For i = 1 To uniq1.Count
For g = 1 To uniq2.Count

ShKod = Trim(Str(uniq1.Item(i)))
nDoc = Trim(Str(uniq2.Item(g)))
clval = WorksheetFunction.SumIfs(Range("G1:G" + Trim(Str(ilastrow))), Range("A1:A" + Trim(Str(ilastrow))), nDoc, Range("E1:E" + Trim(Str(ilastrow))), ShKod)
    If clval <> 0 Then
     With Sheets(5)
        .Cells(Z, 2) = Sheets(6).Cells(Z, 3)
        .Cells(Z, 3) = Sheets(6).Cells(Z, 4)
        .Cells(Z, 4) = ShKod 'Str(Sheets(6).Cells(Z, 5))
        .Cells(Z, 5) = Sheets(6).Cells(Z, 6)
        .Cells(Z, 6) = clval
      End With
        Z = Z + 1
    End If
Next g
DoEvents
ProgressBar21.Value = (i * 100) / y
Next i
после суммирования я хоче перенести полученные значения на новый лист, но кроме суммы и ШК и меня ничего туда не переносится нормально, т.к. я не знаю, как получить фокус(номер строки) которая обрабатывается а конкретный момент, что бы взять с этой строки все нужные мне наименования в ячейках.
подскажите плиз комрады что мне и как переделать
sn00p вне форума Ответить с цитированием
Старый 27.09.2010, 12:10   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

При таком большом объеме данных работать с ячейками листа не следует. Будет очень долго. Либо используйте ADO, либо загоняйте все в массив, получайте то, что требуется, а затем вставляйте на новый лист.
Чтобы получить более полный ответ, прикрепите фрагмент Вашего файла (можно с "липовыми" данными) и подробно опишите задачу.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 27.09.2010, 12:13   #3
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Что-то как-то мутно... Пример дайте строк на 10.
Но раз у Вас 13500 строк, то быстрее будет работать с массивами ВБА а не с листом.
Например, вот это
For i = 1 To ilastrow
uniq1.Add Cells(i, 5), CStr(Cells(i, 5))
Next i
будет из массива выполняться за секунду.
Ну и вместо SumIf можно тоже перебор исходного массива проводить - не знаю, будет ли это медленнее, возможно и нет, но зато полный контроль над данными.

И кстати прогрессбар скорее всего не понадобится.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 27.09.2010 в 12:24.
Hugo121 вне форума Ответить с цитированием
Старый 27.09.2010, 12:38   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Кажется, Вам ведь надо выбрать уникальное сочетание номер-штрихкод и по нему просуммировать.
Т.е. сперва прогоняем один раз массив и получаем список уникальных пар, затем прогоняем один раз список и суммируем данные массива (цикл в цикле). Вроде так, или не то?
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 27.09.2010, 12:46   #5
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

Как я понял, ты хочешь знать в каких строках выражение:
Код:
clval = WorksheetFunction.SumIfs(Range("G1:G" + Trim(Str(ilastrow))), Range("A1:A" + Trim(Str(ilastrow))), nDoc, Range("E1:E" + Trim(Str(ilastrow))), ShKod)
нашло нужные значения? Если да, то тебе надо избавиться от этого выражения и разработать что-то более сложное.
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 27.09.2010, 13:12   #6
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Цитата:
Сообщение от sn00p Посмотреть сообщение
подскажите плиз комрады что мне и как переделать
Выполнить пожелания
Цитата:
Сообщение от SAS888 Посмотреть сообщение
Чтобы получить более полный ответ, прикрепите фрагмент Вашего файла (можно с "липовыми" данными) и подробно опишите задачу.
Не самим же выдумывать ваш файл
И у вас будет как минимум два совершенно разных способа решения вашей задачи,а то и три
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 27.09.2010, 13:35   #7
sn00p
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 40
По умолчанию

для примера, Лист2
отвечу всем, но позже, прошу прощения, заняли меня пока другой работой..
Вложения
Тип файла: rar obrabotka.rar (2.55 Мб, 11 просмотров)
sn00p вне форума Ответить с цитированием
Старый 27.09.2010, 14:04   #8
sn00p
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 40
По умолчанию

Цитата:
Сообщение от Skif-F Посмотреть сообщение
Как я понял, ты хочешь знать в каких строках выражение:
Код:
clval = WorksheetFunction.SumIfs(Range("G1:G" + Trim(Str(ilastrow))), Range("A1:A" + Trim(Str(ilastrow))), nDoc, Range("E1:E" + Trim(Str(ilastrow))), ShKod)
нашло нужные значения? Если да, то тебе надо избавиться от этого выражения и разработать что-то более сложное.
это формула суммирования по множественному условию.
а переменная нужна, что бы ее использовать для анализа полученного значения, что бы не было нулевых строк.

Последний раз редактировалось sn00p; 27.09.2010 в 14:16.
sn00p вне форума Ответить с цитированием
Старый 27.09.2010, 14:10   #9
sn00p
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 40
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Кажется, Вам ведь надо выбрать уникальное сочетание номер-штрихкод и по нему просуммировать.
Т.е. сперва прогоняем один раз массив и получаем список уникальных пар, затем прогоняем один раз список и суммируем данные массива (цикл в цикле). Вроде так, или не то?
собственно вы правы, вот этот кусок кода делает пару уникального значения, сперва идет перебор ШК потом номеров документов.
Код:
For i = 1 To uniq1.Count
For g = 1 To uniq2.Count

ShKod = Trim(Str(uniq1.Item(i)))
nDoc = Trim(Str(uniq2.Item(g)))
sn00p вне форума Ответить с цитированием
Старый 27.09.2010, 14:31   #10
sn00p
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 40
По умолчанию

еще помогите пожалуйста разобраться со следующей конструкцией:

Код:
For g = 1 To ilastrow
uniq2.Add Cells(g, 1), CStr(Cells(g, 1))
Next g
это единственное, что я заимствовал( и не могу нифига понять , ка работает, вернее, могу, по частям, но вот когда все сложить воедино - хрень какая то..
как я это понимаю
цикл от 1 до вычисленной или заданной переменной ilastrow заполняет массив uniq2 значениями из таблицы , адрес ячейки g строка, 1 столбец.
на выходе мы имеем фактически массив не повторяющихся значений.
и тут вопрос - если закоментить CStr(Cells(g, 1)), те , получить конструкцию

Код:
For g = 1 To ilastrow
uniq2.Add Cells(g, 1)
Next g
в массиве будут все значения и в том числе дублирующиеся.
какое отношение к этому имеет ф-ия CStr? она ведь возвращает текстовое значение переменной и все...какую роль она играет?
sn00p вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
Как передать данные типа "дата" из формы в таблицу Ярослав Блошенко Microsoft Office Access 1 26.02.2010 18:22
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Обновление набора данных после добавления в таблицу записей "внешней" программой dimmm БД в Delphi 5 21.04.2009 00:56