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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2013, 18:20   #1
bugx
Новичок
Джуниор
 
Регистрация: 15.04.2013
Сообщений: 7
По умолчанию Сортировка с копированием VBA

Подскажите, а вернее необходимо написать макрос такой вот сортировки.
На листе один имеется наименование товара, код, количество.
Код товара периодически повторяется. Необходимо при нажатии на кнопку, в листе2 создавалась такая же таблица, только чтобы были уникальные записи по коду и сумма количества.
Вложения
Тип файла: zip Sheet.zip (4.8 Кб, 11 просмотров)
bugx вне форума Ответить с цитированием
Старый 15.04.2013, 18:30   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Тут есть готовое решение-полуавтомат:
http://www.planetaexcel.ru/forum/ind...ID=8&TID=24401
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 16.04.2013, 11:15   #3
bugx
Новичок
Джуниор
 
Регистрация: 15.04.2013
Сообщений: 7
По умолчанию

Вот есть такой код:

Код:
Sub ss()
Dim a(), oDict As Object, i As Long, temp As String
a = Range("B1:C" & Range("B" & Rows.Count).End(xlUp).Row).Value
Set oDict = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(a)
temp = UCase(Trim(a(i, 1)))
If Not oDict.Exists(temp) Then
oDict.Add temp, CStr(a(i, 2))
Else
oDict.Item(temp) = CStr(--oDict.Item(temp) + a(i, 2))
End If
Next
With ThisWorkbook.Worksheets(2)
.Range("B1").Resize(oDict.Count) = Application.Transpose(oDict.keys)
.Range("C1").Resize(oDict.Count) = Application.Transpose(oDict.items)
End With
End Sub
Все работает как надо. Проблема в том, что мне необходимо для трех столбцов. Т.е. чтобы первый столбец был привязан к конкретному номеру во втором столбце. Прошу прощения за банальный вопрос, но я не когда не работал с ВБА. И разобраться в коде для мне большая проблема на данный момент, вот по этому и прошу помощи гуру.



___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 16.04.2013 в 11:32.
bugx вне форума Ответить с цитированием
Старый 16.04.2013, 11:45   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

видимо надо так поправить
Код:
With ThisWorkbook.Worksheets(2)
  .cells.clearcontents
  .Range("B1").Resize(oDict.Count) = Application.Transpose(oDict.keys)
  .Range("C1").Resize(oDict.Count) = Application.Transpose(oDict.items)
  dim r as long, rg as range
  r = 1
  do while .cells(r,2) <> ""
    set rg = range("B:B").find(.cells(r,2))
    .cells(r,1) = rg.offset(0,-1)
    r = r+1
  loop
End With
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 16.04.2013, 12:21   #5
bugx
Новичок
Джуниор
 
Регистрация: 15.04.2013
Сообщений: 7
По умолчанию

чего то не то получилось. Первый столбец остается все равно не заполнен. Попробую еще раз объяснить. В столбце А - название продукции, в столбце В - код продукта, в столбце С - количество. Мне необходимо сделать уникальные записи в столбце В и просуммировать количество повторяющихся в столбце С. Но чтобы запись в столбце А, которой соответствует код в столбце В остались. Получается повторяющиеся удаляются. Прикрепленный файл в начале топика.
bugx вне форума Ответить с цитированием
Старый 16.04.2013, 12:38   #6
bugx
Новичок
Джуниор
 
Регистрация: 15.04.2013
Сообщений: 7
По умолчанию

Немного поправил код:

Код:
With ThisWorkbook.Worksheets(2)
  .Cells.ClearContents
  .Range("B1").Resize(oDict.Count) = Application.Transpose(oDict.keys)
  .Range("C1").Resize(oDict.Count) = Application.Transpose(oDict.items)
  Dim r As Long, rg As Range
  r = 1
  Do While .Cells(r, 2) <> "A"
    Set rg = Range("B:B").Find(.Cells(r, 2))
    .Cells(r, 1) = rg.Offset(0, -1)
    r = r + 1
  Loop
End With
Программа зацикливается, но если ее прервать, вроде работает как надо.
bugx вне форума Ответить с цитированием
Старый 16.04.2013, 14:51   #7
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

не проверял на данных, писал просто тут, поэтому:
вместо r = 1 напишите r = 2
выход из цикла все-таки по достижению пустой ячейки в колонке 2 (а не ячейки с буквой А)))
Do While .Cells(r, 2) <> ""
так пробуйте:
Код:
    r = 2
    Do While .Cells(r, 2) <> ""
все пойдет
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 16.04.2013, 14:57   #8
bugx
Новичок
Джуниор
 
Регистрация: 15.04.2013
Сообщений: 7
По умолчанию

ушел от зацикливания. Не самый лучший код, но для человека, который только что открыл для себя VBA сойдет
Код:
With ThisWorkbook.Worksheets(2)
  .Cells.ClearContents
  .Range("B1").Resize(oDict.Count) = Application.Transpose(oDict.keys)
  .Range("C1").Resize(oDict.Count) = Application.Transpose(oDict.items)
  Dim r As Long, rg As Range
  r = 1
  Do
      r = r + 1
  '.Cells(r, 2) <> "A"'
    Set rg = Range("B:B").Find(.Cells(r, 2))
    .Cells(r, 1) = rg.Offset(0, -1)
    Loop Until r = 5000
  'Loop'
End With
Единственный недостаток это обработка столбца в 5000 ячеек. Если ставить по максимуму 65535, думает очень долго. Так что для меня 5000 ячеек выше-крыши
bugx вне форума Ответить с цитированием
Старый 16.04.2013, 15:03   #9
bugx
Новичок
Джуниор
 
Регистрация: 15.04.2013
Сообщений: 7
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
не проверял на данных, писал просто тут, поэтому:
вместо r = 1 напишите r = 2
выход из цикла все-таки по достижению пустой ячейки в колонке 2 (а не ячейки с буквой А)))
Do While .Cells(r, 2) <> ""
так пробуйте:
Код:
    r = 2
    Do While .Cells(r, 2) <> ""
все пойдет
ваш код работает на ура, я просто допустил ошибку в формирование первоначальной таблицы. Просто первая строчка у меня была пустой. Не стал изменять переменную r на двойку а просто изменил структуру таблицы, убрав первую пустую ячейку. Спасиб большое. Но и на примере моего кода, я немного въехал в суть
bugx вне форума Ответить с цитированием
Старый 16.04.2013, 15:38   #10
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
Но и на примере моего кода, я немного въехал в суть
а вот это абсолютно правильный вывод! То, что написали сами - возможно не совсем правильно, на самым рациональным способом, но сделано это осознано и если заработало - уже хорошо, цель достигнута.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка расческой,перепишите с С++ на VBA DeadGod Помощь студентам 0 04.12.2012 17:03
Сортировка с помощью VBA Lyubov1990 Microsoft Office Excel 11 22.11.2011 20:06
vba сортировка массива Aion Microsoft Office Access 2 01.06.2011 12:14
VBA сортировка одномерного массива MIKE11IPME Помощь студентам 1 17.04.2011 20:58
VBA Сортировка 2007 vs. 2003 Acro Microsoft Office Excel 0 10.05.2009 23:58