Vba 不为空时执行(范围(“A1”)条件评估失败

Vba 不为空时执行(范围(“A1”)条件评估失败,vba,excel,Vba,Excel,我对这段代码有一个问题,我专门将其用于从3个相关列中“加载”已创建图形中的数据,如下所示: Data1 X1 Y1 Data2 X2 Y2 Data3 X3 Y3 Sub ScatterSeries() Range("A1").Activate Serie = 1 While Not ActiveCell = "" ActiveSheet.ChartObjects("Chart 1").Activate ActiveChart.PlotArea.Select A

我对这段代码有一个问题,我专门将其用于从3个相关列中“加载”已创建图形中的数据,如下所示:

Data1 X1 Y1
Data2 X2 Y2
Data3 X3 Y3
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
其预期行为非常简单,它选择活动单元格并进入循环: 选择工作表的第一个图形,计算活动单元格是否为空,如果为空,则应跳出循环并结束宏,如果为空,则向其中添加新的系列,将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(Selection)(这会返回一个关于全局的错误),我尝试了很多其他方法,但我认为我的值类型是可以的,它是一个布尔值,所以它应该按原样工作。 我还尝试了一个新的工作簿,它有一张新的工作表,只有一行,以确保以前没有任何单元格被弄乱,并且会改变它们的状态,这样它们在程序中就不会是空的, 但实际上,当我思考最明显的错误时,我仍然无法获得正确的行为

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
我很少读到这样或那样的参考文献,但我看不出我在做什么,这会导致程序出错。 有谁能告诉我这方面的见解吗?我现在觉得自己很愚蠢。 谢谢


(我必须说,我是vba的初学者,所以我可能犯了非常明显的错误,我只是运行一些操作来查看宏中会出现什么,然后在这里和那里的示例中使用少量代码对其进行调整(我仍然计划正确地学习该语言,但我必须解决今天的问题…:/)尝试将此作为评论,但太长了

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

Do While Not IsEmpty(Range("A1"))
您已经有了一个名为Serie的整数“counter”,因此我建议您只需在需要时更改Do

Do While Not IsEmpty(Range("A1").Offset(Serie-1,0))
减1的原因是,一开始,Serie设置为1,而您实际上希望在第一次通过时偏移量为零

如果这不能解决您的问题,请再次发布,我可以在今天晚些时候仔细查看。

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

使用类似以下内容:

Data1 X1 Y1
Data2 X2 Y2
Data3 X3 Y3
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属性(是的,我知道这是范围对象的默认方法),但是当您测试值的条件时,您需要确保它确实在查看值,而不是其他任何内容。

会对您的答案进行注释,但它太长了

谢谢 关于IsEmpty,你是对的,我读了很多关于使用IsEmpty计算空单元格的代码,但如果只是更改,那就行不通了 '不为空时不为空(范围(“A1”)) 不使用ActiveCell时执行的操作=“” 在我以前的代码中

事实上,我只是改变了这个条件,因为你提供的那个对我不起作用*,它使它毫无问题地起作用。 谢谢

  • 您的代码返回错误1004,“由应用程序或对象定义的错误”,它似乎不喜欢这样的行: ActiveChart.SeriesCollection(Serie).XValues=ActiveCell.Offset(0,2).Value。 我还读到Wend是“过时的”语法,所以我没有使用它
但是我保留了关于语法改进和价值的课程,我很乐意接受这些,因为我说过我只是一个VBA的调整者,我没有正确地学习语法。 我现在必须明白为什么这些对我不起作用

该解决方案也几乎完美地与原始代码一起工作,它最后只添加了一个空序列 因为它不会在第一个空单元格上跳出循环,而只在第二个空单元格上跳出循环。 我可以先将“Series”设置为0,然后更改其递增的方式/时刻**,来纠正这一点。 你对无限循环的看法是对的,对我来说这很明显是一个循环,但我没有提到这一点,因为我认为while的计算有些错误,而它只计算了错误的东西。 另一方面,我一开始没能理解为什么,因为我确实相信“范围(“A1”)是因为改变了活动单元格而改变的。事实并非如此。初学者失败

**但改变解决方案

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
仍然犯同样的错误…?它不应该,因为它在开始时计算当前单元格,“系列”现在等于当前总垂直偏移

最后,我提出了另一个解决方案,即: 不为空时执行(ActiveCell)
这也解决了问题(但正如所指出的,它并不完美,因为“IsEmpty”的使用不当)

不是很优雅,但这一个有效

Private Sub countten()
q=2
带工作表(“Besuchsplan”)
直到单元格(q,A)为止。Value=“”
q=q+1
环
以
工作表(“Grunddaten”)。单元格(2,B)=q
端接头

+1 for
IsEmpty()在VBA中用于检查变量是否被分配了属性,而不是检查单元格是否为空。
我认为这可能是这里的主要错误。是的,我在下面回答了这个问题(注释太短),我看到了整页的代码都是用这个作为“参考”的