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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2014, 09:47   #1
Knyazev_I
Новичок
Джуниор
 
Регистрация: 17.04.2014
Сообщений: 8
По умолчанию Работа со строкой в VBA

Доброго времени суток, уважаемы!
Есть столбец в Excel, строки которого содержат информацию следующего формата 16/20+12/18+12/18RCP. Т.е. 16/20 - наименование, "+" - разделительный символ.
В соседнем столбце строки содержат информация тип 75/53/22, т.е. количество для каждого наименования.
Каким образом разделить информацию в ячейках и в итоге получить отчет вида:
16/20 = сумма 150
12/18 = сумма 106
12/18RCP = сумма 44
Knyazev_I вне форума Ответить с цитированием
Старый 17.04.2014, 09:54   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Split значений в массивы, соспоставление элементов массивов. Вот таким образом
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 17.04.2014, 09:58   #3
Knyazev_I
Новичок
Джуниор
 
Регистрация: 17.04.2014
Сообщений: 8
По умолчанию

Не поможете с кодом? Можно за $. Если да, то стоимость.
Забыл уточнить что строки (16/20+12/18+12/18RCP и 75/53/22) могут иметь более чем 3 типа.

Последний раз редактировалось Knyazev_I; 17.04.2014 в 10:01.
Knyazev_I вне форума Ответить с цитированием
Старый 17.04.2014, 10:27   #4
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Например, так:
Код:
Sub qq()
    Dim i As Long, j As Integer, a(), b(), ai, bi
    a = Range("A1:B" & Cells(Rows.Count, 1).End(xlUp).Row).Value
    ReDim b(1 To UBound(a, 1), 1 To 1)
    For i = 1 To UBound(a, 1)
        ai = Split(a(i, 1), "+"): bi = Split(a(i, 2), "/")
        If UBound(ai) = UBound(bi) Then
            For j = LBound(ai) To UBound(ai)
                b(i, 1) = b(i, 1) & ai(j) & " = сумма " & bi(j) & ", "
            Next
            b(i, 1) = Left$(b(i, 1), Len(b(i, 1)) - 2)
        End If
    Next
    [C1].Resize(UBound(b, 1), 1).Value = b
End Sub
Пример во вложении. Откройте файл и запустите макрос "qq".
Для более конкретного ответа прикрепите файл с данными.
Вложения
Тип файла: rar Книга1.rar (6.9 Кб, 9 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 на форуме Ответить с цитированием
Старый 17.04.2014, 11:17   #5
Knyazev_I
Новичок
Джуниор
 
Регистрация: 17.04.2014
Сообщений: 8
По умолчанию

SAS888, спасибо.
Подскажите как получить отчет вида
16/20 = сумма 150
12/18 = сумма 106
12/18RCP = сумма 44
Т.е. сумма всех значений по каждому обнаруженному наименованию.
Knyazev_I вне форума Ответить с цитированием
Старый 17.04.2014, 12:20   #6
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Прикрепите файл с исходными данными...
Чем шире угол зрения, тем он тупее.
SAS888 на форуме Ответить с цитированием
Старый 17.04.2014, 12:23   #7
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

И с результатом!
И это нужно было сделать сразу, с вопросом.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 17.04.2014, 13:04   #8
Knyazev_I
Новичок
Джуниор
 
Регистрация: 17.04.2014
Сообщений: 8
По умолчанию

Можно отчет в функции MessageBox?
Вложения
Тип файла: zip Копия.zip (32.6 Кб, 13 просмотров)
Knyazev_I вне форума Ответить с цитированием
Старый 17.04.2014, 13:23   #9
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

В msgbox?
Пожалуйста
Добавил пару строк в код уважаемого SAS888 (а лишнее закомментировал):
Код:
Option Explicit

Sub qq()
    Dim i As Long, j As Integer, a(), ai, bi, k 'b()
    a = Range("N2:O" & Cells(Rows.Count, 15).End(xlUp).Row).Value
    'ReDim b(1 To UBound(a, 1), 1 To 1)
    With CreateObject("Scripting.Dictionary"): .comparemode = 1

        For i = 1 To UBound(a, 1)
            If Len(a(i, 1)) Then
                ai = Split(a(i, 2), "+"): bi = Split(a(i, 1), "/")
                If UBound(ai) = UBound(bi) Then
                    For j = LBound(ai) To UBound(ai)
                        .Item(ai(j)) = .Item(ai(j)) + --bi(j)
                        'b(i, 1) = b(i, 1) & ai(j) & " = сумма " & bi(j) & ", "
                    Next
                    'b(i, 1) = Left$(b(i, 1), Len(b(i, 1)) - 2)
                End If
            End If
        Next

        For Each k In .keys
            MsgBox k & " = сумма " & .Item(k)
        Next

    End With

End Sub
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 17.04.2014 в 13:25.
Hugo121 вне форума Ответить с цитированием
Старый 17.04.2014, 13:28   #10
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

1. Можно! А что Вы потом с ним делать будете - PrintScreen?
2. Свернутые строки включать в отчет или нет?
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа со строкой Le0n4iko_o Общие вопросы Delphi 15 08.04.2014 12:08
Работа с строкой ATL PHP 2 17.11.2011 22:33
Работа со строкой TI_ProJecT Помощь студентам 18 08.11.2011 16:04
Работа со строкой FrostoS Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 04.01.2011 17:20
VBA - можно ли выполнить выражение, заданное строкой alexshm Microsoft Office Excel 3 22.09.2010 21:58