Excel VBA版本差异问题:版本6和版本7

Excel VBA版本差异问题:版本6和版本7,excel,vba,vba6,vba7,Excel,Vba,Vba6,Vba7,我不熟悉VBA和使用。我粘贴,试图通过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 sz

我不熟悉VBA和使用。我粘贴,试图通过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属性标记它们。


我的问题是:

  • 我确实使用Windows和office 64位系统。为什么窗户总是弹出

  • 有没有办法解决这个问题


  • 提前感谢。

    如错误所示,将
    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
    的任何位置添加此关键字

    以下是关于
    PtrSafe

    • 将PtrSafe关键字添加到Declare语句仅表示Declare语句显式地以64位为目标。语句中需要存储64位(包括返回值和参数)的所有数据类型仍必须修改为包含64位数量,方法是使用LongLong表示64位积分,或使用LongPtr表示指针和句柄


    请查看相应的文档。然后按照编译器给你的提示,请检查并更新Declare语句,然后用PtrSafe属性标记它们。第二个固定的
    弹出窗口说它只能在64位系统上运行
    -不,弹出窗口说你没有更新代码以与64位系统兼容,因此它不能在那里运行。您没有,因为您没有添加
    PtrSafe
    ,也没有仅在需要时将参数类型正确更改为
    LongPtr
    。您好@GSerg,现在我理解了弹出窗口的含义。谢谢您的解释。您好@Storax,我在这里提问之前确实参考了您提供的MS文档。唯一的问题是,我不擅长英语,选择的语言是中文,但它没有提供中文版本。这就是为什么我在这里看是否有人能用更简单的方式解释它。@GSerg-是的,我不熟悉这个API调用,但我已经用你的建议更新了答案。你需要在使用
    LongPtr
    的任何地方添加这个关键字-相反,只要你支持VBA7,你就需要添加这个关键字(现在应该一直如此)。如果函数签名碰巧没有任何
    LongPtr
    s,它仍然需要
    PtrSafe
    @GSerg-我正在阅读MS文档,“建议使用带有PtrSafe关键字的Declare语句。包含PtrSafe的Declare语句仅在Declare语句中的所有数据类型(参数和返回值)之后才能在32位和64位平台上的VBA7开发环境中正常工作。”需要存储64位数量的数据将更新为使用LongLong进行64位积分,或使用LongPtr进行指针和句柄。"正确。只有在更新Declare语句中需要存储64位数量的所有数据类型后,该语句才有效。如果此类数据类型的数量为零,则该语句仍然有效。所有参数都已更新,所有参数均为零,因此我们将应用
    PtrSafe
    。如果没有
    LongPtr
    参数,并且您不应用
    PtrSafe
    ,它将无法在64位上编译。@JAlex,谢谢你的帮助。我尝试了你的代码,但有些代码变为红色。有什么方法可以解决这个问题吗?