2012-11-21 20 views
8

Tôi đang cố gắng viết một macro Excel (2010) mà tại một số điểm sẽ phải xác nhận sự tồn tại của một tệp nhất định (doc/pdf) trên một trang chia sẻ công ty. Tệp có thể truy cập được qua Internet Explorer (tất cả các quyền được cấp cho người dùng). Tôi có liên kết trực tiếp đến tệp đó. Tôi không cần mở nó, chỉ cần kiểm tra xem nó có ở đó không.Có thể kiểm tra qua VBA nếu tệp tồn tại trên một trang chia sẻ không?

Nếu đây là tệp cục bộ, tôi sẽ sử dụng lệnh Dir() để kiểm tra xem tệp có tồn tại hay không. Tuy nhiên, điều này sẽ không hoạt động với URI.

Tôi đã thử một phương pháp dựa trên GET qua objHttp nhưng phản hồi duy nhất tôi nhận được là một wepage nói rằng "Tôi không được phép xem trang này" [trong thẻ].

Điều này có thể thực hiện được theo bất kỳ cách nào không?

+1

Liên kết bạn có thể truy cập trực tiếp? tức là không có đăng nhập/đăng nhập đã lưu trong trình duyệt? –

Trả lời

2

này cung cấp cho một shot:

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 nên một cái gì đó giống như "http: //sharepoint/site/user.xlsx". Nhập Tên đăng nhập/Mật khẩu của bạn vào dòng .Open để chuyển chúng vào trang web và điều này sẽ hoạt động đối với bất kỳ URI nào (ví dụ: tôi đã thử nghiệm nó với các tệp .xlsx). Tôi nên chỉ ra rằng trên các trang web SharePoint nội bộ của tôi, tôi không cần phải vượt qua UN/PW để chạy chức năng này, vì vậy nếu điều đó kết thúc là trường hợp cho bạn, chỉ cần loại bỏ các tham số đó khỏi cuộc gọi .Open. Ngoài ra, tất cả các tiêu đề có lẽ không cần thiết, nhưng tôi luôn luôn có chúng trong yêu cầu của tôi vì vậy tôi để chúng trong.

+0

Cảm ơn rất nhiều. Có vẻ như nó hoạt động khá tốt! – Kuba

0

Tôi không biết điều này có thể giúp bạn hay không? Nhưng tôi đang chia sẻ suy nghĩ của tôi với bạn. Bạn có thể sử dụng yêu cầu web http cho điều đó. như được đưa ra dưới đây ví dụ:

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 

} 
} 

Hãy cho tôi biết nếu điều này có giúp ích cho bạn hay không?

+1

Mã này không giống mã VBA cho tôi. Bạn có thể làm rõ điều đó không? – Kuba

+0

đó là mã C#, bạn có thể có ý tưởng về logic hoặc chuyển đổi nó. – SigarDave

+0

Tôi đã thử điều đó. Nó trông đầy hứa hẹn vì WebClient() có sẵn trong C++/C# và VB (trong .NET). Nhưng dường như nó không được công nhận trong VB cho các ứng dụng. Cảm ơn bạn vì sự đóng góp của bạn. – Kuba