使用(ActiveWorkbook.Path)的VBA Excel SetCurrentDirectory不适用于64位

使用(ActiveWorkbook.Path)的VBA Excel SetCurrentDirectory不适用于64位,excel,vba,32bit-64bit,Excel,Vba,32bit 64bit,我们目前进行了所有必要的更改,以使我们的VBA模板与Office 2010 32位和64位一起工作。我们遇到了一个我一直试图解决的问题 这是在DynamicXLSAppHandler中仅适用于32位的代码: Dim L_Return As Long 'Set Current Directory in SaveAs dialog If ActiveWorkbook.Path <> "" Then ChDrive (ActiveWorkbook.Path) ChDir

我们目前进行了所有必要的更改,以使我们的VBA模板与Office 2010 32位和64位一起工作。我们遇到了一个我一直试图解决的问题

这是在DynamicXLSAppHandler中仅适用于32位的代码:

Dim L_Return As Long

'Set Current Directory in SaveAs dialog
If ActiveWorkbook.Path <> "" Then
    ChDrive (ActiveWorkbook.Path)
    ChDir (ActiveWorkbook.Path)
    L_Return = SetCurrentDirectory(ActiveWorkbook.Path)
End If
Dim L_返回长度
'在“另存为”对话框中设置当前目录
如果是ActiveWorkbook.Path“”,则
ChDrive(ActiveWorkbook.Path)
ChDir(ActiveWorkbook.Path)
L_Return=SetCurrentDirectory(ActiveWorkbook.Path)
如果结束
此代码的目的是,当用户单击Save或Ctrl-S时,在最初打开文档/模板的目录(路径)中会出现一个SaveAs对话框。如果没有这段代码(因为64位不兼容),它现在只打开默认的“文档”,用户需要浏览到原始路径


我想知道是否有一种新的64位方法可以实现这一点,或者我是否必须完全改变情况。

要在64位中使用
SetCurrentDirectory
API,您需要在函数声明中添加:

#If VBA7 Then
    Private Declare PtrSafe Function SetCurrentDirectory Lib "kernel32" _
        Alias "" SetCurrentDirectoryA(ByVal lpPathName As String) As Long 
#Else
    Private Declare Function SetCurrentDirectory Lib "kernel32" _
        Alias "" SetCurrentDirectoryA(ByVal lpPathName As String) As Long 
#End If
顺便说一下:

  • 为什么需要
    ChDrive
    ChDir
    以及
    SetCurrentDirectory
  • ChDrive
    应该只传递一个驱动器号,例如:

    ChDrive Left(ActiveWorkbook.Path,1)


要使用64位的
SetCurrentDirectory
API,您需要在函数声明中添加:

#If VBA7 Then
    Private Declare PtrSafe Function SetCurrentDirectory Lib "kernel32" _
        Alias "" SetCurrentDirectoryA(ByVal lpPathName As String) As Long 
#Else
    Private Declare Function SetCurrentDirectory Lib "kernel32" _
        Alias "" SetCurrentDirectoryA(ByVal lpPathName As String) As Long 
#End If
顺便说一下:

  • 为什么需要
    ChDrive
    ChDir
    以及
    SetCurrentDirectory
  • ChDrive
    应该只传递一个驱动器号,例如:

    ChDrive Left(ActiveWorkbook.Path,1)


请注意,如果您的工作簿恰好保存在未映射的网络驱动器上,例如,如果
ActiveWorkbook,则
ChDrive
将失败。路径
\\mycompany\somedrive\somefolder
。我刚通过艰苦的学习了解到这一点。请注意,如果您的工作簿恰好保存在未映射的网络驱动器上,例如,如果
ActiveWorkbook,则
ChDrive
将失败。路径
\\mycompany\somedrive\somefolder
。我只是通过艰苦的方式了解到这一点。我们没有使用API,而是在If语句中使用它。我们使用ChDrive和ChDir来填充SetCurrentDirectory。我们要做的是用它来填充SendAs弹出窗口,这样它就不会把这个人扔到默认目录(我的文档)中?自定义函数?它是保存前步骤的自定义子类的一部分。因此,如果我想在这个子类中包含API,我将如何使用ActiveWorkbook.Path来实现它?如果您像我所展示的那样声明API,那么您的代码是正确的。我真的不知道你说的“次级班”是什么意思。如果您使用的API不需要ChDrive或ChDirOne其他问题,那么这段代码是否向后兼容?因此,如果我们将它与Office 32位一起使用,它的工作原理是相同的还是会抛出错误?另外,我为我的错误术语道歉,这里是包含第一条语句的部分的第一行代码:Private Sub dynamic_Excelapp_workbookBeforeSave(ByVal I_book作为工作簿,ByVal SaveAsUI作为布尔值,cancel作为布尔值),那么我应该将Private声明放在哪里呢?我们没有使用API,我们在If语句中有这个。我们使用ChDrive和ChDir来填充SetCurrentDirectory。我们要做的是用它来填充SendAs弹出窗口,这样它就不会把这个人扔到默认目录(我的文档)中?自定义函数?它是保存前步骤的自定义子类的一部分。因此,如果我想在这个子类中包含API,我将如何使用ActiveWorkbook.Path来实现它?如果您像我所展示的那样声明API,那么您的代码是正确的。我真的不知道你说的“次级班”是什么意思。如果您使用的API不需要ChDrive或ChDirOne其他问题,那么这段代码是否向后兼容?因此,如果我们将它与Office 32位一起使用,它的工作原理是相同的还是会抛出错误?另外,我为我的错误术语道歉,这里是包含第一条语句的部分的第一行代码:Private Sub dynamic_Excelapp_workbookBeforeSave(ByVal I_book作为工作簿,ByVal SaveAsUI作为布尔值,cancel作为布尔值),那么我将Private Declare放在哪里呢?