Excel VBA 代码:x64 版本中的编译错误(需要“PtrSafe”属性)

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/16763147/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 15:41:13  来源:igfitidea点击:

Excel VBA Code: Compile Error in x64 Version ('PtrSafe' attribute required)

excelvbaruntime64-bit

提问by user2422957

I am using Win8 x64 + Office 2013 x64.

我使用的是 Win8 x64 + Office 2013 x64。

MY PROBLEM:

我的问题:

I have an excel file, which has some modules in it, and works flawlessly in Office (Excel) x86. It uses the Swiss Ephemeris file (swedll32.dll) to do a lot of astronomical calculations.

我有一个 excel 文件,其中包含一些模块,并且可以在 Office (Excel) x86 中完美运行。它使用瑞士星历文件 ( swedll32.dll) 进行大量天文计算。

However, when I try to run it on my end, which is on Excel x64, ASAP it's opened, the VBA editor fires up and gives me the following error:

但是,当我尝试在 Excel x64 上运行它时,它会尽快打开,VBA 编辑器启动并出现以下错误:

Compile error:
The code in this project must be updated for use on 64-bit systems.
Please review and update Declare statements and then mark them with the PtrSafe attribute.

As I said above, it works only in 32bit office (Excel) but it won't work in my x64 Excel However there seems to be a workaround but I am too much of a novice to get it.

正如我上面所说,它只能在 32 位办公 (Excel) 中工作,但不能在我的 x64 Excel 中工作。不过似乎有一种解决方法,但我是新手,无法获得它。

I am no good in VBA, however, after digging over the Internet, a few websites proposed that for 64bit office (Excel), we should amend (for each declaration) the codes to something like that:

我对VBA不太好,然而,在网上挖掘后,一些网站提出对于64位office(Excel),我们应该(针对每个声明)将代码修改为这样的:

  • Original Statement: Private Declare Function
  • Amended Statement: Private Declare PtrSafeFunction
  • 原文声明:私有声明函数
  • 修正声明:Private 声明PtrSafe函数

Unfortunately, after adding 'PtrSafe' everywhere, though the VBA errors stopped, but the values are not being displayed/calculated properly in the cells.

不幸的是,在到处添加“ PtrSafe”之后,虽然 VBA 错误停止了,但值没有在单元格中正确显示/计算。

From a post on 64 Bit in VBA from Microsoft, it would seem that we also need to modify some of the data types such as:

从微软的一篇关于 64 位 VBA 的帖子来看,我们似乎还需要修改一些数据类型,例如:

  • Long → to → LongPtr
  • LongPtr → to → LongLong
  • and some "Long" are supposed to remain the same, depending on what they do.
  • Long → to → LongPtr
  • LongPtr → 到 → LongLong
  • 和一些“长”应该保持不变,这取决于他们做什么。

This website (under "Which Longs should become LongPtr?")gives a clue though, as to how to know which one to modify.

这个网站(在“哪个多头应该成为 LongPtr?”下)提供了一个线索,关于如何知道要修改哪个。

I do not understand a thing about it and have no idea what should be done really to make this work in Office (Excel) x64. Someone who is pretty good at this, kindly please help me. Please.

我对此一无所知,也不知道真正应该做什么才能在 Office (Excel) x64 中完成这项工作。哪位好心人,请帮帮我。请。

note:

笔记:

  • Only the declarations that appeared in red, denoting that they contain errors have been dumped here. The remaining portion of the codes were not pasted here because they appear fine (green colored).
  • For the Excel file to work properly on your computer, ensure that both the 'swedll32.dll' & the 'JCalc Ver 0.2d.xls' are in the same folder, after having extracting them.
  • 只有出现在红色中的声明,表示它们包含错误已被转储在这里。代码的其余部分没有粘贴在这里,因为它们看起来很好(绿色)。
  • 为了使 Excel 文件在您的计算机上正常运行,请确保在解压后将“swedll32.dll”和“JCalc Ver 0.2d.xls”放在同一个文件夹中。

Problem in Module Name: MainCalculations

模块名称中的问题:MainCalculations

'Swiss Ephemeris Release 1.60  9-jan-2000
'
' Declarations for Visual Basic 5.0
' The DLL file must exist in the same directory, or in a system
' directory where it can be found at runtime
'

    Private Declare Function swe_azalt Lib "swedll32.dll" _
    Alias "_swe_azalt@40" ( _
      ByVal tjd_ut As Double, _
      ByVal calc_flag As Long, _
      ByRef geopos As Double, _
      ByVal atpress As Double, _
      ByVal attemp As Double, _
      ByRef xin As Double, _
      ByRef xaz As Double _
    ) As Long  'geopos must be the first of three array elements
               'xin must be the first of two array elements
               'xaz must be the first of three array elements

    Private Declare Function swe_azalt_rev Lib "swedll32.dll" _
    Alias "_swe_azalt_rev@24" ( _
      ByVal tjd_ut As Double, _
      ByVal calc_flag As Long, _
      ByRef geopos As Double, _
      ByRef xin As Double, _
      ByRef xout As Double _
    ) As Long  'geopos must be the first of three array elements
               'xin must be the first of two array elements
               'xout must be the first of three array elements

Private Declare Function swe_calc Lib "swedll32.dll" _
    Alias "_swe_calc@24" ( _
      ByVal tjd As Double, _
      ByVal ipl As Long, _
      ByVal iflag As Long, _
      ByRef X As Double, _
      ByVal serr As String _
    ) As Long   ' x must be first of six array elements
                ' serr must be able to hold 256 bytes

Private Declare Function swe_calc_d Lib "swedll32.dll" _
    Alias "_swe_calc_d@20" ( _
      ByRef tjd As Double, _
      ByVal ipl As Long, _
      ByVal iflag As Long, _
      ByRef X As Double, _
      ByVal serr As String _
    ) As Long       ' x must be first of six array elements
                    ' serr must be able to hold 256 bytes

Private Declare Function swe_calc_ut Lib "swedll32.dll" _
    Alias "_swe_calc_ut@24" ( _
      ByVal tjd_ut As Double, _
      ByVal ipl As Long, _
      ByVal iflag As Long, _
      ByRef X As Double, _
      ByVal serr As String _
    ) As Long   ' x must be first of six array elements
                ' serr must be able to hold 256 bytes

Private Declare Function swe_calc_ut_d Lib "swedll32.dll" _
    Alias "_swe_calc_ut_d@20" ( _
      ByRef tjd_ut As Double, _
      ByVal ipl As Long, _
      ByVal iflag As Long, _
      ByRef X As Double, _
      ByVal serr As String _
    ) As Long       ' x must be first of six array elements
                    ' serr must be able to hold 256 bytes

Private Declare Function swe_close Lib "swedll32.dll" _
    Alias "_swe_close@0" ( _
    ) As Long

Private Declare Function swe_close_d Lib "swedll32.dll" _
    Alias "_swe_close_d@4" ( _
      ByVal ivoid As Long _
    ) As Long       ' argument ivoid is ignored

Private Declare Sub swe_cotrans Lib "swedll32.dll" _
    Alias "_swe_cotrans@16" ( _
      ByRef xpo As Double, _
      ByRef xpn As Double, _
      ByVal eps As Double _
    )

Private Declare Function swe_cotrans_d Lib "swedll32.dll" _
    Alias "_swe_cotrans_d@12" ( _
      ByRef xpo As Double, _
      ByRef xpn As Double, _
      ByRef eps As Double _
    ) As Long

Private Declare Sub swe_cotrans_sp Lib "swedll32.dll" _
    Alias "_swe_cotrans_sp@16" ( _
      ByRef xpo As Double, _
      ByRef xpn As Double, _
      ByVal eps As Double _
    )

Private Declare Function swe_cotrans_sp_d Lib "swedll32.dll" _
    Alias "_swe_cotrans_sp_d@12" ( _
      ByRef xpo As Double, _
      ByRef xpn As Double, _
      ByRef eps As Double _
    ) As Long

Private Declare Sub swe_cs2degstr Lib "swedll32.dll" _
    Alias "_swe_cs2degstr@8" ( _
      ByVal t As Long, _
      ByVal S As String _
    )

Private Declare Function swe_cs2degstr_d Lib "swedll32.dll" _
    Alias "_swe_cs2degstr_d@8" ( _
      ByVal t As Long, _
      ByVal S As String _
    ) As Long

Private Declare Sub swe_cs2lonlatstr Lib "swedll32.dll" _
    Alias "_swe_cs2lonlatstr@16" ( _
      ByVal t As Long, _
      ByVal pchar As Byte, _
      ByVal mchar As Byte, _
      ByVal S As String _
    )

Private Declare Function swe_cs2lonlatstr_d Lib "swedll32.dll" _
    Alias "_swe_cs2lonlatstr_d@16" ( _
      ByVal t As Long, _
      ByRef pchar As Byte, _
      ByRef mchar As Byte, _
      ByVal S As String _
    ) As Long

Private Declare Sub swe_cs2timestr Lib "swedll32.dll" _
    Alias "_swe_cs2timestr@16" ( _
      ByVal t As Long, _
      ByVal sep As Long, _
      ByVal supzero As Long, _
      ByVal S As String _
    )

Private Declare Function swe_cs2timestr_d Lib "swedll32.dll" _
    Alias "_swe_cs2timestr_d@16" ( _
      ByVal t As Long, _
      ByVal sep As Long, _
      ByVal supzero As Long, _
      ByVal S As String _
    ) As Long

Private Declare Function swe_csnorm Lib "swedll32.dll" _
    Alias "_swe_csnorm@4" ( _
      ByVal P As Long _
    ) As Long

Private Declare Function swe_csnorm_d Lib "swedll32.dll" _
    Alias "_swe_csnorm_d@4" ( _
      ByVal P As Long _
    ) As Long

Private Declare Function swe_csroundsec Lib "swedll32.dll" _
    Alias "_swe_csroundsec@4" ( _
      ByVal P As Long _
    ) As Long

Private Declare Function swe_csroundsec_d Lib "swedll32.dll" _
    Alias "_swe_csroundsec_d@4" ( _
      ByVal P As Long _
    ) As Long

Private Declare Function swe_d2l Lib "swedll32.dll" _
    Alias "_swe_d2l@8" ( _
    ) As Long

Private Declare Function swe_d2l_d Lib "swedll32.dll" _
    Alias "_swe_d2l_d@4" ( _
    ) As Long

Private Declare Function swe_date_conversion Lib "swedll32.dll" _
    Alias "_swe_date_conversion@28" ( _
      ByVal Year As Long, _
      ByVal Month As Long, _
      ByVal Day As Long, _
      ByVal utime As Double, _
      ByVal cal As Byte, _
      ByRef tjd As Double _
    ) As Long

Private Declare Function swe_date_conversion_d Lib "swedll32.dll" _
    Alias "_swe_date_conversion_d@24" ( _
      ByVal Year As Long, _
      ByVal Month As Long, _
      ByVal Day As Long, _
      ByRef utime As Double, _
      ByRef cal As Byte, _
      ByRef tjd As Double _
    ) As Long

Private Declare Function swe_day_of_week Lib "swedll32.dll" _
    Alias "_swe_day_of_week@8" ( _
      ByVal JD As Double _
    ) As Long

Private Declare Function swe_day_of_week_d Lib "swedll32.dll" _
    Alias "_swe_day_of_week_d@4" ( _
      ByRef JD As Double _
    ) As Long

Private Declare Function swe_degnorm Lib "swedll32.dll" _
    Alias "_swe_degnorm@8" ( _
      ByVal JD As Double _
    ) As Double

Private Declare Function swe_degnorm_d Lib "swedll32.dll" _
    Alias "_swe_degnorm_d@4" ( _
      ByRef JD As Double _
    ) As Long

Private Declare Function swe_deltat Lib "swedll32.dll" _
    Alias "_swe_deltat@8" ( _
      ByVal JD As Double _
    ) As Double

Private Declare Function swe_deltat_d Lib "swedll32.dll" _
    Alias "_swe_deltat_d@8" ( _
      ByRef JD As Double, _
      ByRef deltat As Double _
    ) As Long

Private Declare Function swe_difcs2n Lib "swedll32.dll" _
    Alias "_swe_difcs2n@8" ( _
      ByVal p1 As Long, _
      ByVal p2 As Long _
    ) As Long

Private Declare Function swe_difcs2n_d Lib "swedll32.dll" _
    Alias "_swe_difcs2n_d@8" ( _
      ByVal p1 As Long, _
      ByVal p2 As Long _
    ) As Long

Private Declare Function swe_difcsn Lib "swedll32.dll" _
    Alias "_swe_difcsn@8" ( _
      ByVal p1 As Long, _
      ByVal p2 As Long _
    ) As Long

Private Declare Function swe_difcsn_d Lib "swedll32.dll" _
    Alias "_swe_difcsn_d@8" ( _
      ByVal p1 As Long, _
      ByVal p2 As Long _
    ) As Long

Private Declare Function swe_difdeg2n Lib "swedll32.dll" _
    Alias "_swe_difdeg2n@16" ( _
      ByVal p1 As Double, _
      ByVal p2 As Double _
    ) As Double

Private Declare Function swe_difdeg2n_d Lib "swedll32.dll" _
    Alias "_swe_difdeg2n_d@12" ( _
      ByRef p1 As Double, _
      ByRef p2 As Double, _
      ByRef Diff As Double _
    ) As Long

Private Declare Function swe_difdegn Lib "swedll32.dll" _
    Alias "_swe_difdegn@16" ( _
      ByVal p1 As Double, _
      ByVal p2 As Double _
    ) As Long

Private Declare Function swe_difdegn_d Lib "swedll32.dll" _
    Alias "_swe_difdegn_d@12" ( _
      ByRef p1 As Double, _
      ByRef p2 As Double, _
      ByRef Diff As Double _
    ) As Long

Private Declare Function swe_fixstar Lib "swedll32.dll" _
    Alias "_swe_fixstar@24" ( _
      ByVal star As String, _
      ByVal tjd As Double, _
      ByVal iflag As Long, _
      ByRef X As Double, _
      ByVal serr As String _
    ) As Long       ' x must be first of six array elements
                    ' serr must be able to hold 256 bytes
                    ' star must be able to hold 40 bytes

Private Declare Function swe_fixstar_d Lib "swedll32.dll" _
    Alias "_swe_fixstar_d@20" ( _
      ByVal star As String, _
      ByRef tjd As Double, _
      ByVal iflag As Long, _
      ByRef X As Double, _
      ByVal serr As String _
    ) As Long       ' x must be first of six array elements
                    ' serr must be able to hold 256 bytes
                    ' star must be able to hold 40 bytes

Private Declare Function swe_fixstar_ut Lib "swedll32.dll" _
    Alias "_swe_fixstar_ut@24" ( _
      ByVal star As String, _
      ByVal tjd_ut As Double, _
      ByVal iflag As Long, _
      ByRef X As Double, _
      ByVal serr As String _
    ) As Long       ' x must be first of six array elements
                    ' serr must be able to hold 256 bytes
                    ' star must be able to hold 40 bytes

Private Declare Function swe_fixstar_ut_d Lib "swedll32.dll" _
    Alias "_swe_fixstar_ut_d@20" ( _
      ByVal star As String, _
      ByRef tjd_ut As Double, _
      ByVal iflag As Long, _
      ByRef X As Double, _
      ByVal serr As String _
    ) As Long       ' x must be first of six array elements
                    ' serr must be able to hold 256 bytes
                    ' star must be able to hold 40 bytes

Private Declare Function swe_get_ayanamsa Lib "swedll32.dll" _
    Alias "_swe_get_ayanamsa@8" ( _
      ByVal tjd_et As Double _
    ) As Double

Private Declare Function swe_get_ayanamsa_d Lib "swedll32.dll" _
    Alias "_swe_get_ayanamsa_d@8" ( _
      ByRef tjd_et As Double, _
      ByRef ayan As Double _
    ) As Long

Private Declare Function swe_get_ayanamsa_ut Lib "swedll32.dll" _
    Alias "_swe_get_ayanamsa_ut@8" ( _
      ByVal tjd_ut As Double _
    ) As Double

Private Declare Function swe_get_ayanamsa_ut_d Lib "swedll32.dll" _
    Alias "_swe_get_ayanamsa_ut_d@8" ( _
      ByRef tjd_ut As Double, _
      ByRef ayan As Double _
    ) As Long

Private Declare Sub swe_get_planet_name Lib "swedll32.dll" _
    Alias "_swe_get_planet_name@8" ( _
      ByVal ipl As Long, _
      ByVal pname As String _
    )

Private Declare Function swe_get_planet_name_d Lib "swedll32.dll" _
    Alias "_swe_get_planet_name_d@8" ( _
      ByVal ipl As Long, _
      ByVal pname As String _
    ) As Long

Private Declare Function swe_get_tid_acc Lib "swedll32.dll" _
    Alias "_swe_get_tid_acc@0" ( _
    ) As Double

Private Declare Function swe_get_tid_acc_d Lib "swedll32.dll" _
    Alias "_swe_get_tid_acc_d@4" ( _
      ByRef X As Double _
    ) As Long

Private Declare Function swe_houses Lib "swedll32.dll" _
    Alias "_swe_houses@36" ( _
      ByVal tjd_ut As Double, _
      ByVal geolat As Double, _
      ByVal geolon As Double, _
      ByVal ihsy As Long, _
      ByRef hcusps As Double, _
      ByRef ascmc As Double _
    ) As Long       ' hcusps must be first of 13 array elements
                    ' ascmc must be first of 10 array elements

Private Declare Function swe_houses_d Lib "swedll32.dll" _
    Alias "_swe_houses_d@24" ( _
      ByRef tjd_ut As Double, _
      ByRef geolat As Double, _
      ByRef geolon As Double, _
      ByVal ihsy As Long, _
      ByRef hcusps As Double, _
      ByRef ascmc As Double _
    ) As Long       ' hcusps must be first of 13 array elements
                    ' ascmc must be first of 10 array elements

Private Declare Function swe_houses_ex Lib "swedll32.dll" _
    Alias "_swe_houses_ex@40" ( _
      ByVal tjd_ut As Double, _
      ByVal iflag As Long, _
      ByVal geolat As Double, _
      ByVal geolon As Double, _
      ByVal ihsy As Long, _
      ByRef hcusps As Double, _
      ByRef ascmc As Double _
    ) As Long       ' hcusps must be first of 13 array elements
                    ' ascmc must be first of 10 array elements

Private Declare Function swe_houses_ex_d Lib "swedll32.dll" _
    Alias "_swe_houses_ex_d@28" ( _
      ByRef tjd_ut As Double, _
      ByVal iflag As Long, _
      ByRef geolat As Double, _
      ByRef geolon As Double, _
      ByVal ihsy As Long, _
      ByRef hcusps As Double, _
      ByRef ascmc As Double _
    ) As Long       ' hcusps must be first of 13 array elements
                    ' ascmc must be first of 10 array elements

Private Declare Function swe_houses_armc Lib "swedll32.dll" _
    Alias "_swe_houses_armc@36" ( _
      ByVal armc As Double, _
      ByVal geolat As Double, _
      ByVal eps As Double, _
      ByVal ihsy As Long, _
      ByRef hcusps As Double, _
      ByRef ascmc As Double _
    ) As Long       ' hcusps must be first of 13 array elements
                    ' ascmc must be first of 10 array elements

Private Declare Function swe_houses_armc_d Lib "swedll32.dll" _
    Alias "_swe_houses_armc_d@24" ( _
      ByRef armc As Double, _
      ByRef geolat As Double, _
      ByRef eps As Double, _
      ByVal ihsy As Long, _
      ByRef hcusps As Double, _
      ByRef ascmc As Double _
    ) As Long       ' hcusps must be first of 13 array elements
                    ' ascmc must be first of 10 array elements

Private Declare Function swe_house_pos Lib "swedll32.dll" _
    Alias "_swe_house_pos@36" ( _
      ByVal armc As Double, _
      ByVal geolat As Double, _
      ByVal eps As Double, _
      ByVal ihsy As Long, _
      ByRef xpin As Double, _
      ByVal serr As String _
    ) As Double
                    ' xpin must be first of 2 array elements

Private Declare Function swe_house_pos_d Lib "swedll32.dll" _
    Alias "_swe_house_pos_d@28" ( _
      ByRef armc As Double, _
      ByRef geolat As Double, _
      ByRef eps As Double, _
      ByVal ihsy As Long, _
      ByRef xpin As Double, _
      ByRef hpos As Double, _
      ByVal serr As String _
    ) As Long
                    ' xpin must be first of 2 array elements

Private Declare Function swe_julday Lib "swedll32.dll" _
    Alias "_swe_julday@24" ( _
      ByVal Year As Long, _
      ByVal Month As Long, _
      ByVal Day As Long, _
      ByVal hour As Double, _
      ByVal gregflg As Long _
    ) As Double

Private Declare Function swe_julday_d Lib "swedll32.dll" _
    Alias "_swe_julday_d@24" ( _
      ByVal Year As Long, _
      ByVal Month As Long, _
      ByVal Day As Long, _
      ByRef hour As Double, _
      ByVal gregflg As Long, _
      ByRef tjd As Double _
    ) As Long

Private Declare Function swe_lun_eclipse_how Lib "swedll32.dll" _
    Alias "_swe_lun_eclipse_how@24" ( _
      ByVal tjd_ut As Double, _
      ByVal ifl As Long, _
      ByRef geopos As Double, _
      ByRef attr As Double, _
      ByVal serr As String _
    ) As Long

Private Declare Function swe_lun_eclipse_how_d Lib "swedll32.dll" _
    Alias "_swe_lun_eclipse_how_d@20" ( _
      ByRef tjd_ut As Double, _
      ByVal ifl As Long, _
      ByRef geopos As Double, _
      ByRef attr As Double, _
      ByVal serr As String _
    ) As Long

Private Declare Function swe_lun_eclipse_when Lib "swedll32.dll" _
    Alias "_swe_lun_eclipse_when@28" ( _
      ByVal tjd_start As Double, _
      ByVal ifl As Long, _
      ByVal ifltype As Long, _
      ByRef tret As Double, _
      ByVal backward As Long, _
      ByVal serr As String _
    ) As Long

Private Declare Function swe_lun_eclipse_when_d Lib "swedll32.dll" _
    Alias "_swe_lun_eclipse_when_d@24" ( _
      ByRef tjd_start As Double, _
      ByVal ifl As Long, _
      ByVal ifltype As Long, _
      ByRef tret As Double, _
      ByVal backward As Long, _
      ByVal serr As String _
    ) As Long

Private Declare Function swe_nod_aps Lib "swedll32.dll" _
    Alias "_swe_nod_aps@40" ( _
      ByVal tjd_et As Double, _
      ByVal ipl As Long, _
      ByVal iflag As Long, _
      ByVal method As Long, _
      ByRef xnasc As Double, _
      ByRef xndsc As Double, _
      ByRef xperi As Double, _
      ByRef xaphe As Double, _
      ByVal serr As String _
    ) As Long

Private Declare Function swe_nod_aps_ut Lib "swedll32.dll" _
    Alias "_swe_nod_aps_ut@40" ( _
      ByVal tjd_ut As Double, _
      ByVal ipl As Long, _
      ByVal iflag As Long, _
      ByVal method As Long, _
      ByRef xnasc As Double, _
      ByRef xndsc As Double, _
      ByRef xperi As Double, _
      ByRef xaphe As Double, _
      ByVal serr As String _
    ) As Long

Private Declare Function swe_pheno Lib "swedll32.dll" _
    Alias "_swe_pheno@24" ( _
      ByVal tjd As Double, _
      ByVal ipl As Long, _
      ByVal iflag As Long, _
      ByRef attr As Double, _
      ByVal serr As String _
    ) As Long

Private Declare Function swe_pheno_ut Lib "swedll32.dll" _
    Alias "_swe_pheno_ut@24" ( _
      ByVal tjd As Double, _
      ByVal ipl As Long, _
      ByVal iflag As Long, _
      ByRef attr As Double, _
      ByVal serr As String _
    ) As Long

Private Declare Function swe_pheno_d Lib "swedll32.dll" _
    Alias "_swe_pheno_d@20" ( _
      ByRef tjd As Double, _
      ByVal ipl As Long, _
      ByVal iflag As Long, _
      ByRef attr As Double, _
      ByVal serr As String _
    ) As Long

Private Declare Function swe_pheno_ut_d Lib "swedll32.dll" _
    Alias "_swe_pheno_ut_d@20" ( _
      ByRef tjd As Double, _
      ByVal ipl As Long, _
      ByVal iflag As Long, _
      ByRef attr As Double, _
      ByVal serr As String _
    ) As Long

Private Declare Function swe_refrac Lib "swedll32.dll" _
    Alias "_swe_refrac@28" ( _
      ByVal inalt As Double, _
      ByVal atpress As Double, _
      ByVal attemp As Double, _
      ByVal calc_flag As Long _
    ) As Double

Private Declare Sub swe_revjul Lib "swedll32.dll" _
    Alias "_swe_revjul@28" ( _
      ByVal tjd As Double, _
      ByVal gregflg As Long, _
      ByRef Year As Long, _
      ByRef Month As Long, _
      ByRef Day As Long, _
      ByRef hour As Double _
    )

Private Declare Function swe_revjul_d Lib "swedll32.dll" _
    Alias "_swe_revjul_d@24" ( _
      ByRef tjd As Double, _
      ByVal gregflg As Long, _
      ByRef Year As Long, _
      ByRef Month As Long, _
      ByRef Day As Long, _
      ByRef hour As Double _
    ) As Long

Private Declare Function swe_rise_trans Lib "swedll32.dll" _
    Alias "_swe_rise_trans@52" ( _
      ByVal tjd_ut As Double, _
      ByVal ipl As Long, _
      ByVal starname As String, _
      ByVal epheflag As Long, _
      ByVal rsmi As Long, _
      ByRef geopos As Double, _
      ByVal atpress As Double, _
      ByVal attemp As Double, _
      ByRef tret As Double, _
      ByVal serr As String _
    ) As Long

Private Declare Sub swe_set_ephe_path Lib "swedll32.dll" _
    Alias "_swe_set_ephe_path@4" ( _
      ByVal path As String _
    )

Private Declare Function swe_set_ephe_path_d Lib "swedll32.dll" _
    Alias "_swe_set_ephe_path_d@4" ( _
      ByVal path As String _
    ) As Long

Private Declare Sub swe_set_jpl_file Lib "swedll32.dll" _
    Alias "_swe_set_jpl_file@4" ( _
      ByVal file As String _
    )

Private Declare Function swe_set_jpl_file_d Lib "swedll32.dll" _
    Alias "_swe_set_jpl_file_d@4" ( _
      ByVal file As String _
    ) As Long

Private Declare Function swe_set_sid_mode Lib "swedll32.dll" _
    Alias "_swe_set_sid_mode@20" ( _
      ByVal sid_mode As Long, _
      ByVal t0 As Double, _
      ByVal ayan_t0 As Double _
    ) As Long

Private Declare Function swe_set_sid_mode_d Lib "swedll32.dll" _
    Alias "_swe_sid_mode_d@12" ( _
      ByVal sid_mode As Long, _
      ByRef t0 As Double, _
      ByRef ayan_t0 As Double _
    ) As Long

Private Declare Function swe_set_topo Lib "swedll32.dll" _
    Alias "_swe_set_topo@24" ( _
      ByVal geolon As Double, _
      ByVal geolat As Double, _
      ByVal altitude As Double _
    )

Private Declare Function swe_set_topo_d Lib "swedll32.dll" _
    Alias "_swe_set_topo_d@12" ( _
      ByRef geolon As Double, _
      ByRef geolat As Double, _
      ByRef altitude As Double _
    )

Private Declare Sub swe_set_tid_acc Lib "swedll32.dll" _
    Alias "_swe_set_tid_acc@8" ( _
      ByVal X As Double _
    )

Private Declare Function swe_set_tid_acc_d Lib "swedll32.dll" _
    Alias "_swe_set_tid_acc_d@4" ( _
      ByRef X As Double _
    ) As Long

Private Declare Function swe_sidtime0 Lib "swedll32.dll" _
    Alias "_swe_sidtime0@24" ( _
      ByVal tjd_ut As Double, _
      ByVal ecl As Double, _
      ByVal nut As Double _
    ) As Double

Private Declare Function swe_sidtime0_d Lib "swedll32.dll" _
    Alias "_swe_sidtime0_d@16" ( _
      ByRef tjd_ut As Double, _
      ByRef ecl As Double, _
      ByRef nut As Double, _
      ByRef sidt As Double _
    ) As Long

Private Declare Function swe_sidtime Lib "swedll32.dll" _
    Alias "_swe_sidtime@8" ( _
      ByVal tjd_ut As Double _
    ) As Double

Private Declare Function swe_sidtime_d Lib "swedll32.dll" _
    Alias "_swe_sidtime_d@8" ( _
      ByRef tjd_ut As Double, _
      ByRef sidt As Double _
    ) As Long

Private Declare Function swe_sol_eclipse_how Lib "swedll32.dll" _
    Alias "_swe_sol_eclipse_how@24" ( _
      ByVal tjd_ut As Double, _
      ByVal ifl As Long, _
      ByRef geopos As Double, _
      ByRef attr As Double, _
      ByVal serr As String _
    ) As Long

Private Declare Function swe_sol_eclipse_how_d Lib "swedll32.dll" _
    Alias "_swe_sol_eclipse_how_d@20" ( _
      ByRef tjd_ut As Double, _
      ByVal ifl As Long, _
      ByRef geopos As Double, _
      ByRef attr As Double, _
      ByVal serr As String _
    ) As Long

Private Declare Function swe_sol_eclipse_when_glob Lib "swedll32.dll" _
    Alias "_swe_sol_eclipse_when_glob@28" ( _
      ByVal tjd_start As Double, _
      ByVal ifl As Long, _
      ByVal ifltype As Long, _
      ByRef tret As Double, _
      ByVal backward As Long, _
      ByVal serr As String _
    ) As Long

Private Declare Function swe_sol_eclipse_when_glob_d Lib "swedll32.dll" _
    Alias "_swe_sol_eclipse_when_glob_d@24" ( _
      ByRef tjd_start As Double, _
      ByVal ifl As Long, _
      ByVal ifltype As Long, _
      ByRef tret As Double, _
      ByVal backward As Long, _
      ByVal serr As String _
    ) As Long

Private Declare Function swe_sol_eclipse_when_loc Lib "swedll32.dll" _
    Alias "_swe_sol_eclipse_when_loc@32" ( _
      ByVal tjd_start As Double, _
      ByVal ifl As Long, _
      ByRef tret As Double, _
      ByRef attr As Double, _
      ByVal backward As Long, _
      ByVal serr As String _
    ) As Long

Private Declare Function swe_sol_eclipse_when_loc_d Lib "swedll32.dll" _
    Alias "_swe_sol_eclipse_when_loc_d@28" ( _
      ByRef tjd_start As Double, _
      ByVal ifl As Long, _
      ByRef tret As Double, _
      ByRef attr As Double, _
      ByVal backward As Long, _
      ByVal serr As String _
    ) As Long

Private Declare Function swe_sol_eclipse_where Lib "swedll32.dll" _
    Alias "_swe_sol_eclipse_where@24" ( _
      ByVal tjd_ut As Double, _
      ByVal ifl As Long, _
      ByRef geopos As Double, _
      ByRef attr As Double, _
      ByVal serr As String _
    ) As Long

Private Declare Function swe_sol_eclipse_where_d Lib "swedll32.dll" _
    Alias "_swe_sol_eclipse_where_d@20" ( _
      ByRef tjd_ut As Double, _
      ByVal ifl As Long, _
      ByRef geopos As Double, _
      ByRef attr As Double, _
      ByVal serr As String _
    ) As Long

Private Declare Function swe_time_equ Lib "swedll32.dll" _
    Alias "_swe_time_equ@16" ( _
      ByVal tjd_ut As Double, _
      ByRef E As Double, _
      ByRef serr As String _
    ) As Long

回答by waweru

I think all you need to do for your function is just add PtrSafe: i.e. the first line of your first function should look like this:

我认为你需要为你的函数做的只是添加 PtrSafe: 即你的第一个函数的第一行应该是这样的:

Private Declare PtrSafe Function swe_azalt Lib "swedll32.dll" ......

回答by CuberChase

I'm quite sure you won't get this 32Bit DLL working in Office 64Bit. The DLL needs to be updated by the author to be compatible with 64Bit versions of Office.

我很确定你不会让这个 32Bit DLL 在 Office 64Bit 中工作。DLL 需要由作者更新以兼容 64Bit 版本的 Office。

The code changes you have found and supplied in the question are used to convert calls to APIs that have already been rewritten for Office 64Bit. (Most Windows APIs have been updated.)

您在问题中找到并提供的代码更改用于将调用转换为已为 Office 64Bit 重写的 API。(大多数 Windows API 已更新。)

From: http://technet.microsoft.com/en-us/library/ee681792.aspx:

来自:http: //technet.microsoft.com/en-us/library/ee681792.aspx

"ActiveX controls and add-in (COM) DLLs (dynamic link libraries) that were written for 32-bit Office will not work in a 64-bit process."

“为 32 位 Office 编写的 ActiveX 控件和加载项 (COM) DLL(动态链接库)在 64 位进程中不起作用。”

Edit:Further to your comment, I've tried the 64Bit DLL version on Win 8 64Bit with Office 2010 64Bit. Since you are using User Defined Functions called from the Excel worksheet you are not able to see the error thrown by Excel and just end up with the #VALUEreturned.

编辑:除了您的评论之外,我已经在带有 Office 2010 64Bit 的 Win 8 64Bit 上尝试了 64Bit DLL 版本。由于您使用的是从 Excel 工作表调用的用户定义函数,因此您无法看到 Excel 抛出的错误,而只会以#VALUE返回的结果结束。

If we create a custom procedure within VBA and try one of the DLL functions we see the exact error thrown. I tried a simple function of swe_day_of_weekwhich just has a time as an input and I get the error Run-time error '48' File not found: swedll32.dll.

如果我们在 VBA 中创建一个自定义过程并尝试其中一个 DLL 函数,我们会看到抛出的确切错误。我尝试了一个简单的函数,swe_day_of_week它只有一个时间作为输入,我得到了错误Run-time error '48' File not found: swedll32.dll

Now I have the 64Bit DLL you supplied in the correct locations so it should be found which suggests it has dependencies which cannot be located as per https://stackoverflow.com/a/8607250/1733206

现在我有您在正确位置提供的 64Bit DLL,因此应该可以找到它,这表明它具有无法根据https://stackoverflow.com/a/8607250/1733206定位的依赖项

I've got all the .NET frameworks installed which would be my first guess, so without further information from the author it might be difficult to find the problem.

我已经安装了所有 .NET 框架,这是我的第一个猜测,因此如果没有作者提供的更多信息,可能很难找到问题所在。

Edit2:And after a bit more investigating it appears the 64Bit version you have supplied is actually a 32Bit version. Hence the error message on the 64Bit Office. You can check this by trying to access the '64Bit' version in Office 32Bit.

Edit2:经过更多调查后,您提供的 64 位版本实际上是 32 位版本。因此在 64Bit Office 上出现错误消息。您可以通过尝试访问 Office 32Bit 中的“64Bit”版本来检查这一点。