3 / 3 / 0
Регистрация: 12.12.2015
Сообщений: 174
1

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

01.05.2018, 19:27. Показов 1962. Ответов 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.05.2018, 19:27
Ответы с готовыми решениями:

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

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

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

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

5
3 / 3 / 0
Регистрация: 12.12.2015
Сообщений: 174
02.05.2018, 05:44  [ТС] 2
Ам сорри , Одно неосторожное движение и всё пропало . Досылаю файлик с примером.
Вложения
Тип файла: xls Места хранения.xls (60.5 Кб, 6 просмотров)
0
3217 / 966 / 223
Регистрация: 29.05.2010
Сообщений: 2,085
02.05.2018, 11:38 3
Лучший ответ Сообщение было отмечено 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  [ТС] 4
toiai, Спасибо! Результат похож на истину. Только вот "№" полки надо брать, в моём случае, из столбца (3). В приложенном примере, идеально получилось, что номер из третьего столбца и из последней группы номера места хранения совпали. Реально дело обстоит так: - Полку можно разделить пополам - получаем ещё одно место. Можно сдвинуть полки, уменьшив их размеры и получить места для добавочных полок. Вот и получается, что место хранения "ОS-0014-002-1038" будет иметь номер "38А", или "38-2" или "200/38" - бывает и такое.
И да, как то можно синхронизировать результат со списком расположенным в 3 столбце первого листа? То есть: если в первом листе в третьем столбце есть номер "ОS-0014" надо во второй столбец собрать все номера хранения для этой позиции.
Эти семь символов есть общее место и по ним нужен отбор номеров. Общие места в моем случае могут иметь или семь или восемь знаков.
0
3217 / 966 / 223
Регистрация: 29.05.2010
Сообщений: 2,085
02.05.2018, 17:40 5
Цитата Сообщение от Sasanik Посмотреть сообщение
В приложенном примере, идеально получилось
Правильно поставленная задача- 50% ёё решения...
0
3 / 3 / 0
Регистрация: 12.12.2015
Сообщений: 174
04.05.2018, 16:17  [ТС] 6
Цитата Сообщение от 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.05.2018, 16:17
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru