【问题标题】:Excel VBA update chart not visibleExcel VBA 更新图表不可见
【发布时间】:2020-07-21 11:00:10
【问题描述】:

我有一个 excel 文件,它遍历不同的 excel 文件以更新它们并从中创建一个 PDF 文件。

宏遍历行并打开文件。此代码打开文件:

Private Sub openFile(row As Integer)
    Dim filePath As String
    Dim wb As Workbook

    filePath = Application.ActiveWorkbook.Path + "\" + allRows(row).filename
    Set wb = Workbooks.Open(filePath)
    Application.Run "RefreshEntireWorksheet"
    
    Application.OnTime Now + (TimeSerial(0, 1, 59)), "'ThisWorkbook.updateCharts """ & row & "'"
    
    Application.OnTime Now + (TimeSerial(0, 2, 59)), "'ThisWorkbook.createEmail'"
End Sub

现在如果有多个文件,只有 1 个文件正确更新了图表(文件在前面)。 updateCharts 代码似乎根本不起作用:

Sub updateCharts(row As Integer)
    
    Dim SheetName As String
    Dim wb As Workbook
    
    SheetName = "Sheet1"
    With Application
        .ScreenUpdating = True
        .EnableEvents = True
    End With


    Set wb = Workbooks(allRows(row).filename)
    wb.Activate
    wb.Sheets(SheetName).Activate
    For Each cht In wb.Sheets(SheetName).ChartObjects
        cht.Chart.Refresh
        DoEvents
    Next cht
    
End Sub

我检查了以下链接以获取答案,但没有任何帮助:

他们都建议添加DoEvent,但这不起作用。 所以问题是,如何通过 VBA 更新不同工作簿中的图表?

【问题讨论】:

  • 当您说:updateCharts 代码似乎根本不起作用时,它会抛出错误吗?它运行时没有错误但什么也没发生?请提供更多细节。另外,allRows 是什么?即它是什么数据类型?你不应该使用像Activate 这样的东西。如果您使您的工作簿/工作表符合条件,则无需激活它们(除非您这样做只是为了看看会发生什么?)
  • @Zac 代码运行良好,没有错误,但什么也没有发生。 Activate 部分已被删除,因为它们弄乱了生成的 PDF。 allRows 是一个简单地引用所有行的组合属性。不同的列是不同的属性。那部分工作得很好,只是图表没有正确更新。从我目前收集到的信息来看,触发CellChanged 事件应该足够了,因为它们不会在后台文件上触发

标签: excel vba excel-2016


【解决方案1】:

我过去也遇到过类似的问题,并且观察到它们似乎随着 Excel 版本的增加而增加;我怀疑这是一个与副作用发生冲突的情况,导致其他地方的效率增强,以加快一般应用程序的速度(减少屏幕上不必要的绘图等)

我发现(有时)有效的一件事是尝试通过将WindowState 设置为自身来强制应用程序窗口刷新/重绘:

Application.WindowState = Application.WindowState

这类似于有些人建议使用ActiveWindow.SmallScroll down:=0ActiveWindow.SmallScroll 0ActiveWindow.SmallScrollActiveWindow.SmallScroll down:=1: ActiveWindow.SmallScroll up:=1

将此与ScreenUpdating 切换和DoEvents 结合使用,您可以创建一个这样的快速子例程:

Public Sub RedrawScreen()
    Dim ScreenUpdating As Boolean
    ScreenUpdating = Application.ScreenUpdating

    Application.ScreenUpdating = True
    Application.WindowState = Application.WindowState
    DoEvents

    Application.ScreenUpdating = ScreenUpdating
End Sub

【讨论】:

  • 我在刷新所有图表后尝试调用你的代码,但没有任何反应
  • @XtremeBaumer 图表是否在宏运行之后显示正确的数据?这里有两种可能性:如果图表在宏完成后显示错误的东西,那么图表的代码是错误的(你需要什么代码来更新图表提取数据的 table从?),我的回答不适用。如果您的图表在宏完成后确实正确显示,但在宏期间没有输出正确的图像,那么...嗯,需要更多调查,因为这就是这段代码应该修复
  • 图表根本不显示任何数据,即使在宏完成后也是如此。如果我在宏之后进入文件并触发CellChanged 事件,则该文件的每个图表中都会显示正确的数据。它仅发生在不在前台的文件中。图表的数据来自在文件打开时更新的插件公式
  • @XtremeBaumer 您的CellChanged 事件代码有什么作用?您是否需要手动触发它 - 通过Application.Run,或者通过更改单元格然后DoEventsing - 作为宏的一部分?
  • CellChanged 事件代码循环遍历所有图表以设置 y 轴的最小值和最大值。到目前为止,我没有触发CellChanged 事件的宏方法。我在单元格中手动输入内容,然后按 Enter 触发事件
【解决方案2】:

试试这个(它适用于我 - Excel 2016): 正如其他人之前所说,DoEvents 必须在您的代码中 删除电子表格单元格的所有颜色:所有单元格的背景必须是“无背景”;仅对所有单元格的文本使用自动颜色(黑色)。 保存、关闭并重新打开文件。现在启动您的宏并查看您的图表。 我不知道它为什么会起作用,但是…………它起作用了! 对于那些比我更有能力的人:相反:如果您的图表随着宏的运行而更新,请尝试为某些文本或某些单元格着色。图表将不再更新。 Microsoft 专家应该检查发生了什么。 希望这可以帮助。再见,bb。

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
相关资源
最近更新 更多