2012-11-21 19 views
8

Próbuję napisać makro programu Excel (2010), które w pewnym momencie musiałoby potwierdzić istnienie określonego pliku (doc/pdf) w korporacyjnej witrynie programu SharePoint. Plik jest dostępny przez Internet Explorer (wszystkie prawa są przyznawane użytkownikowi). Mam bezpośredni link do tego pliku. Nie muszę go otwierać, po prostu sprawdź, czy tam jest.Czy można sprawdzić za pomocą VBA, czy plik istnieje w witrynie programu SharePoint?

Jeśli był to plik lokalny, użyłbym polecenia Dir() w celu sprawdzenia, czy plik istnieje. Nie działa to jednak w przypadku identyfikatorów URI.

Próbowałem metody opartej na GET za pośrednictwem obiektu objHttp, ale jedyną odpowiedzią, którą otrzymałem, jest strona błędu stwierdzająca, że ​​"Nie mam uprawnień do wyświetlania tej strony" [w tagu].

Czy jest to w jakikolwiek sposób możliwe?

+1

Czy link jest dostępny bezpośrednio? tj. bez logowania/zapisanego logowania w przeglądarce? –

Odpowiedz

2

Daj to strzał:

Function checkFile(URLStr As String) As Boolean 
    Dim oHttpRequest As Object 
    Set oHttpRequest = New MSXML2.XMLHTTP60 
    With oHttpRequest 
     .Open "GET", URLStr, False, [Username], [Password] 
     .setRequestHeader "Cache-Control", "no-cache" 
     .setRequestHeader "Pragma", "no-cache" 
     .setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT" 
     .send 
    End With 
    If oHttpRequest.Status = 200 Then 
     checkFile = True 
    Else 
     checkFile = False 
    End If 
End Function 

URLStr powinno być coś jak "http: //sharepoint/site/user.xlsx". Wprowadź swoją nazwę użytkownika/hasło w linii .Open, aby przekazać je do witryny, a to powinno działać dla dowolnego identyfikatora URI (testowałem go na przykład na plikach .xlsx). Powinienem zauważyć, że na moich wewnętrznych witrynach SharePoint, nie muszę przekazywać UN/PW, aby uruchomić tę funkcję, więc jeśli tak się stanie, po prostu usuń te parametry z połączenia .Open. Ponadto wszystkie nagłówki prawdopodobnie nie są potrzebne, ale zawsze mam je w swoich żądaniach, więc zostawiłem je.

+0

Wielkie dzięki. Wygląda na to, że działa całkiem dobrze! – Kuba

0

Nie wiem, czy to może ci pomóc, czy nie? Ale dzielę się z tobą moimi myślami. Możesz użyć do tego celu żądania http. jak podano poniżej przykład:

public void CheckWebFileExist() 

{ 

try 

{ 

    WebClient client = new WebClient(); 

    client.Credentials = CredentialCache.DefaultCredentials; 



    // Create a request for the URL.   

    WebRequest request = WebRequest.Create("myAddress"); 



    // If required by the server, set the credentials. 

    request.Credentials = CredentialCache.DefaultCredentials; 



    // Get the response. 

    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 



    //check response status 

    if (string.Compare(response.StatusDescription, "OK", true) == 0) 

    { 

     //URL exists so that means file exists 

    } 

    else 

    { 

     //URL does not exist so that means file does not exist 

    }  
} 
catch (Exception error) 

{ 

    //error catching 

} 
} 

Daj mi znać, czy to ci pomoże, czy nie?

+1

To nie przypomina mi kodu VBA. Czy możesz to wyjaśnić? – Kuba

+0

to kod C#, możesz mieć pojęcie o logice lub przekonwertować ją. – SigarDave

+0

Próbowałem tego. Wyglądało to obiecująco, ponieważ WebClient() jest dostępny w C++/C# i VB (w .NET). Ale najwyraźniej nie jest to rozpoznawane w VB dla aplikacji. Dzięki i tak za twój wkład. – Kuba

Powiązane problemy