powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Нужен макрос
17 сообщений из 17, страница 1 из 1
Нужен макрос
    #39692717
Leprous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток господа!!!

Набросайте пожалуйста макрос

Нужно обработать табличку, столбец 1 - артикулы, столбец 2 размеры.
на 1 артикул может приходиться несколько размеров, нужно склеить строки с одинаковыми артикулами, чтобы в столбце 2 были все значения склеенных строк через запятую.

Пример исходника.
ccc 12d
ссс 13d
ссс 14d
ccxcx 123
xcxcx 13
xcxcx 44

На выходе
ccc 12d,13d,14d
ccxcx 123
xcxcx 13,44

Нужен именно макрос, потому что в табличке около 50к строк
...
Рейтинг: 0 / 0
Нужен макрос
    #39692725
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поищи тут:
[youtube=
YouTube Video
...
Рейтинг: 0 / 0
Нужен макрос
    #39692726
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет, сводные таблицы тебе тут не помогут.
...
Рейтинг: 0 / 0
Нужен макрос
    #39692728
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183Хотя нет, сводные таблицы тебе тут не помогут.неужели в сводных таблицах нет элементарной конкатенации?
...
Рейтинг: 0 / 0
Нужен макрос
    #39692871
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

в классических нет. Если использовать PowerQuery и PowerPivot - то можно.
Или VBA: Как сцепить несколько значений в одну ячейку по критерию? СцепитьЕсли
Правда, сначала придется создать таблицу уникальных значений. Что уже проще через ту же Данные -Удалить дубликаты(только на копии таблицы)
...
Рейтинг: 0 / 0
Нужен макрос
    #39692891
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeprousНужен именно макрос, потому что в табличке около 50к строк
Нафига?
Если это, скажем, колонки 1 и 2, то в R2C3 пишешь формулу
Код: vbnet
1.
=ЕСЛИ(СТРОКА()=1;RC[-1];ЕСЛИ(RC1=R[-1]C1;СЦЕПИТЬ(R[-1]C;",";RC[-1]);RC[-1]))

для R1C1 или
Код: vbnet
1.
=ЕСЛИ(СТРОКА()=1;B2;ЕСЛИ($A2=$A1;СЦЕПИТЬ(C1;",";B2);B2))

для A1 и растягиваешь вниз-вверх по всей колонке. Данные должны быть сортированы по колонке 1. Затем Copy-PasteSpecial и выбираешь для каждого значения максимальный по длине набор.

Не, если прёт - запиши всё это макрорекордером, получишь макрос.
...
Рейтинг: 0 / 0
Нужен макрос
    #39692898
garbushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leprous
Код: 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.
Sub Ìàêðîñ1()
    my_sheets = "Ëèñò1"
    I = 1
    N = 1
    val_old = ""
    While Sheets(my_sheets).Cells(N, 5).Value <> ""
        Sheets(my_sheets).Cells(N, 5).Value = ""
        Sheets(my_sheets).Cells(N, 6).Value = ""
        N = N + 1
    Wend
    N = 1
    While Sheets(my_sheets).Cells(I, 1).Value <> ""
        If val_old = "" Or val_old = Sheets(my_sheets).Cells(I, 1).Value Then
            If Sheets(my_sheets).Cells(N, 6).Value <> "" Then
                Sheets(my_sheets).Cells(N, 6).Value = CStr(Sheets(my_sheets).Cells(N, 6).Value) + "," + CStr(Sheets(my_sheets).Cells(I, 2).Value)
            Else
                Sheets(my_sheets).Cells(N, 5).Value = Sheets(my_sheets).Cells(I, 1).Value
                Sheets(my_sheets).Cells(N, 6).Value = Sheets(my_sheets).Cells(I, 2).Value
            End If
        Else
            N = N + 1
            Sheets(my_sheets).Cells(N, 5).Value = Sheets(my_sheets).Cells(I, 1).Value
            Sheets(my_sheets).Cells(N, 6).Value = Sheets(my_sheets).Cells(I, 2).Value
        End If
        val_old = Sheets(my_sheets).Cells(I, 1).Value
        I = I + 1
    Wend
End Sub
...
Рейтинг: 0 / 0
Нужен макрос
    #39693142
Leprous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
garbushka,

работает но не совсем правильно, первую строку в расчет не берет, а дальше вроде все хорошо.

исходный
ccc2ссс 2ссс12

результат
ccc 2
ссс 2,12


И еще артикул у меня в табличке 3 строкой, а размер 9.
Сори за не полную инфу, прикрепляю образец.


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

Код: 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.
Sub Macros1()
    my_sheets = "1"
    I = 1
    N = 1
    val_old = ""
    While Sheets(my_sheets).Cells(N, 20).Value <> ""
        Sheets(my_sheets).Cells(N, 20).Value = ""
        Sheets(my_sheets).Cells(N, 21).Value = ""
        N = N + 1
    Wend
    N = 1
    While Sheets(my_sheets).Cells(I, 1).Value <> ""
        If val_old = "" Or val_old = Sheets(my_sheets).Cells(I, 1).Value Then
            If Sheets(my_sheets).Cells(N, 21).Value <> "" Then
                Sheets(my_sheets).Cells(N, 21).Value = CStr(Sheets(my_sheets).Cells(N, 21).Value) + "," + CStr(Sheets(my_sheets).Cells(I, 2).Value)
            Else
                Sheets(my_sheets).Cells(N, 20).Value = Sheets(my_sheets).Cells(I, 1).Value
                Sheets(my_sheets).Cells(N, 21).Value = Sheets(my_sheets).Cells(I, 2).Value
            End If
        Else
            N = N + 1
            Sheets(my_sheets).Cells(N, 20).Value = Sheets(my_sheets).Cells(I, 1).Value
            Sheets(my_sheets).Cells(N, 21).Value = Sheets(my_sheets).Cells(I, 2).Value
        End If
        val_old = Sheets(my_sheets).Cells(I, 1).Value
        I = I + 1
    Wend
End Sub

Модератор: Учимся использовать тэги оформления кода - FAQ
...
Рейтинг: 0 / 0
Нужен макрос
    #39693217
Leprous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinaдля A1 и растягиваешь вниз-вверх по всей колонке. Данные должны быть сортированы по колонке 1. Затем Copy-PasteSpecial и выбираешь для каждого значения максимальный по длине набор.



50 тысяч размеров
30 тысяч товаров
и это действие надо будет проводить каждый день.
По этому нужен макрос!!
...
Рейтинг: 0 / 0
Нужен макрос
    #39693483
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leprous,

Не смотрел Ваш код, сделал по примеру. А вообще, извините уж за прямоту: по поводу "нужен макрос". Всем что-то нужно. Мне может тоже подъехать в автомастерскую и тоже сказать "мне нужно масло поменять". Все-таки элементарная вежливость не помешала бы. Люди делают работу за Вас бесплатно!
...
Рейтинг: 0 / 0
Нужен макрос
    #39693513
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leprous50 тысяч размеров
30 тысяч товаров
и это действие надо будет проводить каждый день.
По этому нужен макросДа не вопрос... пиши. Основу запиши макрорекордером, а потом подрихтуй руками под себя.

Или это типичное "сделайте за меня"? тогда - во фриланс.
...
Рейтинг: 0 / 0
Нужен макрос
    #39693968
Leprous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, да я бы сделал, только не знаю как сравнить ячейки в столбце, единственное что приходит на ум это через формулу, еще же надо сделать цикл, а я вообще не шарю.

iMrTidy,

Извините, не подумал что это прозвучит грубо.
Спасибо огромное за ваш макрос, он работает идеально.
Прикрутил к нему макрос удаление дубликатов, протестировал на полном каталоге 50к строк, мне показалась что он долго работает.
Посмотрите пожалуйста, может что не так прикрутил.

Код: 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.
Option Explicit

Public Sub CombineSizesPerArticle()

'замена запятых на точки'

[D:D].Replace ",", "."
[I:I].Replace ",", "."

Dim sh As Worksheet
Dim sArtCol As String
Dim sSizeCol As String
Dim sDestCol As String
Dim arts() As Variant
Dim sizes() As Variant
Dim i As Long
Dim dict As Object
Dim sArr() As String

sArtCol = "J"
sSizeCol = "I"
sDestCol = "W"

Set sh = ThisWorkbook.Sheets(1)
Set dict = CreateObject("Scripting.Dictionary")

arts = sh.Range(GetRangeToLastRow(sh, sArtCol))
sizes = sh.Range(GetRangeToLastRow(sh, sSizeCol))

For i = 1 To UBound(arts, 1)
    dict(arts(i, 1)) = dict(arts(i, 1)) & IIf(dict(arts(i, 1)) <> "", ", ", "") & sizes(i, 1)
Next

ReDim sArr(UBound(arts, 1))
For i = 1 To UBound(arts, 1)
    sArr(i - 1) = dict(arts(i, 1))
Next

sh.Range(sDestCol & ":" & sDestCol).Clear
sh.Range(sDestCol & "1").Resize(UBound(sArr), 1).Value = Application.Transpose(sArr)

'перенос столбца W в I'

Columns("W:W").Select
Selection.Cut
Columns("I:I").Select
ActiveSheet.Paste
    
'Удаление дубликатов'

    Dim lngI As Long
For lngI = Cells(Rows.Count, 11).End(xlUp).Row To 2 Step -1
If Cells(lngI, 11).Value = Cells(lngI - 1, 11).Value Then
Rows(lngI).Delete Shift:=xlUp
End If
Next lngI

End Sub

Private Function GetRangeToLastRow(sh As Worksheet, sC As String) As String

Dim r As Long

r = sh.Cells(sh.Rows.Count, sh.Range(sC & ":" & sC).Column).End(xlUp).Row
GetRangeToLastRow = sC & "1:" & sC & r
End Function
...
Рейтинг: 0 / 0
Нужен макрос
    #39694054
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leprous...мне показалась что он долго работает...
Когда кажется, креститься нужно (любила говаривать бабушка, царство ей небесное), а я бы к психиатру забежал для верности. А если серьезно, то долго это сколько? По мне, так чем дольше, тем лучше - есть время сбегать на кухню за кофе, выкурить сигарету, съездить к любовнице в конце концов. У азиатов так вообще долго, значит качественно.

LeprousПосмотрите пожалуйста, может что не так прикрутил.
По мне, так все не так. Каша какая-то (и даже не гречневая с мясом, а противная п е рловая). Давайте в одну процедуру еще накидаем открытие и сохранение файлов и дверей, и заодно отправку почты, и подметание пола, и вызов духов, чтобы два раза не бегать.
Запятые на точки для чего меняете?
Зачем W переносить в I, сразу туда не кашерно возвращать результат? Хотя, конечно, чем больше таких операций, тем больше других дел можно переделать за день.
Вот если бы Вы свои хотелки сразу описывали простым и понятным способом с примером, глядишь и люди потянулись бы, а так все это хочется предать анафеме и уйти на радугу.
А теперь о главном "тормозе" процесса, об удалении дубликатов. А сразу, в памяти, не стоило бы получить нужный результат?
...
Рейтинг: 0 / 0
Нужен макрос
    #39694586
Leprous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iMrTidy,

На написание макроса ушло меньше времени чем на выброс желчи?
Зачем пароль?
Чтобы дальше нести ересь?, пока я буду его просить?
Замены, добавлены по нужде, остальное смог реализовать исходя из нулевых знаний VBA.

изначально требовалось

Пример исходника.
ccc 12d
ссс 13d
ссс 14d
ccxcx 123
xcxcx 13
xcxcx 44

На выходе
ccc 12d,13d,14d
ccxcx 123
xcxcx 13,44

Ваш макрос делал

На выходе
ccc 12d,13d,14d
ccc 12d,13d,14d
ccc 12d,13d,14d
ccxcx 123
xcxcx 13,44
xcxcx 13,44

Ваша последняя версия макроса, выдает ошибку run time error 9.

Еще раз спасибо, за макрос, но как вы написали, сходите к психиатру.
...
Рейтинг: 0 / 0
Нужен макрос
    #39694608
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leprous,

Жизненный вышел пост, а чувство юмора не купишь, хотя Вам и не нужно, не стоит.

У меня все работает, что я делаю не так? А вообще, так задумано, с приложенным примером все будет работать.

А давайте еще вспомним, что мои макросы делали 10 лет назад, так сегодня бы меня уволили без выходного пособия.

Пароль - чтобы Вы поняли, что забесплатно сделают только фанатики. Да и разве ж это пароль? Курам на смех! Раньше сделал бы за 500 р, но теперь цена вопроса 5 000 р, вежливее и добрее надо быть. И это на полном серьезе.

Иначе - успехов!
...
Рейтинг: 0 / 0
Нужен макрос
    #39695866
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leprous, вот ещё вариант

Код: 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.
Public Sub CombineSizesPerArticle()
' артикулы отсортированы!
Dim i&, Razmers$, Artiqle$, y&, z&, t1$
i = 1
Razmers = vbNullString ' здесь будем сохранять размерный ряд
Artiqle = vbNullString ' будем сравнивать по этому артикулу
y = 1
Const sArtCol& = 3
Const sSizeCol& = 9
Const sDestCol& = 22
Const Kilafter$ = "ATK" ' если это у нас дубль сохраним в 22-м столбце эту константу чтоб потом удалить
Application.ScreenUpdating = 0
Do Until ActiveSheet.Cells(i, 1).Value = Empty

    If Artiqle <> ActiveSheet.Cells(i, sArtCol).Value Then ' переходим на новый артикул
    ActiveSheet.Cells(y, sDestCol).Value = Razmers
        Razmers = ActiveSheet.Cells(i, sSizeCol).Value: y = i
        Artiqle = ActiveSheet.Cells(i, sArtCol).Value
    Else
     Razmers = Razmers & "," & ActiveSheet.Cells(i, sSizeCol).Value: ActiveSheet.Cells(i, sDestCol).Value = Kilafter
    End If
i = i + 1
Loop
ActiveSheet.Cells(y, sDestCol).Value = Razmers
' удалим дубликаты
For z = i - 1 To 1 Step -1
If ActiveSheet.Cells(z, sDestCol).Value = Kilafter Then Rows(z).Delete
Next z
Application.ScreenUpdating = 1
End Sub

...
Рейтинг: 0 / 0
Нужен макрос
    #39699320
Leprous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alecko, Спасибо, но мой колхозный вариант хоть и долго но работает
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Нужен макрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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