从命令按钮VBA传递工作簿



我有一个问题,使我在VBA中感到困惑。我有一个命令按钮,当单击时,我想将一个变量=设置为工作簿对象,然后将此对象传递给另一个子。我无法弄清为什么我不能将其传递给潜艇,我看不出为什么我在做什么不起作用。代码如下:

Private Sub CommandButton2_Click()
Workbooks.Open Filename:=TextBox1.Text
Set wb = ActiveWorkbook
CreateChart wb
End Sub
Sub CreateChart(ByRef wb As Workbook)
'PURPOSE: Create a chart (chart dimensions are not required)
Dim rng As Range
Dim cht As Object
'Your data range for the chart
  Set rng = wb.ActiveSheet.Range("A24:A27")
'Create a chart
  Set cht = ActiveSheet.Shapes.AddChart2
'Give chart some data
  cht.Chart.SetSourceData Source:=rng
'Determine the chart type
  cht.Chart.ChartType = xlXYScatterLines
End Sub

nb我找到了一个解决方法,它是将工作簿设置在另一个子中,但想了解为什么它不起作用。请任何人提供建议吗?

谢谢。

CommandButton2_Click()中,您不声明wb。因此,这是一种变体数据类型。这与ByRef wb As Workbook不兼容。

所以添加

Dim wb As Workbook

为避免这样的更多错误,将Option Explicit放在每个模块的顶部。

它在编译时执行变量声明并报告未宣布或拼写错误的变量/常数。要在新模块中自动将其设置,请在VBA编辑器中设置"需求变量声明"选项。

编辑:demo

'Option Explicit
Sub Demo_Fail()
    Set wb = ActiveWorkbook
    CreateChart wb      ' Compile error: ByRef argument type mismatch
End Sub
Sub Demo_Success()
    Dim wb As Workbook
    Set wb = ActiveWorkbook
    CreateChart wb
End Sub
Sub CreateChart(ByRef wb As Workbook)
    Debug.Print wb.Name
End Sub

这是因为您没有明确声明wb变量,因此它被隐式地假定为Variant类型,而CreateChart接受Workbook类型参数

使用:

Private Sub CommandButton1_Click()
    Dim wb As Workbook ' declare wb of Workbook type
    Workbooks.Open Filename:=TextBox1.Text
    Set wb = ActiveWorkbook
    CreateChart wb
End Sub

,但您甚至可以将其缩短到:

Private Sub CommandButton1_Click()        
    CreateChart Workbooks.Open(Filename:=TextBox1.Text)
End Sub

最新更新