在回答这个问题时,我认为编写一个能自动替换外观的VBE宏会很有趣
DimAll a, b, c, d As Integer
Run Code Online (Sandbox Code Playgroud)
通过
Dim a As Integer, b As Integer, c As Integer, d As Integer
Run Code Online (Sandbox Code Playgroud)
在我的初稿中,我只想修改一个选定的行.在建立了适当的参考资料以获得VBE对象模型(参见http://www.cpearson.com/excel/vbe.aspx)并玩了一下之后我想出了:
Function ExpandDim(codeLine As String) As String
Dim fragments As Variant
Dim i As Long, n As Long, myType As String
Dim last As Variant
Dim expanded As String
If UCase(codeLine) Like "*DIMALL*AS*" Then
codeLine = Replace(codeLine, "dimall", "Dim", , , vbTextCompare)
fragments = Split(codeLine, ",")
n = UBound(fragments)
last = Split(Trim(fragments(n)))
myType = …Run Code Online (Sandbox Code Playgroud) 在VBA和VB6外接对象模型(VBIDE)暴露CommandBarEvents有一个对象Click 的事件,而该事件的签名是:
Dim WithEvents CmdBarEvents As CommandBarEvents
Private Sub CmdBarEvents_Click(ByVal CommandBarControl As Object, handled As Boolean, CancelDefault As Boolean)
并且CommandBarControl传递给a的引用以VBE.Events.CommandBarEvents注册该事件处理程序CommaneBarControl:
Set CmdBarEvents = Application.VBE.Events.CommandBarEvents(CmdBarItem)
该办公室的对象模型定义有自己单独的命令栏控件Click 的事件,例如,CommandBarControl其中有一个对象Click的事件,而签名是:
Dim WithEvents CmdBarBtn As CommandBarButton
Private Sub CmdBarBtn_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
并且CommandBarButton对该WithEvents对象分配了对a的引用:
Set CmdBarButton = myButton
为什么会有差异,我应该选择哪个?
我将事件附加到VBE的CommandBars上的控件(而不是主机应用程序中的CommandBars).
Office CommandBars无权访问CommandBarEvents对象,因此我假设他们必须使用该CommandBarButton.Click事件.但是VBE(在任何Office主机下)都可以访问CommandBarButton …
我正在将Rubberduck(版本2.0.13)与本地git存储库结合使用,以便对我的VBA项目进行版本控制.
目前,每次Manage -> Open Existing Repository在Source Control Window中启动Rubberduck时,我都需要重新打开存储库.
有没有更好的方法来处理本地存储库,例如,Rubberduck可以保存此设置吗?我不想使用在线存储库,所以我认为"Unsynced commits"选项卡对我来说无关紧要.
我是开源项目Rubberduck的贡献者,并且希望增加对独立VB6 IDE(目前支持VBA)的支持。
IDE需要的一项信息是其当前的模式-设计,中断或运行。在VBA方面,可扩展性API公开了这一点,但是遗憾的是,VB6并非如此。因此,我离开尝试寻找其他方式来查询此信息。
我以为可以通过简单地检查主窗口的标题来“作弊”-它将模式附加到标题栏中的项目名称中。不幸的是,这是不切实际的,因为文本已针对国际版本的IDE进行了本地化。
我认为解决方案在于vba6.dll的EbMode函数(此处的“ a”具有误导性,并且出于兼容性原因而存在)。谷歌搜索“ EbMode VB6”在实践中显示了许多示例。
因此,我尝试了以下方法:
public class Test
{
private const string DllName = "vba6.dll"; // Not considering VB5 for now
[DllImport(DllName)]
private static extern int EbMode();
public EnvironmentMode Mode => (EnvironmentMode)EbMode();
}
public enum EnvironmentMode
{
Run = 0,
Break = 1,
Design = 2
}
Run Code Online (Sandbox Code Playgroud)
它执行并返回一个值,不幸的是,即使在设计或中断模式下,它始终返回0(映射为“运行”)。
我面临的挑战是,我可以找到的公共代码都是为非托管代码(主要是VB6,通常包括内联汇编)编写的。其中一些示例在调用函数之前应用了某种补丁,我认为这可能是我所缺少的。但是我不确定如何在托管代码中进行。
使用即时窗口进行一些调试,我遇到了以下为此问题而简化的以下内容:
运行此命令:
?20000*2
Run Code Online (Sandbox Code Playgroud)
产生"溢出"错误.让我们假设这是因为我们没有声明数据类型,并且VBE已经假设Integer- 结果超出了有符号整数的边界,因此发生溢出.
但是如果我跑:
?39999+1
Run Code Online (Sandbox Code Playgroud)
我40000按预期得到了.
这是因为我最初是以a Long而不是Integer(即20,000 vs 39,999)开始的吗?因此,内存是根据初始输入数据而不是计算结果来分配的?
可以说我有以下几点:
Public Sub Information()
'TEST
End Sub
Run Code Online (Sandbox Code Playgroud)
有没有办法获得“测试”结果?通过VBA以某种方式?
例如-在PHP中,有一种接受注释的好方法。这里有什么想法吗?
编辑:应该有一种方法,因为MZ-Tools之类的工具能够在生成文档时提供注释。
有没有办法自动添加Option Private Module到VBA中的所有模块?
Option explicit当我们在Extras> Option>编辑器中标记复选框以声明变量时,会自动添加?
因为通过所有模块并手动编写它似乎是唯一的选择.
子问题:
如果必须添加Option Private Module10个应用程序中的所有模块,您会做什么?
起初我想使用一个简单的替换并替换Option Explicitwith Option Explicit ^p Option Private Module,但它也会在类中替换它,我必须从那里删除它.
在这里节省约30分钟的想法?
我是rubberduck的新手,并安装了最新的2.0.11版本.管理员安装后,我去excel并检查我的com-addins,它现在显示在那里rubberduck.我检查了我的programdata文件夹,是的,rubberduck有所有文件等.它只是没有出现在我的excel加入.救命?
操作系统:Windows 7专业版Excel 2007 64位
宏记录器生成以下语句:
Cells.Select
Run Code Online (Sandbox Code Playgroud)
现在我明白,如果没有对象限定符,这将返回所有单元格作为Range对象.
但是,我想知道这个陈述的完全限定版本是什么?
是吗:
Application.Cells.Select Application.ActiveSheet.Cells Application.ActiveWorkbook.ActiveSheet.Cells换句话说,VBE在运行时实际执行了哪一个完全限定的语句Cells.Select?
所有这些之间的区别是什么?因为所有这些最终都访问了同一个对象 - 如果我想明确限定所有对象,那么我会使用哪个语句来个人偏好?
非常感谢!
我找不到任何关于此的信息:
我正在初始化一个变量,当我输入一个科学记数法的数字,如8.45673E11,但它将它转换为标准形式,最后用复合符号845673000000# - 我想知道这是否应该发生?是否有控制此自动转换的设置?复合符号表示什么?
非常感谢!羊毛