Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
3 / 3 / 0
Регистрация: 12.12.2015
Сообщений: 174

Как собрать в одну ячейку значения из столбца ч группировкой по номерам?

01.05.2018, 19:27. Показов 2279. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Уважаемые гуру VBA, Появилась потребность собрать список мест хранения. Есть список мест хранения (Лист2). Места хранения записаны в виде текста «ОS-0014-001-1002», где есть четыре группы. Третья группа, это отделения «Отп». Группа отделений всегда начинается с цифры «5».
Надо собрать все места хранения в одну ячейку (Лист1), в начале списка номера полок основного склада, затем идут «Отп», но при этом для каждой группы «Отп» оставить только первую запись текста, а далее только номера, для понимания к какому «Отп» принадлежат полки, и так для каждой "Отп" .
Вариант, как надо получить список записан в ячейку столбца 6 на Лист1. Раскрашено для наглядности. Написал код, но результат работы не корректен . Пожалуйста помогите доработать в соответствии с описанием?
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub Сбор_хран()
Dim wb As Workbook, LRow As Long, Z As Range, ТМ As String, aCell As Range, s$
    Set wb = ThisWorkbook
For Each Z In wb.Sheets(1).Range("C19:C" & wb.Sheets(1).Cells(Rows.Count, 3).End(xlUp).Row)
For Each aCell In wb.Sheets(2).Range("D2:D" & wb.Sheets(2).Cells(Rows.Count, 4).End(xlUp).Row)
    If Left(aCell, 2) = "ОS" Then ТМ = Left(aCell, 7) Else If Left(aCell, 2) = "ОN" Then ТМ = Left(aCell, 8)
    If Z = ТМ And aCell <> aCell.Offset(1, 0) Then
        If Left(Right(aCell, 8), 1) = "5" And Left(Right(aCell, 8), 5) = Left(Right(aCell.Offset(1, 0), 8), 5) Then
            s = s & "Отп." & Left(Right(aCell, 8), 3) & " оп." & aCell.Offset(0, -1) & "; "
        Else
            s = s & aCell.Offset(0, -1) & "; "
        End If
    End If
    Next
        If s <> "" Then
              Cells(2, 2) = Application.Trim(s)
            s = ""
        End If
Next
End Sub
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.05.2018, 19:27
Ответы с готовыми решениями:

Смещение столбца вверх на одну ячейку - как?
Смещение столбца вверх на одну ячейку - как это сделать?

Как записать значения массива в виде простого текста в одну ячейку в БД?
Друзья, очень прошу помощи - сломала уже весь мозг! Есть массив $cart Array ( =&gt; Array ( =&gt;...

Перенос данных столбца в одну ячейку
Добрый день! Имеется столбец с числовыми данными. Каким образом или с помощью какой функции можно содержимое каждой ячейки столбца...

5
3 / 3 / 0
Регистрация: 12.12.2015
Сообщений: 174
02.05.2018, 05:44  [ТС]
Ам сорри , Одно неосторожное движение и всё пропало . Досылаю файлик с примером.
Вложения
Тип файла: xls Места хранения.xls (60.5 Кб, 6 просмотров)
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
02.05.2018, 11:38
Лучший ответ Сообщение было отмечено Sasanik как решение

Решение

Как вариант со словарем:
Кликните здесь для просмотра всего текста
Visual Basic
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
Sub SborMestHran()
    a = Sheets("Лист2").UsedRange
    Set k = CreateObject("Scripting.Dictionary")
    Set h = CreateObject("Scripting.Dictionary")
    With CreateObject("Scripting.Dictionary")
        For i = 2 To UBound(a)
            If k.exists(a(i, 4)) Then GoTo Sled
            k.Item(a(i, 4)) = 0
            s = Split(a(i, 4), "-")
            t = s(0) & "-" & s(1)
            th = s(0) & "-" & s(1) & "-" & s(2)
            ns = s(3) Mod 1000
            If h.exists(th) Then
                sh = h.Item(th) & "; " & ns
            Else
                hr = IIf(.exists(t), ";", "")
                .Item(t) = .Item(t) & hr & th
                sh = IIf(Val(s(2)) >= 500, "Опт." & s(2) & " оп.", "") & ns
            End If
            h.Item(th) = sh
Sled:
        Next
        i = 3
        For Each x In .keys
            s = Split(.Item(x), ";")
            st = ""
            For Each b In s
                st = st & IIf(st = "", "", "; ") & h.Item(b)
            Next
            Sheets("Лист1").Cells(i, 2) = st
            Sheets("Лист1").Cells(i, 3) = x
            i = i + 1
        Next
    End With
End Sub
0
3 / 3 / 0
Регистрация: 12.12.2015
Сообщений: 174
02.05.2018, 15:56  [ТС]
toiai, Спасибо! Результат похож на истину. Только вот "№" полки надо брать, в моём случае, из столбца (3). В приложенном примере, идеально получилось, что номер из третьего столбца и из последней группы номера места хранения совпали. Реально дело обстоит так: - Полку можно разделить пополам - получаем ещё одно место. Можно сдвинуть полки, уменьшив их размеры и получить места для добавочных полок. Вот и получается, что место хранения "ОS-0014-002-1038" будет иметь номер "38А", или "38-2" или "200/38" - бывает и такое.
И да, как то можно синхронизировать результат со списком расположенным в 3 столбце первого листа? То есть: если в первом листе в третьем столбце есть номер "ОS-0014" надо во второй столбец собрать все номера хранения для этой позиции.
Эти семь символов есть общее место и по ним нужен отбор номеров. Общие места в моем случае могут иметь или семь или восемь знаков.
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
02.05.2018, 17:40
Цитата Сообщение от Sasanik Посмотреть сообщение
В приложенном примере, идеально получилось
Правильно поставленная задача- 50% ёё решения...
0
3 / 3 / 0
Регистрация: 12.12.2015
Сообщений: 174
04.05.2018, 16:17  [ТС]
Цитата Сообщение от toiai Посмотреть сообщение
Правильно поставленная задача- 50% ёё решения...
Добавил остальные 50% Теперь номера полок собираются в зависимости от заданных объектов в столбце 3 первого листа.
Visual Basic
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
Sub Сбор_хран2()
Dim wb As Workbook, s, a, k, h, i As Long, st As String, x, b
Dim t As String, th As String, ns As String, sh As String, hr As String
        Set wb = ThisWorkbook
        a = wb.Sheets(2).UsedRange
        Set k = CreateObject("Scripting.Dictionary")
        Set h = CreateObject("Scripting.Dictionary")
    With CreateObject("Scripting.Dictionary")
        For i = 2 To UBound(a)
            If k.exists(a(i, 4)) Then GoTo Sled
            k.Item(a(i, 4)) = 0
            s = Split(a(i, 4), "-")
            t = s(0) & "-" & s(1)
            th = s(0) & "-" & s(1) & "-" & s(2)
            ns = (a(i, 3))   ' Номера полок из третьего столбца исходных данных
            If h.exists(th) Then
                sh = h.Item(th) & "; " & ns
            Else
                hr = IIf(.exists(t), ";", "")
                .Item(t) = .Item(t) & hr & th
                sh = IIf(Val(s(2)) >= 500, "Отп." & s(2) & " оп.", "") & ns
            End If
            h.Item(th) = sh
Sled:
        Next
        i = 1
        For Each x In .keys
            s = Split(.Item(x), ";")
            st = ""
            For Each b In s
                st = st & IIf(st = "", "", "; ") & h.Item(b)
            Next
                If Not wb.Sheets(1).Columns(3).Find(x, , , xlWhole) Is Nothing Then
                ' Ищем в листе 1 "Место общее" и добавляем номера полок, которые есть вэтом месте. Предварительно убрав лишний текст
                    wb.Sheets(1).Cells(wb.Sheets(1).Columns(3).Find(x, , , xlWhole).Row, 2) = Replace(st, "Полка № ", "")
                    i = i + 1
                End If
        Next
    End With
End Sub
Спасибо за помощь! toiai.
Вложения
Тип файла: xls Места хранения2.xls (70.5 Кб, 3 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.05.2018, 16:17
Помогаю со студенческими работами здесь

Группировать числа из столбца в одну ячейку
Помогите, пожалуйста, решить проблему. В строке A номера &quot;линий&quot;, в виде 1,1,1,1, ... 2,2,2,2, ... В строке B номера...

Вывод значений столбца в одну ячейку
Добрый день. Прошу помощи. Задача следующая: Вывести значения столбца в одну ячейку Имеем простую таблицу Фрукты с несколькими...

Объединить несколько строк столбца отчета в одну ячейку
Добрый день! Целый день бьюсь с задачей- как объединить несколько сгруппированных строк столбца отчета в одну ячейку. Смотрел решения...

Объединение значений ячеек столбца в одну ячейку с разделителем
Добрый день. Помогите, пожалуйста решить задачу. Имеется большое количество названий проектов, записанных в один столбец. Для обработки...

Поочередное копирование значений столбца в одну ячейку (Excel)
Всем привет! Нужен совет профессионалов. У меня есть файл Excel, в нем 3 листа. На первом листе есть 2 столбца значений с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru