如何打开Excel上的“alignment网格”,并启动加载项

我正在寻找一种方法来每次启动Excel时自动打开alignment网格

我制定了这个代码,并把它放在一个加载项(.xlam),我总是加载Excel启动。

Private Sub Workbook_Open() Dim cbc As CommandBarControl Set cbc = Application.CommandBars.FindControl(ID:=549) If Not cbc.Enabled Then cbc.Execute End Sub 

但是当我启动Excel时,它会在cbc.Execute引发此错误:

在这里输入图像说明

谁能告诉我什么是错的?

我认为你有两个问题:

问题1

我相信你正在尝试使用Enabled属性是检查控件的切换状态。 相反,我想你想要的State属性,而不是显示在intellisense)。 你的代码应该是这样的:

 Public Sub ActivateSnapToGrid() Dim cbc As CommandBarControl Set cbc = Application.CommandBars.FindControl(ID:=549) If Not cbc Is Nothing Then If cbc.Enabled Then 'if snap to grid is off... If cbc.State = 0 Then cbc.Execute 'State should now = -1 End If End If End If End Sub 

问题2

如果没有工作簿存在,则“alignment网格”控件未启用(请通过closures所有工作簿来检查这一点)。 在它的当前状态,你的代码试图执行在这种情况下,即If Not cbc.Enabled Then cbc.Execute因为我认为你正在试图检查,如果它是“开”,而不是如果启用。

因为Excel加载项将作为“隐藏”工作簿加载,所以我不相信这会启用“alignment网格”命令栏控件。 因此,在加载项Workbook_Open事件中,控件将被禁用,这就是为什么你会得到错误。

您的加载项中需要一个应用程序级别的事件处理程序。 这是Excel加载项非常常见的。 在MSDN上看到这里的一些解释。 另外还看到Chip Pearson的这篇文章非常有用。 它将允许您为在加载项加载后生成的任何Workbook_Open事件编写一个事件。

所以你最终会在你的加载项中使用这个代码(每个Chip Pearson)来调用上面提到的子代码(在问题1一节中):

 Private WithEvents App As Application Private Sub Workbook_Open() Set App = Application End Sub Private Sub App_NewWorkbook(ByVal Wb As Workbook) Debug.Print "New Workbook: " & Wb.Name Call ActivateSnapToGrid End Sub 

我没有彻底地testing过,因为无法知道你是如何写入你的加载项的。 然而,这是一个非常(如果不是)做这种东西的标准模式。 请参阅MSDN和Chip Pearson的文章,您将弄清楚哪些代码在ClassModule等中。