Do While Is IsEmpty(范围(" A1"))条件评估失败

时间:2014-11-12 11:21:02

标签: excel vba excel-vba

我的代码有问题,我专门用来“加载”已经创建的图形中的数据,来自3个相关的列,如下所示:

Data1 X1 Y1
Data2 X2 Y2
Data3 X3 Y3

它的预期行为非常简单,它选择活动单元格并进入循环: 选择工作表的第一个图形,评估活动单元格是否为空,如果是,它应该超出循环并结束宏,如果不是,则向其添加新系列,将Y作为横坐标值并将X作为纵坐标值,增加一个跟踪值,允许增加图形中下一个系列的数量(它在循环外部初始化为1),将活动单元格的行改为紧接下面的那一行。

问题是它永远不会超出循环(并最终崩溃,因为你不能将更多的256系列添加到图形中,我在另一个版本中使用if条件改进了代码以使其更好,它工作;但仍然添加空系列;删除非常繁琐,如果留在那里可能会弄乱。)

似乎条件:Do While Not IsEmpty(范围(“A1”))无法正确评估。 我尝试使用Do While Not IsEmpty(Range(“A1”)。value),或者Do While IsEmpty(Range(“A1”)); Do While Not IsEmpty(选择)(发回有关全局的错误),我尝试了很多其他的东西,但我认为我的类型的值是好的,它是一个布尔值,所以它应该按原样工作。 我还尝试了一个新工作簿,新工作表只有一行,以确保之前没有任何事情与细胞混乱,并且会改变他们的状态,所以他们不会为程序是空的, 但实际上,当我想到最明显的错误时,我仍然无法获得正确的行为。

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的初学者,所以我可能犯了很明显的错误,我只是运行了一些动作来查看宏中出现的内容,然后用这里的示例中读取的代码片段进行调整那里(我仍然计划正确地学习语言,但我今天必须解决问题......:/)

4 个答案:

答案 0 :(得分:2)

在VBA中使用IsEmpty()来检查变量是否已分配属性,而不是检查单元格是否为空。您的偏移方法也未正确声明。

使用类似的东西:

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对象的默认方法)但是当您在值上测试条件时,您希望是确定它肯定会看到价值,而不是别的。

答案 1 :(得分:1)

将此视为评论,但时间过长。

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

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

你已经有一个整数"计数器"名为Serie,所以我建议改变Do While to be

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

减号的原因是Serie最初设置为1,你实际上想要在第一次传球中偏移零。

如果这还没有解决您的问题,我可以在当天晚些时候更好地查看。

答案 2 :(得分:1)

会评论你的答案,但这太长了。

谢谢S O 你是关于IsEmpty的,我读了很多关于使用IsEmpty来评估空单元格的代码,但这只是在改变时不起作用 'Do While Is IsEmpty(范围(“A1”))   要做而不是ActiveCell =“” 在我之前的代码中。

我实际上只是改变了这个条件,因为你提供的那个不适合我*,它使它工作没有问题。 谢谢!

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

但是我保留了关于价值的语法改进的教训我很乐意接受这些,因为我说我只是关于VBA的推文,我没有正确学习语法。 我现在要了解为什么这些对我不起作用。

Dave Brown解决方案也可以与原始代码完美配合,最后只添加一个空系列 因为它不会在第一个空单元格中循环,而只在第二个单元格上循环。 通过首先将“Series”设置为0并改变它增加的方式/时刻**,我可以纠正这一点。 你对无限循环是正确的,对我来说很明显它是一个,但我没有提到,因为我认为while评估有些错误,而它只评估错误的东西。 另一方面,我最初没有理解为什么,因为我确实认为“范围(”A1“)”因改变活动细胞的事实而改变了。事实并非如此。初学者失败。

**但是将Dave Brown解决方案更改为

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

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

最后,我提出了另一个解决方案: 做不是IsEmpty(ActiveCell) 这也解决了这个问题(但正如S O指出的那样,由于“IsEmpty”的使用不当而不完美)

答案 3 :(得分:-1)

不是很优雅,但这个很管用

Private Sub Countpatienten()
    q = 2

    With Worksheets("Besuchsplan")
      Do Until Cells(q, A).Value = ""
        q = q + 1
      Loop
    End With
 
    Worksheets("Grunddaten").Cells(2, B) = q
End Sub