Как извлечь имя файла из полного пути в листах excel

Мне нужно извлечь имена файлов столбца B, например извлечь pm5a1tktzlrzzgno2r5l.png из v1448360146/pm5a1tktzlrzzgno2r5l.png и сравнить этот результат со значением в столбце A.

image shown here

Ваш вопрос непонятен. Если вы ожидаете, что другие будут тратить свое время на то, чтобы помочь вам, вам следует потратить 5–10 минут на форматирование своего вопроса.

Tim Biegeleisen 26.10.2018 09:16

Возможный дубликат Как извлечь имя файла из пути?

Pᴇʜ 26.10.2018 09:18
1
2
220
3

Ответы 3

Разделите имя файла и расширение, затем найдите совпадение в столбце A.

sub huh()

    dim m as variant, str as string, i as long

    with worksheets("sheet1")
        for i = 1 to .cells(.rows.count, "B").ens(xlup).row
            str = split(.cells(i, "B").value2, chr(47))(ubound(split(.cells(i, "B").value2, chr(47))))
            m = application.match(str, .range("A:A"), 0)
            if not iserror(m) then
                'm is the row number in column A of the matching filename
                debug.print .cells(m, "A").value
                'do something with it
            end if
        next i
    end with

end sub

Подсказка: OP также использует простые разделители косой черты для URL-адресов - chr(47)

T.M. 26.10.2018 10:52

Спасибо, что поймал @ T.M.

user4039065 26.10.2018 10:57

Измените имя листа, установите правильный диапазон и попробуйте:

Sub Test()

Dim Lr As Long
Dim Position As Long
Dim str As String
Dim i As Long

With Sheets("Sheet1") '<= Change SheetName if needed
    Lr = .Cells(.Rows.Count, "A").End(xlUp).Row

    For i = 1 To Lr
        Position = InStrRev(.Cells(i, "B").Value, "/") + 1
        str = Mid(.Cells(i, "B").Value, Position, ((Len(.Cells(i, "B").Value)) - (Position - 1)))
        If str = .Cells(i, "A").Value Then
            MsgBox "Same!"
        End If
    Next i
End With

End Sub

@Jeeped, спасибо за руководство. Я отредактировал код!

Error 1004 26.10.2018 11:00

Откройте файл Excel, нажмите Alt + F10 (или запустите VBEditor с панели) и создайте новый модуль (Вставить> Новый модуль). В новый модуль поместите этот код:

Sub extractFileNames()
Dim rng As Range

'Set your own input range with A and B columns and worksheet name here.
Set rng = ThisWorkbook.Worksheets("Your_worksheet_name").Range("A1:B1000")

Dim arr As Variant
arr = rng.Value2  

For i = 1 To UBound(arr)
    Dim tmp() As String
    tmp = Split(arr(i, 2), "/")
    arr(i, 1) = tmp(UBound(tmp))      
Next i
rng.Value2 = arr 
End Sub

Вы можете запустить этот макрос любым поддерживаемым способом (см. ссылку, если не знаете как).

Кроме того, если вы не хотите использовать макросы в своем файле, вы можете попробовать использовать такие функции, как = ВПРАВО ($ B2; LEN ($ B2) - НАЙТИ ("/", $ B2)), но это не поможет, если у вас слишком много путей или у них другое количество разделителей.

Когда массив берется из такого диапазона, по умолчанию он начинается с 1. И когда массив создается в VBA, он по умолчанию основан на 0. Но чтобы избежать проблем с Option Base, в таком случае лучше использовать функции LBound () и UBound ().

Irregular Expression 26.10.2018 11:19

Виноват! Конечно, это двухмерный массив с одним основанием. Думаю, UBound (arr) вместо UBound (arr, 1) заставил меня задуматься о другом.

user4039065 26.10.2018 11:20

UBound (arr) и UBound (arr, 1) одинаковы для 2D-массива, потому что номер измерения является необязательным и по умолчанию равен 1.

Irregular Expression 26.10.2018 11:32

Другие вопросы по теме