我有一个问题,使我在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