2013-07-02 21 views
6

Otrzymuję następujący błąd.Błąd 2013 programu Excel 2013

Compile error: The code in this project must be updated for use on 64-bit systems. 

kodu VBA

Option Explicit 

Private Declare Function URLDownloadToFile Lib "urlmon" _ 
Alias "URLDownloadToFileA" (ByVal pCaller As Long, _ 
ByVal szURL As String, ByVal szFileName As String, _ 
ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long 

Dim Ret As Long 

'~~> This is where the images will be saved. Change as applicable 
Const FolderName As String = "C:\Temp\" 

To działa prawidłowo w programie Excel 2010.

dzięki.

EDIT

błąd jest Ret Variable Not defined. Oto reszta kodu.

Sub Sample() 
    Dim ws As Worksheet 
    Dim LastRow As Long, i As Long 
    Dim strPath As String 

    '~~> Name of the sheet which has the list 
    Set ws = Sheets("Sheet1") 

    LastRow = ws.Range("A" & Rows.Count).End(xlUp).Row 

    For i = 2 To LastRow '<~~ 2 because row 1 has headers 
     strPath = FolderName & ws.Range("A" & i).Value & ".mp3" 

     Ret = URLDownloadToFile(0, ws.Range("B" & i).Value, strPath, 0, 0) 

     If Ret = 0 Then 
      ws.Range("C" & i).Value = "File successfully downloaded" 
     Else 
      ws.Range("C" & i).Value = "Unable to download the file" 
     End If 
    Next i 
End Sub 

Odpowiedz

9

Musisz uruchomić to na 64-bitowej wersji pakietu Office, podczas gdy poprzednio korzystałeś z wersji 32-bitowej.

Aby przekonwertować 32Bit wzywa do 64bit generalnie trzeba dodać PtrSafe do funkcji i konwersji niektórych typów danych z Long do LongPtr (co jest jedynie większy typ danych (patrz: http://msdn.microsoft.com/en-us/library/office/gg251378.aspx)

więc funkcja przerobiona będzie:

Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" _ 
    Alias "URLDownloadToFileA" _ 
    (ByRef pCaller As LongPtr, _ 
    ByVal szURL As String, _ 
    ByVal szFileName As String, _ 
    ByVal dwReserve As Long, _ 
    ByRef lpfnCB As LongPtr) _ 
As LongPtr 

Edycja: Uwaga, jeśli chcesz, aby móc korzystać z tego na obu wersjach 64bit i 32bit Office trzeba użyć preprocesor If więc Urząd wie, które funkcjonują w użyciu tj.

#If Win64 Then 
    Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon"....... 
#Else 
    Private Declare Function URLDownloadToFile Lib "urlmon"....... 
#End If 
+0

Dziękuję bardzo, ale powinienem też dodać resztę kodu. Błąd, który otrzymywałam wcześniej, był poprawny, ale dostaję błąd, że zmienna "Ret" nie jest zdefiniowana. – Mowgli

+1

Brak problemów. Musisz również przekonwertować zmienną 'Ret' z' Long' na 'LongPtr', ponieważ jest to nowy typ zwracany dla funkcji. (jeśli jest to zmienna globalna, użyj 'Public' (lub' Private' tylko dla tego modułu) zamiast 'Dim') – CuberChase

+0

Cześć, przepraszam, że właśnie dostałem czas. ale próbowałem dodać LongPtr i próbowałem Public, ale nie działało. co powinienem zrobić? dzięki – Mowgli

2

MSDN reference

Kompletny komunikat o błędzie: Kod w tym projekcie muszą być aktualizowane na stosowania w systemach 64-bitowych. Przejrzyj i zaktualizuj oświadczenia Deklaracji oraz , a następnie zaznacz je atrybutem PtrSafe. Wszystkie oświadczenia Deklaracji muszą zawierają teraz słowo kluczowe PtrSafe podczas pracy w 64-bitowych wersjach pakietu Office . Słowo kluczowe PtrSafe wskazuje, że instrukcja Deklaracja jest bezpieczna w 64-bitowych wersjach pakietu Microsoft Office. Dodanie słowa kluczowego PtrSafe do instrukcji Declare oznacza, że ​​oświadczenie Declare jawnie jest kierowane na 64-bitowe, wszystkie typy danych w ramach instrukcji, które muszą przechowywać 64-bitowe (w tym wartości zwracane i parametry), muszą być nadal modyfikowane, aby zachowały 64 -bitowe wielkości za pomocą całek 64-bitowych LongLong dla całek lub LongPtr dla wskaźników i uchwytów.

Dodaj słowo kluczowe PtrSafe.