2013-07-02 18 views
6

Viene visualizzato l'errore seguente.Errore VBA di Excel 2013

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

codice 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\" 

Funziona bene in Excel 2010.

Grazie.

EDIT

errore che ottengo è Ret Variable Not defined. Ecco il resto del codice.

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 

risposta

9

È necessario eseguire questa operazione su una versione a 64 bit di Office mentre in precedenza si utilizzava una versione a 32 bit.

Per convertire 32Bit chiama a 64bit si deve generalmente aggiungere PtrSafe alla funzione e convertire alcuni dei tipi di dati da Long a LongPtr (che è solo un tipo di dati più grande (vedi: http://msdn.microsoft.com/en-us/library/office/gg251378.aspx)

Quindi la funzione convertito sarebbe:

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 

Edit: Nota se si vuole essere in grado di utilizzare questo su entrambe le versioni a 64 bit e 32 bit di Office è necessario utilizzare un preprocessore If così Ufficio sa quale funzione utilizzare Ie:.

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

Grazie mille, ma avrei dovuto aggiungere anche il resto del codice. L'errore che stavo ottenendo era una correzione, ma ricevo un errore che la variabile 'Ret' non definisce. – Mowgli

+1

Nessun problema. Devi anche convertire la variabile 'Ret' da' Long' a 'LongPtr' in quanto questo è il nuovo tipo di ritorno per la funzione. (se si tratta di una variabile globale, utilizzare 'Pubblico' (o' Privato' solo per quel modulo) invece di 'Dim') – CuberChase

+0

Ciao, scusa se ho appena avuto il tempo. ma ho provato ad aggiungere LongPtr e ho anche provato Public ma non ha funzionato. cosa dovrei fare? grazie – Mowgli

2

MSDN reference

messaggio di errore completo: Il codice in questo progetto deve essere aggiornata per l'utilizzo su sistemi a 64 bit. Rivedi e aggiorna le dichiarazioni Declare e quindi contrassegnali con l'attributo PtrSafe. Tutte le dichiarazioni dichiarate devono includere ora la parola chiave PtrSafe durante l'esecuzione nelle versioni a 64 bit di Microsoft Office. La parola chiave PtrSafe indica che un'istruzione Declare è sicura da eseguire nelle versioni a 64 bit di Microsoft Office. L'aggiunta della parola chiave PtrSafe a un'istruzione Declare implica solo l'istruzione Declare target esplicitamente a 64 bit, tutti i tipi di dati all'interno dell'istruzione che devono memorizzare 64 bit (inclusi valori e parametri di ritorno) devono essere modificati per contenere-bit quantità che utilizzano LongLong per integrali a 64 bit o LongPtr per puntatori e maniglie.

Aggiungere la parola chiave PtrSafe.