EXCEL宏的快捷键可以使用一个单键吗 F1什么的不用的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EXCEL宏的快捷键可以使用一个单键吗 F1什么的不用的?相关的知识,希望对你有一定的参考价值。

是这样的,系统不建议使用单键作为宏的热键,但是如果强烈希望这样做也是有办法的,可以自己写Application.OnKey调用指定,示例:

测试没有问题,在EXCEL界面可以响应F1,替换掉了系统的F1帮助功能:

参考技术A 在录制宏的界面已经给限制住了,热键就是Ctrl加某个按键。。
单独的F1到F12本身就是功能键,很容易冲突,所以不能用。追问

功能键我可以自己设置取消啊

追答

不是所有热键都能取消的。取消是一方面,更重要的是很多软件的默认热键就是常用的功能键。总不能挨个去改吧,而且有的系统级的还不能改。

使用宏的 Fortran 替换子例程名称

【中文标题】使用宏的 Fortran 替换子例程名称【英文标题】:Fortran substitute subroutine name using macro 【发布时间】:2013-12-03 23:30:14 【问题描述】:

我正在编写一个允许用户记录信息的模块。我想提供一个记录字符串消息的接口,可以称为

call m_log(msg)

所以在文件 m_logger.f90 中,我会有

module m_logger
..
  subroutine m_log(msg)
  ..
end module 

在 main.f90 文件中,用户将拥有

program main
use m_logger

call m_log(msg)
end program 

现在如何将call m_log(msg) 替换为call m_log(msg, __FILE__, __LINE__)

由于这种替换,将调用记录器模块中的不同子例程subroutine m_log(msg, filename, linenum)

如果我使用像 #define m_log(msg) m_log(msg,__FILE__,__LINE__) 这样的宏,则必须将它添加到每个使用记录器的用户文件中。

另外,我不想强​​制用户明确传递__FILE____LINE__

有没有办法做到这一点?还是完全有其他选择?

提前致谢

编辑: 我讨论了 comp.lang.fortran。添加链接以供参考。 here

【问题讨论】:

您能否在此处添加一些说明或示例来说明您要实现的目标?我很困惑。 基本上我如何用m_log(msg,__FILE__,__LINE__)自动替换m_log(msg),也许使用宏。 __FILE____LINE__ 在哪里出现?当您说您不希望用户显式传递参数时,您的意思是用户会将它们定义为环境变量或宏,而不是将它们放在函数调用中? __FILE____LINE__ 是编译器宏。 【参考方案1】:

在这种情况下,您必须使用与 C 相同的方法。定义你提议的宏

 #define log(msg) m_log(msg,__FILE__,__LINE__)

在一个单独的文件中(可能包含其他有用的宏)并使用#include "file.inc" 包含它(标准的 Fortran 包含不够用)。

如果宏的名称与它实际调用的子程序不同,您可以确保用户必须使用包含并且不会忘记它。

【讨论】:

【参考方案2】:

如果您不想显式地强制使用__file____line__,那么您可以使用optional 标志,这样您的子例程如下所示:

subroutine m_log(msg, filename, linenum)
   character(len=*) :: msg
   character(len=*), optional :: filename
   integer, optional :: linenum
   if(present(filename)) then
      <something with filename>
   endif
   if(present(linenum)) then
      <something with linenume>
   endif
   <normal stuff with msg>
end subroutine

如果filenamelinenum 附加了任何值,则内部函数present 返回真值,否则返回假。

【讨论】:

这并不能解决我的问题。如果用户不传递可选参数,我就不会有文件名和行号。 那我误解了你写的东西。我唯一的建议是向用户强烈建议他们将子例程/文件名和行号包含在msg 中,并且只使用一个m_log 子例程。【参考方案3】:

由于您希望用户将它们作为编译器宏传递,因此您首先必须为宏选择不同的名称。 __FILE____LINE__ 都是预定义的宏。这两个宏是由预处理器定义的,而不是由用户传递的。我认为这可能会引起一些混乱。

如果您希望允许用户通过编译器选项选择性地提供宏,最好在您的子例程中包含 #ifdef 指令:

subroutine m_log(msg)
  implicit none
  character(len=*) :: msg
  character(len=something) :: file
  integer ::line
  !Initialize file and line to some default value
  file=...
  line=...
#ifdef __KVM_FILE__
   file=__KVM_FILE__
#endif
#ifdef __KVM_LINE__
   line=__KVM_LINE__
#endif
   ...

这样用户将始终以相同的语法call m_log(something)调用子程序,但效果会根据您的编译宏而改变。当然,这也需要用户在每次更改此宏时重新编译您的代码。如果这样做成本太高,您可以设置一个带有可选参数的子例程(如 Kyle 的回答),然后将 #define 宏包含在 #ifdef 块中,并将它们放入 .h 文件中,并让您的用户始终包括该文件。 (类似于弗拉基米尔的回答)

【讨论】:

以上是关于EXCEL宏的快捷键可以使用一个单键吗 F1什么的不用的?的主要内容,如果未能解决你的问题,请参考以下文章

如何在excel中新建一个宏,设置快捷键?

如何在excel中新建一个宏,设置快捷键?

Excel里的宏有啥作用?

excel里面的宏怎么设置快捷键

带宏的excel无法在sharepoint上显示吗

更改 excel 宏 快捷键