【发布时间】:2014-03-08 15:20:27
【问题描述】:
我正在尝试实现一个私有子例程以将工作表添加到活动工作簿(正在使用工作表以便可以选择添加 xlForms、xlWorksheet 等)。
但我遇到了一个奇怪的问题,即新图表相对于工作簿中其他工作表的创建位置。
我首先删除同名的工作表(如果存在),然后使用以下代码:
ActiveWorkbook.Sheets.Add(After:=Sheets(Sheets.count()), _
Type:=sheet_type).Name = sheet_name
其中sheet_type 是枚举XlSheetType 的可选参数,sheet_name 是string。
对于每个可用的参数,例如xlWorksheet,xlDialogSheet,甚至xl4MacroSheet,它都可以正常工作——但由于某种原因,它会在结束前创建xlChart 1 位置,而不是制作它是工作簿中的最后一张。
所以样例 I/O(开始时只有 3 张):
> Create_Sheet "Test", sheet_type:=xlWorksheet
Sheet 1 | Sheet 2 | Sheet 3 | Test
> Create_Sheet "Test", sheet_type:=xlDialogSheet
Sheet 1 | Sheet 2 | Sheet 3 | Test
> Create_Sheet "Test", sheet_type:=xlChart
Sheet 1 | Sheet 2 | Test | Sheet 3
Sheets.count() 在前面的示例中正确返回 3(因为我只从表 1、2 和 3 开始),因此假设它应该将其放置在第三张表之后,但事实并非如此。
尝试使用Sheets.count() + 1 进行测试只会给我一个数组下标超出范围的运行时异常(这是意料之中的)。
我什至只测试了以下基本代码:
ActiveWorkbook.Sheets.Add(After:=Sheets(Sheets.count()), _
Type:=xlChart).Name = "Test"
我仍然得到相同的结果。
所以基本上我的问题是:我在这里做错了吗?为什么不能将图表添加到工作簿的末尾是否有任何具体原因?或者这可能是 VB 中需要修复的问题/错误?
我使用的是 Office 2007,或者这是一个已在较新版本中修复的错误?
任何输入都会有所帮助。
编辑:
值得注意的是,After:=Sheets(Sheets.count()) 产生与After:=Sheets(Sheets.count() - 1) 相同的位置,但仅限于Type:=xlChart 的情况
编辑 2 这更有趣。如果您创建一个图表,请将其作为工作簿中的最后一张工作表,并使用以下代码:
ActiveWorkbook.Charts.Add After:=Charts(1)
Excel 将自动重新调整图表的方向,以便最后一个工作表。
例如,如果您有:
Sheet 1 | Sheet 2 | Sheet 3 | Chart 1
并使用代码,你会得到
Sheet 1 | Sheet 2 | Chart 1 | Chart 2 | Sheet 3
【问题讨论】:
-
这很有趣,我用 Excel 2010 对其进行了测试,得到了相同的响应。
Before似乎正在工作。也把它放在After除了最后一张之外的任何一张都可以。我会继续测试,看看我会发现什么 -
我很高兴这不仅仅是我,但我真的希望有一个解决方案。似乎很奇怪,这个问题只发生在 xlChart 时。
-
见这里:books.google.com/…。似乎是一个已知问题,并且那里有建议的解决方案。
-
@TimWilliams 感谢您的链接。这几乎就是我现在使用的解决方案,这似乎是唯一可用的选项。我猜他们现在可能将其保留用于遗留目的
-
@TimWilliams 很高兴知道。我仍然想知道为什么会这样。我仍然在考虑,但必须有一些可以解释这一点的排除。
标签: vba excel ms-office office-2007