Извлечение файлов из URL-адреса, разделив строку


Я используется для доступа к элементам массива, возвращаемого Split функция, напрямую. Это лень, я знаю. Обычно, я знаю, что элемент я хочу и я сказать что-то вроде:

Debug.Print Split(href, "/")(0)

Вопросы:

1) я могу сделать что-то подобное для доступа к метод ubound массива возвращается?

2) Что такое "лучшие практики" способ делать вещи, и почему?

Код:

Я написал следующее, Но это выглядит неаккуратно.

Sub Testing()

    Dim href As String
    Dim fileName As String

    href = "https://www.england.nhs.uk/statistics/wp-content/uploads/sites/2/2018/01/20180111-AmbSYS-post-ARP-month-of-December-2017v2.xlsx"

    fileName = Trim$(Split(href, "/")(UBound(Split(href, "/"))))

End Sub

Я видела из вот , что я могу также сделать:

Debug.Print Split(href, "/")(Len(href) - Len(Replace(href, "/", "")))

Опять же, сумбурно.

Я знаю, что я могу присвоить переменной массива и метод ubound этак. Он выглядит опрятнее, но по сути то же самое, т. е.

Dim myArr() As String

myArr() = Split(href, "/")
fileName = myArr(UBound(myArr)) 


144
1
задан 25 января 2018 в 03:01 Источник Поделиться
Комментарии
2 ответа

Реферат внедрение в функцию. Это делает его легко поймать ошибки, если вы хотите использовать эту возможность в более чем одном месте. GetUpperBoundElemenentFromDelimitedString принимает необходимые аргументы вы даете ему и возвращает UBound результат. Имя может быть громоздким, но печатать getup и нажмите Ctrl+J-это список свойств/методов, то же собираемся редактировать и выбрав нужный параметр.

Public Function GetUpperBoundElemenentFromDelimitedString(ByVal inputValue As String, ByVal delimiter As String, Optional ByVal compare As VbCompareMethod = VbCompareMethod.vbTextCompare) As String
Dim temp As Variant
temp = Split(inputValue, delimiter, compare:=compare)
GetUpperBoundElemenentFromDelimitedString = temp(UBound(temp))
End Function

Теперь, когда вы используете это название, можно сразу же знать, что происходит.

Public Sub Foo()
Dim bar As String
bar = "This,is,going,to,return,an,element,at,a,specific,position."
Debug.Print GetUpperBoundElemenentFromDelimitedString(bar, ",")
End Sub

То же самое может быть сделано по конкретной позиции

Public Function GetArrayElemenentFromDelimitedString(ByVal inputValue As String, ByVal delimiter As String, ByVal zeroBasedPosition As Long, Optional ByVal compare As VbCompareMethod = VbCompareMethod.vbTextCompare) As String
GetArrayElemenentFromDelimitedString = Split(inputValue, delimiter, compare:=compare)(zeroBasedPosition)
End Function

5
ответ дан 25 января 2018 в 05:01 Источник Поделиться

Если вам нужно использовать массив, то это лучшая практика.

Dim FileName As String, myArr() As String
myArr() = Split(href, "/")
FileName = myArr(UBound(myArr))

Вот несколько способов вернуть подстроку после последнего разделителя и время, необходимое для выполнения каждого 1 млн раз:

FileName = Right(href, Len(href) - InStrRev(href, "/")) ' 1.25 seconds
FileName = Mid(href, InStrRev(href, "/") + 1) ' 1.29 seconds
FileName = Split(href, "/")(UBound(Split(href, "/"))) '8.93 seconds
myArr() = Split(href, "/"):FileName = myArr(UBound(myArr)) ' 8.71 seconds
FileName = Split(href, "/")(Len(href) - Len(Replace(href, "/", "")))' 9.1 seconds

Обратите внимание, что InstrRev почти в 7 раз быстрее, чем при использовании Сплит методов.

2
ответ дан 25 января 2018 в 07:01 Источник Поделиться