ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 260|回复: 2

[讨论] 将Excel窗口置于顶部代码,#If...Then...#Else 指令,带#的什么条件下使用?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-6-30 17:46 | 显示全部楼层 |阅读模式

  各位老师,今天在查看网络时,看到一段将Excel窗口置于顶部代码,采用#If...Then...#Else 指令,看官方解释,也没看出个一二来,百思不得其解,咨询下:


1、什么情况下用这种结构?


2、这种结构代码有什么优势?


3、有没有通俗的解释?


  1. 'VBA代码:始终将Excel窗口置于顶部
  2. #If Win64 Then
  3.     Public Declare PtrSafe Function SetWindowPos _
  4.         Lib "user32" ( _
  5.             ByVal hwnd As LongPtr, _
  6.             ByVal hwndInsertAfter As LongPtr, _
  7.             ByVal x As Long, ByVal y As Long, _
  8.             ByVal cx As Long, ByVal cy As Long, _
  9.             ByVal wFlags As Long) _
  10.     As Long
  11. #Else
  12.     Public Declare Function SetWindowPos _
  13.         Lib "user32" ( _
  14.             ByVal hwnd As Long, _
  15.             ByVal hwndInsertAfter As Long, _
  16.             ByVal x As Long, ByVal y As Long, _
  17.             ByVal cx As Long, ByVal cy As Long, _
  18.             ByVal wFlags As Long) _
  19.     As Long
  20. #End If
  21. Public Const SWP_NOSIZE = &H1
  22. Public Const SWP_NOMOVE = &H2
  23. Public Const HWND_TOPMOST = -1
  24. Public Const HWND_NOTOPMOST = -2
  25. Sub ShowXLOnTop(ByVal OnTop As Boolean)
  26.     Dim xStype As Long
  27.     #If Win64 Then
  28.         Dim xHwnd As LongPtr
  29.     #Else
  30.         Dim xHwnd As Long
  31.     #End If
  32.     If OnTop Then
  33.         xStype = HWND_TOPMOST
  34.     Else
  35.         xStype = HWND_NOTOPMOST
  36.     End If
  37.     Call SetWindowPos(Application.hwnd, xStype, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE)
  38. End Sub
  39. Sub SetXLOnTop()
  40.     ShowXLOnTop True
  41. End Sub
  42. Sub SetXLNormal()
  43.     ShowXLOnTop False
  44. End Sub
复制代码



下面为官方的网址和解释:

#If...Then...#Else 指令 - Visual Basic | Microsoft Learn
#If...Then...#Else 指令
  • 项目
  • 2023/04/07
  • 11 个参与者

[size=0.875em]
反馈


本文内容
  • [color=var(--theme-hyperlink)]语法
  • [color=var(--theme-hyperlink)]组成部分
  • [color=var(--theme-hyperlink)]注解
  • [color=var(--theme-hyperlink)]示例
  • [color=var(--theme-hyperlink)]另请参阅
有条件地编译选定的 Visual Basic 代码块。
语法
[backcolor=var(--theme-code-header)][size=0.8]VB复制[color=var(--theme-success-invert) !important][backcolor=var(--theme-success-base) !important][size=1.125]

#If expression Then   statements[ #ElseIf expression Then   [ statements ]...#ElseIf expression Then   [ statements ] ][ #Else   [ statements ] ]#End If组成部分
expression
对于 #If 和 #ElseIf 语句是必需的,在其他位置为可选。 任何表达式(仅由一个或多个条件编译器常量、文本和运算符组成),其计算结果为 True 或 False。
statements
#If 语句块必需,在其他位置为可选。 如果关联的表达式的计算结果为 True,则 Visual Basic 编译的程序行或编译器指令。
#End If
终止 #If 语句块。
注解
在表面上,#If...Then...#Else 指令的行为将与 If...Then...Else 语句的行为相同。 但是,#If...Then...#Else 指令将计算编译器编译的内容,而 If...Then...Else 语句则计算运行时的条件。
条件编译通常用于针对不同平台编译相同的程序。 它还用于阻止调试代码出现在可执行文件中。 在条件编译期间排除的代码在最终可执行文件中被完全省略,因此它不会对大小或性能产生任何影响。
不管任何计算结果如何,都将使用 Option Compare Binary 计算所有表达式。 Option Compare 语句不影响 #If 和 #ElseIf 语句中的表达式。
[backcolor=var(--theme-info-background)]
[color=var(--theme-info-dark)] 备注
不存在 #If、#Else、#ElseIf 和 #End If 指令的单行形式。 任何其他代码都不能与任何指令出现在同一行上。

条件编译块内的语句必须是完整的逻辑语句。 例如,无法有条件地仅编译函数的属性,但可以有条件地声明函数及其属性:
[backcolor=var(--theme-code-header)][size=0.8]VB复制[color=var(--theme-success-invert) !important][backcolor=var(--theme-success-base) !important][size=1.125]

<code class="lang-vb" data-author-content="#If DEBUG ThenPublic Function SomeFunction() As String#ElsePublic Function SomeFunction() As String#End If" style="box-sizing: inherit; outline-color: inherit; font-family: SFMono-Regular, Consolas, &quot;Liberation Mono&quot;, Menlo, Courier, monospace; font-size: 1em; direction: ltr; border: 0px; line-height: 1.3571; display: block; position: relative;">#If DEBUG Then<WebMethod()>Public Function SomeFunction() As String#Else<WebMethod(CacheDuration:=86400)>Public Function SomeFunction() As String#End If示例
此示例使用 #If...Then...#Else 构造来确定是否编译某些语句。
[backcolor=var(--theme-code-header)][size=0.8]VB复制[color=var(--theme-success-invert) !important][backcolor=var(--theme-success-base) !important][size=1.125]

#Const CustomerNumber = 36#If CustomerNumber = 35 Then        ' Insert code to be compiled for customer # 35.#ElseIf CustomerNumber = 36 Then        ' Insert code to be compiled for customer # 36.#Else        ' Insert code to be compiled for all other customers.#End If另请参阅
  • [color=var(--theme-hyperlink)]#Const 指令
  • [color=var(--theme-hyperlink)]If...Then...Else 语句

TA的精华主题

TA的得分主题

发表于 2023-6-30 18:36 来自手机 | 显示全部楼层
主要用于不同系统环境下的API引用
环境不一样,API的参数类型有所差异

TA的精华主题

TA的得分主题

发表于 2023-6-30 19:36 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-11 14:06 , Processed in 0.035640 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表