我对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我找到了一种解决方法,即将工作簿设置在另一个子工作簿中,但是想了解它为什么不以这种方式工作。请有人可以提供建议吗?
三江源。
答案 0 :(得分:1)
在CommandButton2_Click()
中,您未声明wb
。所以它是Variant数据类型。这与ByRef wb As Workbook
不兼容。
所以添加
Dim wb As Workbook
为避免此类更多错误,请将Option Explicit
放在每个模块的顶部。
它强制执行变量声明并在编译时报告未声明或拼写错误的变量/常量。 要在新模块中自动执行此操作,请在VBA编辑器中设置Require Variable Declaration选项。
修改:演示
'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
答案 1 :(得分:1)
这是因为您没有明确声明<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<remove name="YourRuleName"/>
<rule name="YourSubFolderRuleName" patternSyntax="Wildcard">
<match url="*"/>
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
</conditions>
<action type="Rewrite" url="index.php"/>
</rule></rules>
</rewrite>
</system.webServer>
</configuration>
变量,因此隐式假设为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