32位Excel宏适配64位求助:Win10正常Win11报错
适配64位Office的Excel宏修改方案
你的宏在Windows11报错的核心原因是:Windows11默认搭配的64位Office不支持32位VBA的API声明语法。需要对URLDownloadToFile的API声明做64位适配,同时保留对32位环境的兼容性。
修改后的完整代码
Option Explicit #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 Dim Ret As Long '~~> 图片保存路径,按需修改 Const FolderName As String = "C:\Users\user\Documents\Images\" Sub Sample() Dim ws As Worksheet Dim LastRow As Long, i As Long Dim strPath As String '~~> 指定数据所在工作表 Set ws = Sheets("Sheet1") LastRow = ws.Range("A" & Rows.Count).End(xlUp).Row For i = 2 To LastRow '<~~ 从第2行开始,第1行为表头 strPath = FolderName & ws.Range("A" & i).Value & ".jpg" Ret = URLDownloadToFile(0, ws.Range("B" & i).Value, strPath, 0, 0) If Ret = 0 Then ws.Range("C" & i).Value = "HI-Five" Else ws.Range("C" & i).Value = "SAD FACE" End If Next i MsgBox "Images Downloaded!!!" End Sub
关键修改说明
- 条件编译块:用
#If VBA7 Then区分Office版本,VBA7对应2010及以后的Office,支持64位环境 - PtrSafe关键字:64位VBA要求API声明必须添加该关键字,标识函数兼容64位地址空间
- 指针类型适配:将
pCaller和lpfnCB参数从Long改为LongPtr,这是64位下的通用指针类型,自动适配32/64位环境的地址长度
额外注意事项
- 确保
FolderName指定的文件夹已存在,否则下载会失败,可在代码中添加MkDir函数实现自动创建文件夹 - 若使用Office 365,需在信任中心启用宏,并确保目标URL可正常访问
- 测试时可单步执行,排查特定行的URL或文件名是否存在格式错误
内容的提问来源于stack exchange,提问作者Garry Brace
相关产品推荐
相关产品推荐

