Ошибка VBA Excel 2013

Я получаю следующую ошибку.

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

КОД 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"

он отлично работает в Excel 2010.

спасибо.

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

ошибка, которую я получаю, это Ret Variable Not defined. Вот остальная часть кода.

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

2 ответов


вы должны запускать это на 64-битной версии Office, тогда как ранее вы использовали 32-битную версию.

чтобы преобразовать 32-битные вызовы в 64-битные, вам обычно нужно добавить PtrSafe в функцию и преобразовать некоторые типы данных из Long to LongPtr (который является просто большим типом данных (см.:http://msdn.microsoft.com/en-us/library/office/gg251378.aspx)

таким образом, преобразованная функция будет:

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: Примечание, Если вы хотите чтобы иметь возможность использовать это как на 64-битных, так и на 32-битных версиях Office, вам нужно использовать препроцессор if, чтобы Office знал, какую функцию Использовать. Т. е.:

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

MSDN reference

полное сообщение об ошибке : Код в этом проекте должен быть обновлен для использовать на 64-разрядных системах. Пожалуйста, просмотрите и обновите заявления Declare и затем отметьте их атрибутом PtrSafe. Все заявления Declare должны теперь включите ключевое слово PtrSafe при запуске в 64-разрядных версиях офис Майкрософт. Ключевое слово PtrSafe указывает, что оператор Declare безопасно работать в 64-разрядных версиях Microsoft Office. Добавление PtrSafe ключевое слово для оператора Declare означает только оператор Declare явно нацелен на 64-разрядные, все типы данных в инструкции, которые необходимо хранить 64-битные (включая возвращаемые значения и параметры) все еще быть доработанным для удержания 64-разрядных количеств используя или LongLong для 64-разрядные интегралы или LongPtr для указателей и дескрипторов.

добавить PtrSafe ключевое слово.