首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们可以使用VBA中的条件编译来声明函数中的变量吗?

我们可以使用VBA中的条件编译来声明函数中的变量吗?
EN

Stack Overflow用户
提问于 2020-12-15 06:55:13
回答 1查看 284关注 0票数 3

我必须重构一个旧宏,它在新的MS 365版本中失败了.

对于kernel32和User32,我在顶部声明了函数变量,如下所示:

代码语言:javascript
复制
#If Vba7 Then 
  Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As LongPtr
#Else
  Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
#EndIf 

但是,我是否可以在函数中使用条件编译,例如:

代码语言:javascript
复制
Function CopyToClipboard(ByVal Msg as String)
#If VBA7
Dim hWindow as LongPtr
#Else
Dim hWindow as Long
#End If
.
.
End Function

它在某些系统中工作,但是copyToclipboard在某些系统中仍然失败。我在StackOverflow中看到了一些VBA的复制剪贴板功能,但它们在某些系统中仍然失败。

任何输入对于如何解决这个问题都是非常有帮助的。

更新:我最后为解决这个问题所做的事情是,我在下面的条件下附上了我的声明,它同时处理VBA7和VBA6,以及使用Win64条件参数处理32位和64位系统。

代码语言:javascript
复制
#If Vba7 Then 
  #If Win64 Then
    Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As LongPtr
  #Else
    Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
  #End If
#Else
  Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
#EndIf 

我复制了32位系统的VBA6声明,因为我认为LongPtr没有得到正确的解析,并且宏正在失败。现在它在每一个系统中都能完美地工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-15 08:07:21

我建议提供以下资源:

这不仅适用于函数声明(主要用于函数),也适用于正常代码。

例如,您甚至可以将它用于…。

  • 调试器模式如下: #Const conDebug =1‘在声明部分中声明公共编译常量。SelectiveExecution() #If conDebug =1然后用调试语句运行代码。#否则‘运行正常代码。#结束如果结束子
  • 编写Mac/Windows专用代码 #如果麦克那么。只在这里放置Mac语句。#ElseIf Win32那么‘。这里只放置32位Windows语句。#‘在这里放置其他平台/后备语句。#如果

您展示的示例是实现这一目标的完美和正确的方法。

如果您不确定您的函数声明,请检查正式引用:

Win32 API的编程参考

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65301279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档