【问题标题】:Excel 2007 VBA - Using Sheets.Add to create a chart at the end of a workbookExcel 2007 VBA - 使用 Sheets.Add 在工作簿末尾创建图表
【发布时间】: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_namestring

对于每个可用的参数,例如xlWorksheetxlDialogSheet,甚至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


【解决方案1】:

好的,我不确定这是否会对您有所帮助,但是是的,它在这里具有相同的奇怪行为,并且找不到任何“干净”的方式来使纸张保持最后,所以我的解决方案是:

ActiveWorkbook.Sheets.Add(After:=Sheets(Sheets.Count()), _
Type:=xlChart).Name = sheet_name
Sheets(sheet_name).Move After:=Sheets(Sheets.Count())

【讨论】:

  • 这看起来是一个很好的解决方法,可能值得接受作为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-26
  • 2017-03-03
  • 1970-01-01
  • 2018-12-29
  • 2012-08-12
  • 2015-11-30
  • 1970-01-01
相关资源
最近更新 更多