7

我有一个包含大量图表的电子表格和一张包含大量数据的表格。

我已经使用在每个图表上绘制了数据

=Sheet1!$C5:$C$3000

这基本上只是在图表上绘制 C5 到 C3000 中的值。

通常,尽管我只想查看数据的子集,例如,我可能只想查看前 1000 行。目前要做到这一点,我必须修改每个图表中的公式,这需要时间。

你知道简化这个的方法吗?理想情况下,如果我可以在单张纸上有一个单元格,它可以从行号中读取并绘制从 C5 到 C“行号”的所有图表,那将是最好的。

任何帮助将非常感激。

4

7 回答 7

6

好的,我必须做更多的研究,这里是如何使它工作,完全在电子表格中(没有 VBA):

使用 A1 作为所需范围的结尾,并且图表与数据在同一张纸上:

将数据的第一个单元格 (C5) 命名为命名范围,例如 TESTRANGE。
创建了一个命名范围 MYDATA 作为以下公式:

=OFFSET(测试, 0, 0, Sheet1!$A$1, 1)

现在,转到图表 SOURCE DATA 对话框的 SERIES 选项卡,并将 VALUES 语句更改为:

=Sheet1!MYDATA

现在每次更改 A1 单元格值时,它都会更改图表。

感谢 Robert Mearns 发现了我之前回答中的缺陷。

于 2008-10-13T16:22:35.940 回答
3

这可以通过两个步骤来实现:

  • 创建动态命名范围
  • 添加一些 VBA 代码以将图表数据源更新为命名范围

创建一个名为 Range 的动态

在数据表的单元格中输入数据范围内的行数。

在您的数据表(插入 - 名称 - 定义)上创建一个名为MyRange的命名范围,其公式类似于:

=OFFSET(Sheet1!$A$1,0,0,Sheet1!$D$1,3)

更新公式以匹配您的布局

  • Sheet1!$A$1将此设置为数据范围的左上角
  • Sheet1!$D$1将此设置为包含行数的单元格
  • 3将此值设置为列数

测试命名范围是否正常工作:

选择下拉菜单 Edit - Go To,在参考字段中键入MyRange 。应选择图表的数据区域。

添加一些VBA代码

打开 VBA IDE (Alt-F11)

在 VBAProject 窗口中选择 Sheet1 并插入此代码

Private Sub Worksheet_Change(ByVal Target As Range)

        If Target.Address <> "$D$1" Then Exit Sub
    'Change $D$1 to the cell where you have entered the number of rows
    'When the sheet changes, code checks to see if the cell $D$1 has changed

       ThisWorkbook.Sheets("Sheet1").ChartObjects(1).Chart.SetSourceData _
         Source:=ThisWorkbook.Sheets("Sheet1").Range("MyRange")
    '  ThisWorkbook.Sheets("Chart1").SetSourceData _
         Source:=ThisWorkbook.Sheets("Sheet1").Range("MyRange")
    'The first line of code assumes that chart is embedded into Sheet1
    'The second line assumes that the chart is in its own chart sheet
    'Uncomment and change as required

    'Add more code here to update all the other charts

End Sub

需要注意的事项

不要直接使用命名范围作为图表的数据源。如果您输入命名范围“MyRange”作为图表的源数据 - 数据范围,Excel 会自动将命名范围转换为实际范围。因此,您命名范围的任何未来更改都不会更新您的图表。

性能可能会受到上面列出的方法的影响。

命名范围中的OFFSET函数是“易失性的”,这意味着它会在工作簿中的任何单元格计算时重新计算。如果性能是一个问题,请将其替换为INDEX公式。

=Sheet1!$A$1:INDEX(Sheet1!$1:$65536,Sheet1!$D$1,2)

每次在 Sheet1 上更改数据时都会触发代码。如果性能是一个问题,请将代码更改为仅在请求时运行(即通过按钮或菜单)。

于 2008-10-14T00:34:53.887 回答
1

您可以在 Excel 中动态设置图表的范围。您可以使用以下 VBA 代码来执行此操作:

Private Sub Worksheet_Change(ByVal Target as Range)
    Select Case Target 
    Case Cells(14, 2)
        Sheet1.ChartObjects(1).Chart.SetSourceData Range("$C5:$C$" & Cells(14,2))
    ...
    End Select
End Sub

在这种情况下,包含要包含的最后一行的编号的单元格是 B14(在引用 Cells 对象时记住 row first)。如果您想完全在代码中执行此操作,也可以使用变量而不是 Cells 引用。(这在 2007 年和 2003 年都有效。)您可以将此过程分配给一个按钮,并在更新包含最后一行的单元格后单击它以刷新图表。

但是,这可能不是您想要做的……我不知道有一种方法可以直接在图表中使用公式来指定源数据。

编辑:正如 PConroy 在评论中指出的那样,您可以将此代码放在该工作表的 Change 事件中,这样既不需要按钮也不需要组合键来运行代码。您还可以添加代码,使其仅在编辑匹配单元格时更新每个图表。

我已经更新了上面的示例以反映这一点。

于 2008-10-13T16:07:47.140 回答
1

您可以查看动态范围。如果使用 OFFSET 函数,则可以指定起始单元格以及要选择的行数和列数。 该站点提供了一些有关将名称分配给 OFFSET 范围的有用信息。

于 2008-10-13T16:14:59.230 回答
1

+1 为名称解决方案。

请注意,名称实际上并没有真正引用范围,它们引用了公式。这就是为什么您可以将名称设置为“=OFFSET(...)”或“=COUNT(...)”之类的名称。您可以创建命名常量,只需让名称引用类似于“=42”。

命名公式和数组公式是我发现自己一遍又一遍地应用于不太强大的用户工作表的两种工作表技术。

于 2008-10-13T19:22:48.463 回答
0

一种简单的方法是隐藏您不想包含的行/列 - 当您转到图表时,它会自动排除隐藏的行/列

于 2009-08-17T20:52:10.840 回答
0

增强@Robert Mearns 的答案,这里是如何使用动态单元格范围仅使用 Excel 公式的图形(不需要 VBA):

创建一个名为 Range 的动态

假设您有 3 列,例如:

A5 | 时间 | 数据1 | 数据2 |

A6 | 00:00 | 123123 | 234234 |

...

A3000 | 16:54 | 678678 | 987987 |

现在,您的数据范围可能会根据您可能拥有的数据而变化,例如您有 20 行数据、3000 行数据甚至 25000 行数据。您希望有一个可以自动更新的图表,而无需在每次更新数据本身时重新设置数据范围。

以下是如何简单地做到这一点:

  1. 定义另一个单元格,它的值将包含有数据的占用单元格的数量,并将公式=COUNTIF(A:A,"<>"&"")放入其中。例如,这将在单元格 D1中。

  2. 转到“公式”选项卡->“定义名称”以定义名称范围。

  3. 在“新名称”窗口中:

    一世。为您的数据范围命名,例如 DataRange

    ii. 在“引用”中将公式设置为=OFFSET(Sheet1!$A$1, 0, 0,Sheet1!$D$1,3)

    在哪里:

    • Sheet1!$A$1=> 参考:是您要作为偏移基础的参考。

    • 0=> Rows:是您希望结果的左上角单元格引用的行数,向上或向下。

    • 0=> Columns:是您希望结果的左上角单元格引用的左侧或右侧的列数。

    • Sheet1!$D$1=> 高度:是您希望结果的高度,以行数为单位。

    • 3=> 宽度:是您希望结果的宽度,以列数为单位。

  4. 添加图表,然后在“选择数据源”窗口的图表数据区域中,插入您创建的公式。例如:=Sheet1!DataRange

缺点:如果直接使用命名范围作为图表的数据源,Excel 会自动将命名范围转换为实际范围。因此,您命名范围的任何未来更改都不会更新您的图表。

为此,您需要编辑图表并将范围重新设置为=Sheet1!DataRange每次。这可能不是那么有用,但它比手动编辑范围要好......

于 2018-04-08T11:48:08.107 回答