在excel中运行宏

在excel中运行宏,excel,vba,Excel,Vba,我不认为这在技术上是一个宏,但我不知道该怎么称呼它: 用户希望在工作表上打印报表中的各个部分。这些部分只是命名范围 有几点: 该文件是一个xlt文件 它用作生成xls文件的模板 我使用的是Excel2007,但用户将同时运行2007和2003 当文件加载到excel时,它会询问我是否要启用所有宏,然后我确认 它调用的函数是公共的 我在工作表边缘创建了一系列按钮: ' in a loop With ActiveSheet.Buttons.Add(rngC

我不认为这在技术上是一个宏,但我不知道该怎么称呼它:

用户希望在工作表上打印报表中的各个部分。这些部分只是命名范围

有几点:

  • 该文件是一个xlt文件
  • 它用作生成xls文件的模板
  • 我使用的是Excel2007,但用户将同时运行2007和2003
  • 当文件加载到excel时,它会询问我是否要启用所有宏,然后我确认
  • 它调用的函数是公共的
我在工作表边缘创建了一系列按钮:

        ' in a loop    
        With ActiveSheet.Buttons.Add(rngCurrent.Left + 2, rngCurrent.Top + 1, rngCurrent.Width - 2, rngCurrent.Height - 1)
            .Caption = "Print"
            .OnAction = "PrintRange"
            .Font.Size = 7
            .Name = CStr(oSite.SiteID)
        End With
但是,当我单击按钮时,它给出“无法运行宏'filename.xls!PrintRange”

PrintRange函数位于sheet shtPage中,而循环位于名为modPage的模块中


为什么我不能调用所需的函数以及如何使其工作?

您是否将
PrintRange
宏公开?它需要定义如下:

Public Sub PrintRange
    '// ...'
End Sub

您是否公开了
PrintRange
宏?它需要定义如下:

Public Sub PrintRange
    '// ...'
End Sub

即使将PrintRange子项声明为Public,您仍然需要更具体地引用它,以便Excel能够找到它,因为您已将它放在工作表的“代码”部分而不是模块中

更改:

.OnAction = "PrintRange"

它会很好的工作


警告:如果已将页面选项卡上的工作表重命名为“shtPage”,但在VBA项目浏览器中,Excel仍将工作表称为“Sheet1(shtPage)”,则需要使用Excel识别的“Sheet1”名称,不是页面选项卡上显示的“shtPage”名称。

即使您的PrintRange sub声明为公共,您仍然需要更具体地引用它,以便Excel可以找到它,因为您已将它放在工作表的代码部分而不是模块中

更改:

.OnAction = "PrintRange"

它会很好的工作


警告:如果已将页面选项卡上的工作表重命名为“shtPage”,但在VBA项目浏览器中,Excel仍将工作表称为“Sheet1(shtPage)”,则需要使用Excel识别的“Sheet1”名称,不是页面选项卡上显示的“shtPage”名称。

单击按钮时是否要打印当前范围?不是当前范围,而是命名范围。我计划使用按钮的名称作为范围的标识符。例如,如果oSite.SiteID被设置为ENG123,并且命名的范围也被称为ENG123,那么ENG123将被打印出来?你是说CStr?它是一个内部函数。但是,是的,它的格式与CStr相同。单击按钮时您是否试图打印当前范围?不是当前范围,而是命名范围。我计划使用按钮的名称作为范围的标识符。例如,如果oSite.SiteID被设置为ENG123,并且命名的范围也被称为ENG123,那么ENG123将被打印出来?你是说CStr?它是一个内部函数。但是,是的,它的格式与CStr相同。我不敢相信当我在vba中编程时,所有的编程逻辑都会从窗口消失。@graham.reeds-是的,我知道,我在Excel-vba中所做的所有工作中都把头发扯掉了一半。shtPage模块是一个类模块。如果要从Excel的UI(如按钮)调用sub,请将其放入标准模块中。如果不引用自定义对象,就不会直接调用该对象的方法,是吗?VBA有问题,但我不认为这是其中之一。我不敢相信,当我用VBA编程时,所有的编程逻辑都会从窗口消失。@graham.reeds-是的,我知道,我在Excel-VBA中做的所有工作中都把头发扯掉了一半。shtPage模块是一个类模块。如果要从Excel的UI(如按钮)调用sub,请将其放入标准模块中。如果不引用自定义对象,就不会直接调用该对象的方法,是吗?VBA有问题,但我不认为这是其中之一。