尽pipe不IsEmpty(范围(“A1”))条件评估失败

我有一个这个代码的问题,我特意从一个已经创build的图表中加载数据,从3个相关的列如下:

Data1 X1 Y1 Data2 X2 Y2 Data3 X3 Y3 

它的预期行为是非常简单的,它select活动单元格,并进入一个循环:select表单的第一个graphics,评估活动单元格是否为空,如果是,则应该超出循环并结束macros,如果它不是,然后增加新的序列,以Y为横坐标值,以X为纵坐标值,增加一个跟踪值,允许增加图中下一个序列的数目(它在循环之外被初始化为1),用下面的那个改变活动单元格的行。

问题是,它永远不会超出循环(并最终崩溃,因为你不能将更多的256系列添加到一个图表,我改进了另一个版本的代码,如果条件更好,它可以工作;但是仍然增加了空白的系列;这是非常繁琐的删除,如果离开那里可能会混乱的东西)。

看来,条件:不IsEmpty(范围(“A1”))不能正确评估。 我尝试使用Do While Is IsEmpty(Range(“A1”).value),或Do While IsEmpty(Range(“A1”)); 尽pipe不IsEmpty(select)(发回一个关于全局的错误),我尝试了很多其他的东西,但我认为我的types的值是好的,这是一个布尔值,所以它应该按原样。 我还尝试了一个新的工作手册,只有一行,以确保没有任何细胞之前,已经改变了他们的状态,所以他们不会空的程序,但实际上,当我想到最明显的错误,我仍然没有获得正确的行为。

 Sub ScatterSeries() ActiveCell.Offset(0, 0).Range("A1").Select Serie = 1 Do While Not IsEmpty(Range("A1")) ActiveSheet.ChartObjects("Chart 1").Activate ActiveChart.PlotArea.Select ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(Serie).Name = ActiveCell ActiveChart.SeriesCollection(Serie).XValues = ActiveCell.Offset(0, 2) ActiveChart.SeriesCollection(Serie).Values = ActiveCell.Offset(0, 1) Serie = Serie + 1 ActiveCell.Offset(1, 0).Range("A1").Select Loop End Sub 

我读了几个参考,如https://www.udemy.com/blog/excel-vba-do-while/或http://www.fontstuff.com/ebooks/free/fscodeloops.pdf,但我不明白我做的不一样,这会导致程序错误。 任何人都可以请给我见解吗? 我现在觉得很愚蠢。 谢谢。

(我必须说我是vba的初学者,所以我可能犯了非常明显的错误,我只是运行一些行为来看看macros中会出现什么,然后在这里和那里用例子中读到的代码我仍然打算学习正确的语言,但我必须解决今天的问题…:/)

在VBA中使用IsEmpty()来检查variables是否已被赋值,而不是检查单元是否为空。 你的抵消方法也没有适当的声明。

使用这样的东西:

 Sub ScatterSeries() Range("A1").Activate Serie = 1 While Not ActiveCell = "" ActiveSheet.ChartObjects("Chart 1").Activate ActiveChart.PlotArea.Select ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(Serie).Name = ActiveCell.Value ActiveChart.SeriesCollection(Serie).XValues = ActiveCell.Offset(0, 2).Value ActiveChart.SeriesCollection(Serie).Values = ActiveCell.Offset(0, 1).Value Serie = Serie + 1 ActiveCell.Offset(1, 0).Activate Wend End Sub 

此外,你应该总是指定范围对象的.Value属性(是的,我知道这是一个Range对象的默认方法),但是当你testing一个条件的值,你要确保它绝对看着价值,没有别的。

试了这个评论,但太长了。

看起来问题是一个无限循环。 我认为单元格A1中有一些内容(可能是文本Data1?),而代码中的任何内容都不会查看其他任何地方或更改此单元格中的值。

 Do While Not IsEmpty(Range("A1")) 

你已经有一个名为“意甲”的整数“柜台”,所以我build议只是改变“即将到来”

 Do While Not IsEmpty(Range("A1").Offset(Serie-1,0)) 

减1的原因是Serie初始设置为1,而您在第一次传球时实际上需要偏移零。

如果这不能解决你的问题,我可以在今天晚些时候更好地看看。

本来会评论你的答案,但时间太长了。

谢谢你所以你是正确的关于IsEmpty,我读了很多有关使用IsEmpty评估空单元格的代码,但只是改变“尽pipe不IsEmpty(范围(”A1“))而不是工作而不ActiveCell = “在我以前的代码。

实际上我只是改变了这个状况,因为你提供的那个没有为我工作,而且它没有问题。 谢谢!

  • 你的代码发回给我错误1004,“由应用程序或对象定义的错误”,它似乎不喜欢的行:ActiveChart.SeriesCollection(Serie).XValues = ActiveCell.Offset(0,2).Value。 我也读过Wend是“过时的”语法,所以我没有使用它。

但是我保留关于语法改进的一些教训,我会很乐意接受这些,正如我所说的,我只是一个关于VBA的debugging者,我没有正确地学习语法。 我现在才明白为什么这些在那里不适合我。

戴夫·布朗的解决scheme也与原始代码几乎完美地工作,它最终只添加了一个空系列,因为它不会从第一个空单元的循环中出来,而只会在第二个空单元上出现。 这是我可以通过设置“系列”在0开始改变方式/时刻增量**。 你说的是无限循环,对我来说很明显是一回事,但是我没有提到,因为我相信这个时候的评价有些不对,而只是评价了错误的东西。 另一方面,我最初并不明白为什么,因为我确实相信“Range(”A1“)”是通过改变活动单元的事实而改变的。 事实并非如此。 初学者失败。

**,但改变戴夫布朗解决scheme

 Serie = 0 Do While Not IsEmpty(Range("A1").Offset(Serie, 0)) ActiveSheet.ChartObjects("Chart 1").Activate ActiveChart.PlotArea.Select ActiveChart.SeriesCollection.NewSeries Serie = Serie + 1 ActiveChart.SeriesCollection(Serie).Name = ActiveCell ActiveChart.SeriesCollection(Serie).XValues = ActiveCell.Offset(0, 2) ActiveChart.SeriesCollection(Serie).Values = ActiveCell.Offset(0, 1) ActiveCell.Offset(1, 0).Range("A1").Select Loop 

仍然犯同样的错误…? 它不应该,因为它在开始时评估当前单元格,并且“系列”现在等于当前的总垂直偏移量。

最后,我想出了另一个解决scheme:不IsEmpty(ActiveCell),它也解决了这个问题(但正如所指出的那样,它不是完美的,因为“IsEmpty”是不适当的使用)