Профессиональные приемы работы в Microsoft Excel

Обмен опытом => Microsoft Excel => Тема начата: Yura от 03.02.2015, 12:21

Название: Вывести значение до и после знака
Отправлено: Yura от 03.02.2015, 12:21
Добрый день. Долго искал формулу, но так и не нашел. Есть csv файл, в нем все данные идут в одном столбце, но разделение идет не через ";", а через "/". Вот пример: РТ-00000137/CAFA FRANCE ОЧКИ ПОЛЯР МУЖСК/КОРИЧН ЛИНЗА/С12931/1 096.6. Мне нужно разделить на три столбца: ариткул, наименование, цена. Так как в наименовании встречаются тоже "/" стандартными функциями у меня не получилось что-что путное сделать. Подскажите как разделить на три столбца?!
Модератор
Вы на всех форумах правилам не будете следовать?
Забанить вас, что ли?
Название: Re: Вывести значение до и после знака. Срочная помощь!
Отправлено: gling от 03.02.2015, 19:53
Возможно наименование можно выбрать по количеству знаков. Был бы пример, можно было бы попробовать найти вариант. А коли нет примера, удачи Вам.
Название: Re: Вывести значение до и после знака. Срочная помощь!
Отправлено: nemo3001 от 06.02.2015, 22:35
Решение:
1. загрузить в столбец A все строки из csv файла: артикул/наименование/цена
2. для каждой строки определить позиции в строке для первого слева знака "/" (в столбец B) и первого справа знака "/" (в столбец C).
     Для этого например в ячейку B1 нужно записать формулу =ПОИСК("/";A1)
     А в ячейку C1 я бы записал формулу с моей пользовательской функцией ПоискСправа (см. ее текст ниже в решении): =ПоискСправа("/";A1) Функция ПоискСправа возвращает номер позиции символа справа в строке. Пользуюсь всегда ею, так как пока не нашел ее аналога во встроенных функциях Excel, кто знает способ проще - подскажите. Пользовательскую функцию ПоискСправа нужно будет вставить в текущую книгу Excel на лист макросов (Alt+F11, на своей книге нажать правой кнопкой мыши, Insert - Module)
3. для каждой строки в столбцы D, E, F выделить подстроки артикул, наименование, цена из столбца A, используя стандартные функции Excel и числа из столбцов B и C:
     Например для 1 строки: в D1 =ЛЕВСИМВ(A1;B1-1) в E1 =ПСТР(A1;B1+1;C1-B1-1) в F1 =ПРАВСИМВ(A1;ДЛСТР(A1)-C1)
     Конечно, формулы из столбцов B и C можно сразу вставить в формулы столбцов D, E, F. Я здесь записал их отдельно в столбцы B и C  просто для наглядности.
     Пример - во вложенном файле.
Public Function ПоискСправа(Poisk As String, BigStr As String) As Long
  'возвращает номер позиции символа справа в строке
  Dim pos As Long, i As Long, lP As Long, lB As Long
  pos = 0
  lP = Len(Poisk)
  lB = Len(BigStr)
  If lP <= lB Then
    For i = lB - lP + 1 To 1 Step -1
      If Mid(BigStr, i, lP) = Poisk Then
        pos = i
        Exit For
      End If
    Next
  End If
  ПоискСправа = pos
End Function

для оформления кода есть соответствующая кнопка [МОДЕРАТОР]
Название: Re: Вывести значение до и после знака
Отправлено: IKor от 13.02.2015, 15:40
Можно воспользоваться стандартным инструментом экселя "Текст-по-Столбцам" (меню Данные)
Название: Re: Вывести значение до и после знака
Отправлено: zs от 13.02.2015, 21:56
=ЗАМЕНИТЬ(A1;ПОИСК("/";A1);100;"") это B2
=ЗАМЕНИТЬ(A1;1;ПОИСК("/";A1;ПОИСК("/";A1)+1);"")
=ЗАМЕНИТЬ(ЗАМЕНИТЬ(A1;1;ДЛСТР(B2)+1;"");ПОИСК("/";ЗАМЕНИТЬ(A1;1;ДЛСТР(B2)+1;""));100;"")
Название: Re: Вывести значение до и после знака
Отправлено: nemo3001 от 14.02.2015, 04:36
Цитата: IKor от 13.02.2015, 15:40
Можно воспользоваться стандартным инструментом экселя "Текст-по-Столбцам" (меню Данные)
В том-то здесь и проблема, что для строк вида "РТ-00000137/CAFA FRANCE ОЧКИ ПОЛЯР МУЖСК/КОРИЧН ЛИНЗА/С12931/1 096.6", которые нужно разделить на три столбца: ариткул, наименование и цена, инструмент "Текст-по-Столбцам" создаст в общем случае больше трех столбцов: в приведенном примере строки будет создано 5 столбцов, поле "Наименование" разделится на 3 столбца, хотя его делить по столбцам конечно не надо. В общем случае в строках файла могут оказаться наименования, содержащие 1 или несколько символов "/", или вообще не содержащие этого символа. Именно поэтому приходится аккуратно отделять от исходной строки артикул слева, цену справа, а среднюю часть, наименование, не обрабатывать и не делить по столбцам.

Цитата: zs от 13.02.2015, 21:56
=ЗАМЕНИТЬ(A1;ПОИСК("/";A1);100;"") это B2
=ЗАМЕНИТЬ(A1;1;ПОИСК("/";A1;ПОИСК("/";A1)+1);"")
=ЗАМЕНИТЬ(ЗАМЕНИТЬ(A1;1;ДЛСТР(B2)+1;"");ПОИСК("/";ЗАМЕНИТЬ(A1;1;ДЛСТР(B2)+1;""));100;"")
Если в исходных строках поле "наименование" будет всегда обязательно иметь 2 символа "/", как в исходном примере, то конечно можно использовать приведенные формулы. Однако, обычно в наименованиях товаров символ "/" может встречаться 1 или несколько раз, или вообще не встречаться, а значит такие формулы будут в общем случае делить исходную строку на части неверно.