Проблема с разницей в версиях VBA: версия 6 и версия 7 - PullRequest
0 голосов
/ 10 июля 2020

Я новичок в VBA и использую excel 2010, совместимый с 64-битной версией VBA v6.0 . Я вставил код , пытаясь загрузить файлы через VBA.

Option Explicit
'Tutorial link: https://youtu.be/H4-w6ULc_qs
#If VBA7 Then
   Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
     "URLDownloadToFileA" (ByVal pCaller As LongPtr, ByVal szURL As String, ByVal _
       szFileName As String, ByVal dwReserved As LongPtr, ByVal lpfnCB As LongPtr) As LongPtr
#Else
   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
#End If

Sub download_file()
'-----------------------------
'Thanks for downloading the code.
'Please visit our channel for a quick explainer on how to use this code.
'Feel free to update the code as per your need and also share with your friends.
'Download free codes from http://vbaa2z.blogspot.com
'Support our channel: youtube.com/vbaa2z
'Author: L Pamai (vbaa2z.team@gmail.com)
'-----------------------------

Dim downloadStatus As Variant
Dim url As String
Dim destinationFile_local As String

url = [D3]
destinationFile_local = "C:\Users\myUserName\Downloads\" & fileName([D3])

downloadStatus = URLDownloadToFile(0, url, destinationFile_local, 0, 0)

If downloadStatus = 0 Then
    MsgBox "Downloaded Succcessfully!"
    Else
    MsgBox "Download failed"
End If

End Sub

Function fileName(file_fullname) As String

    fileName = Mid(file_fullname, InStrRev(file_fullname, "/") + 1)

End Function

Однако во всплывающем окне говорится, что он может работать только в 64-битных системах, как показано ниже:

Ошибка компиляции: код в этом проекте необходимо обновить для использования в 64-битных системах. Просмотрите и обновите операторы Declare, а затем отметьте их атрибутом PtrSafe.

Мои вопросы:

  1. Я использую 64-разрядную оконную и офисную систему. Почему всплывает окно?

  2. Есть ли способ решить эту проблему?

Заранее спасибо.

1 Ответ

1 голос
/ 10 июля 2020

Как сообщает ошибка, добавьте ключевое слово PtrSafe в ветку VBA7

#If VBA7 Then
   Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias _
     "URLDownloadToFileA" (ByVal pCaller As LongPtr, ByVal szURL As String, ByVal _
       szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As LongPtr) As Long
#Else
   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
#End If

Вам нужно добавить это ключевое слово везде, где вы используете LongPtr или LongLong.

Вот документация MS по PtrSafe

  • https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/ptrsafe-keyword

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

...