vba - Do While Not IsEmpty(Range ("A1")) 条件评估失败

标签 vba excel

我对这段代码有一个问题,我专门编写该代码是为了从 3 个关联的列中“加载”已创建的图表中的数据,如下所示:

Data1 X1 Y1
Data2 X2 Y2
Data3 X3 Y3

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

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

条件:Do While Not IsEmpty(Range("A1")) 似乎无法正确评估。 我尝试使用 Do While Not IsEmpty(Range("A1").value) 代替,或 Do While IsEmpty(Range("A1"));执行 While Not IsEmpty(Selection) (发送回有关全局的错误),我尝试了很多其他操作,但我认为我的值类型没问题,它是一个 bool 值,所以它应该按原样工作。 我还尝试了一个新的工作簿,其中有一张新工作表,只有一行,以确保之前没有任何单元格被弄乱,并且会改变它们的状态,这样它们对于程序来说就不会是空的, 但实际上,当我思考最明显的错误时,我仍然无法获得正确的行为。

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

最佳答案

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

使用这样的东西:

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 对象的默认方法),但是当您测试值的条件时,您需要确保它绝对是只看值(value),不看其他。

关于vba - Do While Not IsEmpty(Range ("A1")) 条件评估失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26885727/

相关文章:

excel - 如何使用VBA 'lock a file for editing'

vba - 使用VBA用公式替换零星的#N/A单元格

excel - 在 VBA 中用今天的日期替换错误 #N/A

vba - 记录 Excel 自动完成的 VBA 代码

vba - FormulaR1C1的作用是什么?

Excel VBA : how to check for calculated column?

vba - Instr 条件不适用于 2 个或更多条件

Excel VBA FOR LOOP 在第 1000 次崩溃

python - 如何将爬取数据列表转换为 Excel 列?

c# - 读取 Excel (.xls) 模板,用文本框值替换变量并在 C# 中保存 Excel 文件