Vba:通过Excel.Application

时间:2016-06-20 18:13:17

标签: excel excel-vba ms-word word-vba ole vba

我有一个直截了当的问题:我想编辑word文档中的所有图表。更确切地说,我想在所有图表中执行搜索和替换(他们的数据更加精确)。到目前为止我的方法是做这样的事情:

Dim appExcel as Excel.Application
Dim wb as Excel.Workbook
Dim ws as Excel.Worksheet
Dim shp as InlineShape
Dim cht as Word.Chart

For each shp in ActiveDocument.InlineShapes
  If shp.HasChart then
    set cht = shp.Chart
    'Here comes the Question: how to assign the chartdata.workbook to wb?
  end if
next shp

有人有想法吗?我会非常感激!谢谢:))

3 个答案:

答案 0 :(得分:1)

要回答您在代码中输入评论的问题:只需使用Set wb = cht.chartdata.workbook

回答案文中隐含的问题 - "搜索和替换数据" - 您可以通过对象模型访问基础图表数据。如果您需要进行任何大小调整,那么关键是数据位于ListObject(Excel表格)中。这里有一些示例代码,可以深入到数据中的单元格:

Set ils = ActiveDocument.InlineShapes(index)
Set c = ils.Chart
Set wb = c.ChartData.Workbook
Set ws = wb.Worksheets(1)
Set lo = ws.ListObjects(1)
lo.Resize wb.Application.Range("A1:D7")
ws.Cells(6, 1).value = "New category"
ws.Cells(6, 2).value = 6.8

答案 1 :(得分:0)

@CindyMeister:嘿,这是来自不同帐户的原始海报。感谢您的回答!但是我已经尝试了你的方法,它似乎不适用于我的办公室安装,也不适用于我尝试的任何其他(我自己在win10电脑上使用Office 2013,我试图在机器上运行代码在win7 / win10上运行Office 2010/2013)。每当您尝试在同一图表上运行多次提供的代码时,就会出现问题。接下来会发生以下运行时错误(这可能不是德语中完全正确的翻译):对象'chartdata'的方法'workbook'失败了runtimeerror -2147467259(80004005)。正如我所说,这个问题只出现在第一次运行之后。所以你的代码确实运行了,但只运行一次!也就是说,我找到了一个似乎很容易实现的解决方案,甚至可以在我的机器上运行得更快。这是:

Dim strA As String: strA = "Search"
Dim strb As String: strb = "Replace"

Dim cht As Word.Chart
Dim doc As Word.Document
Dim ils As Word.InlineShape

Set doc = ActiveDocument
Set ils = doc.InlineShapes(1)
Set cht = ils.Chart

If cht.ChartData.Workbook.Sheets(1).Cells(1, 2) = strA Then
    cht.ChartData.Workbook.Sheets(1).Cells.Replace What:=strA, Replacement:=strb, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, ReplaceFormat:=False
Else
    cht.ChartData.Workbook.Sheets(1).Cells.Replace What:=strb, Replacement:=strA, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, ReplaceFormat:=False
End If

cht.ChartData.Workbook.Close

cht.Refresh

Set cht = Nothing
Set ils = Nothing

因此,只要您不将chartdata.workbook分配给Excel.Workbook变量,而是直接使用chartdata.workbook就可以了。这在所有运行Office 2013和win10或win7的多台机器上进行了测试。它不适用于Office 2010或更快。不幸的是,我没有机会在运行办公室2016的机器上进行测试。

你可以做点什么吗?

答案 2 :(得分:0)

首先需要激活Word Chart对象,这应该可以正常工作

    Dim oWordChartAsInlineShape As InlineShape
    Set oWordChartAsInlineShape = oDocument.InlineShapes(1)

    Dim oWordChart As Word.Chart
    Set oWordChart = oWordChartAsInlineShape.Chart

    oWordChart.ChartData.Activate

    Dim oChartWorkbook As Excel.Workbook
    Set oChartWorkbook = oWordChart.ChartData.Workbook

    Debug.Print oWordChart.ChartData.Workbook.Sheets(1).Cells(1, 1)