6

Я программист с большим количеством языков, но почему-то я никогда не изучал макрос Excel или язык формул. Я уверен, что должен быть простой способ сделать это, но я в тупике.

У меня есть столбец имен файлов, которые выглядят так:

/home/www/shoppermarketexpo/dot/uploads/10DOT_33A_1275_1308304857_1.jpg
/home/www/shoppermarketexpo/dot/uploads/10DOT_15G_1184_1.jpg
/home/www/shoppermarketexpo/dot/uploads/10DOT_5A_1450_1.jpg
/home/www/shoppermarketexpo/dot/uploads/10DOT_18A_1341_1308325044_2.jpg

Что мне нужно сделать, это вернуть только имя файла, разделенное на несколько частей на основе подчеркивания. Я в порядке, если для этого нужно выполнить несколько шагов - т.е. формула 1 возвращает столбец с 10DOT_33A_1275_1308304857 , тогда формула 2 использует этот результат для возврата второго столбца с 10DOT_33A_1275 и так далее. Я надеялся, что будет функция, похожая на разнесение в PHP, где вы можете взять строку и вернуть массив на основе разделителя (в данном случае подчеркивание). Я предполагаю, что это невозможно в формуле; Я бы согласился с VBA, хотя я на Mac и не знаю, доступен ли он мне.

Я знаю о MID, LEFT и RIGHT, но все они зависят от того, знаете ли вы, сколько символов вы хотите вернуть, а в этом случае я не знаю. Это изменяется от ряда к ряду; единственный критерий, который работает, - это разделение имени файла на несколько столбцов в подчеркиваниях.

Это возможно?

5 ответов5

6

А вот решение на основе VBA. Обратите внимание, что обход таких ячеек не очень эффективен. Если у вас много строк (скажем, несколько десятков), есть лучшие способы

Выберите диапазон, который вы хотите обработать и запустите

Sub SplitText()
    Dim rng As Range, rw As Range
    Dim cl As Range
    Dim i As Long, j As Long, k As Long
    Dim str As String

    If Not TypeName(Selection) = "Range" Then Exit Sub

    Set rng = Selection
    For Each rw In rng.Rows
        str = rw.Cells(1, 1)
        str = Mid(str, InStrRev(str, "/") + 1)
        str = Left(str, InStr(str, "."))
        j = InStr(str, "_")
        k = 2
        Do While j > 0
            rw.Cells(1, k) = Left(str, j - 1)
            str = Mid(str, j + 1)
            j = InStr(str, "_")
            k = k + 1
        Loop
        rw.Cells(1, k) = str
    Next
End Sub
4

Вот решение на основе формул:

Предполагая, что данные находятся в столбце A, начиная с строки 2
и максимум 5 штук должны быть возвращены (могут быть скорректированы, чтобы справиться с большим количеством)
и что строки не содержат | или @ (если они есть, используйте другие символы)

Ячейка B2, получает имя файла =RIGHT(A2,LEN(A2)-FIND("|",SUBSTITUTE(A2,"/","|",LEN(A2)-LEN(SUBSTITUTE(A2,"/","")))))

Ячейка С2, удаляет .extension
=LEFT(B2,FIND(".",B2)-1)

Ячейки D2:H2 как формула массива, заключенные в скобки последовательные члены с | а также @
=SUBSTITUTE(SUBSTITUTE("_"&C2&"_","_","|",{1,2,3,4,5}),"_","@",{1,2,3,4,5})

Ячейка I2, а затем скопировать I2 в J2:L2: результат
=IFERROR(MID(D2,FIND("|",D2)+1,FIND("@",D2)-FIND("|",D2)-1),"")

4

Вы можете использовать функцию Excel для преобразования текста в столбцы в меню «Данные».

Это займет несколько проходов, но вы можете сделать это без формулы или VBA.

Вы можете указать свои собственные разделители. Так что вы можете выбрать . отделить расширение, затем / разделить структуру каталогов. Затем вы можете выбрать _ чтобы разделить имя файла.

Мастер преобразования текста в столбцы

Nb Можно установить для разных столбцов значение « Text чтобы Excel не воспринимал их как числа, или для других столбцов значение « Do not import (skip) чтобы они были удалены.

2

В VBA есть функция Split, которая поможет вам с вашим планом, но нет формулы SPLIT.

Однако вместо этого я предлагаю использовать формулу Excel. Пара случаев:

  1. Если путь к файлу одинаков для каждого файла, просто используйте RIGHT вместе с LEN и FIND, например так:

    = ПРАВЫЙ (А1, LEN (A1) -Найти ("загрузки /", А1) -LEN ("добавления /")+1)

    где A1 - это ячейка с путем к файлу.

  2. Если у всех файлов нет одинакового пути, то вам нужно пойти другим путем. Может быть, все файлы .jpg (?) или не имеют периодов, кроме как перед расширением файла.

2

Поскольку пока нет выбранного ответа, я дам вам другой вариант VBA, но на этот раз с функцией разделения.

    Option Explicit

Sub SplittySplit()

Dim fileLocCell As Range
Dim fileName As String
Dim fileNameBeginsAt As Integer

Dim fileNameSubParts() As String
Dim fileNameExtensionLoc As Integer

Dim rng As Range
Set rng = Selection 'or some more specific rnage
    For Each rw In rng.Rows
        Set fileLocCell = Cells(7, 4)
        fileNameBeginsAt = InStrRev(fileLocCell.Text, "/")
        fileName = Right(fileLocCell, (Len(fileLocCell.Text) - fileNameBeginsAt))
        'if you don't want the ".jpg" at the end or whatever the extension maybe***
        fileNameExtensionLoc = InStrRev(fileName, ".")
        '***
        fileName = Left(fileName, fileNameExtensionLoc - 1)
        fileNameSubParts = Split(fileName, "_") 'an array indexed at 0

        'do whatever you want with the array
        Dim i As Integer
        For i = 0 To UBound(fileNameSubParts)
            Cells(i + 1, 1) = fileNameSubParts(i)
        Next i
    Next rw

End Sub

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .