2013-03-26 5 views
3

Есть ли какой-либо SQL-эквивалент знака «%» в VBA? Мне нужно вернуть несколько файлов только с некоторыми символами посередине.SQL "%" эквивалент в VBA

Помогите действительно оценить!

Например, вот мой код: Мне нужно загрузить весь файл с именем 2013 с этой веб-страницы и сохранить и называть их по-разному. Возможна ли эта миссия?

Sub Sample() 
    Dim strURL As String 
    Dim strPath As String 
    Dim i As Integer 

    strURL = "http://cetatenie.just.ro/wp-content/uploads/Ordin-********.2013.pdf" 

    strPath = "C:\Documents and Settings\ee28118\Desktop\178.pdf" 

    Ret = URLDownloadToFile(0, strURL, strPath, 0, 0) 

    If Ret = 0 Then 
     MsgBox "File successfully downloaded" 
    Else 
     MsgBox "Unable to download the file" 
    End If 
End Sub 

ответ

2

Когда вы переходите к папке uploads, вы получаете список каталогов всех файлов в нем. Вы можете перебирать гиперссылки в этом листинге и тестировать каждый, чтобы увидеть, соответствует ли он вашему критерию и, если да, загрузите его. Вам нужна ссылка на MSXML и MSHTML. Вот пример.

Sub Sample() 

    Dim sUrl As String 
    Dim xHttp As MSXML2.XMLHTTP 
    Dim hDoc As MSHTML.HTMLDocument 
    Dim hAnchor As MSHTML.HTMLAnchorElement 
    Dim Ret As Long 
    Dim sPath As String 
    Dim i As Long 

    sPath = "C:\Documents and Settings\ee28118\Desktop\" 
    sUrl = "http://cetatenie.just.ro/wp-content/uploads/" 

    'Get the directory listing 
    Set xHttp = New MSXML2.XMLHTTP 
    xHttp.Open "GET", sUrl 
    xHttp.send 

    'Wait for the page to load 
    Do Until xHttp.readyState = 4 
     DoEvents 
    Loop 

    'Put the page in an HTML document 
    Set hDoc = New MSHTML.HTMLDocument 
    hDoc.body.innerHTML = xHttp.responseText 

    'Loop through the hyperlinks on the directory listing 
    For i = 0 To hDoc.getElementsByTagName("a").Length - 1 
     Set hAnchor = hDoc.getElementsByTagName("a").Item(i) 

     'test the pathname to see if it matches your pattern 
     If hAnchor.pathname Like "Ordin-*.2013.pdf" Then 
      Ret = UrlDownloadToFile(0, sUrl & hAnchor.pathname, sPath, 0, 0) 

      If Ret = 0 Then 
       Debug.Print sUrl & hAnchor.pathname & " downloaded to " & sPath 
      Else 
       Debug.Print sUrl & hAnchor.pathname & " not downloaded" 
      End If 
     End If 
    Next i 

End Sub 

Редактировать

Я предположил, что URLDownloadToFile была уже написана. Я не писал один, я просто использовал функцию ниже, чтобы протестировать код, который выполняет итерацию через файлы. Вы можете использовать его, чтобы убедиться, что приведенный выше код работает для вас, но вам нужно будет написать фактический код для загрузки файла в конце концов. Со всеми аргументами в URLDownloadToFile я удивлен, что он уже не существует.

Function UrlDownloadToFile(lNum As Long, sUrl As String, sPath As String, lNum1 As Long, lNum2 As Long) As Long 

    UrlDownloadToFile = 0 

End Function 
+0

Спасибо, но я очень начинаю на этом, могу ли я попросить намек на ссылку MSXML и MSHTML? Что мне делать? Спасибо! – maximladus

+0

OK Я думаю, мне удалось установить оба из них, но потом я получаю сообщение об ошибке: «Sub или Function not defined» выделяет (URLDownloadToFile) и имя Macro ... любые предложения? – maximladus

+0

URLDownloadToFile получен из вашего кода. Я предположил, что у вас есть способ загрузки файла с учетом URL-адреса, и что вы создали функцию URLDownloadToFile, чтобы сделать это. На данный момент добавьте функцию с этим именем (см. Раздел edit to my answer), а затем, если вы не знаете, как загрузить файл через vba, запустите новый вопрос. –

6

Вы можете использовать Оператор Like.

Символы в шаблоне соответствует в строке

? Any single character. 
* Zero or more characters. 
# Any single digit (0–9). 
[charlist] Any single character in charlist. 
[!charlist] Any single character not in charlist 

Пример:

Dim MyCheck 
MyCheck = "aBBBa" Like "a*a" ' Returns True. 
MyCheck = "F" Like "[A-Z]" ' Returns True. 
MyCheck = "F" Like "[!A-Z]" ' Returns False. 
MyCheck = "a2a" Like "a#a" ' Returns True. 
MyCheck = "aM5b" Like "a[L-P]#[!c-e]" ' Returns True. 
MyCheck = "BAT123khg" Like "B?T*" ' Returns True. 
MyCheck = "CAT123khg" Like "B?T*" ' Returns False. 
+0

Могу ли я использовать его для загрузки большего количества файлов с веб-страницы с использованием этого подхода, который имеет только дату, которая отличается от их имени? – maximladus

+0

ie strURL = "http://cetatenie.just.ro/wp-content/uploads/Ordin-********.2013.pdf" – maximladus

+0

сомнительно, я не знаю, можете ли вы сделать подстановочный знак поиск файлов на FTP-сервере? –

1

в VBA использовать LIKE функцию с символами подстановки:

Ниже приведен пример (копируется из Ozgrid Forums)

Dim sht As Worksheet 
For Each sht In ActiveWorkbook.Worksheets 
    If sht.Name Like "FRI*" Then 
     'Add code for Friday sheets 
    Else 
     If sht.Name Like "MON*" Then 
      'Add code for Monday sheets 
     End If 
    End If 
Next 

Символ умножения * заменяет ноль или более символов, тогда как ? занимает 1 место, а # занимает 1-е место. Есть еще более специфический символ. если вы хотите только сопоставить определенные символы.

так что вы идете!

Кроме того, вы можете взглянуть на Ozgrid Forums: Using Regular Expressions in VBA

Чтобы получить список файлов на сервере, читать на FTP (с помощью DIR) в Mr Excel - List files using FTP

+0

Возможно, у вас также есть подсказка по коду, который я добавил выше. Спасибо! – maximladus

+0

Я сомневаюсь, что это сработает, вам нужно использовать свои подстановочные знаки для поиска всех доступных файлов на сервере/FTP-сервере, а затем пропустить их дозагрузку каждый –

+0

Я отредактировал эту ссылку, чтобы добавить другую ссылку для ваших исследований –

2

Попробуйте ниже код: Булева функция будет return true, если строка имеет строку в ней.

Sub Sample() 
    Dim result As Boolean 
    result = has2013("http://cetatenie.just.ro/wp-content/uploads/Ordin-********.2013.pdf") 
    Debug.Print result 
    result = has2013("http://cetatenie.just.ro/wp-content/uploads/Ordin-********.2014.pdf") 
    Debug.Print result 
End Sub 

Function has2013(lnk As String) As Boolean 
    has2013 = lnk Like "*2013*" 
End Function 
+0

@ user2145136 Пожалуйста, проверьте это код. – 2013-03-26 10:58:47