2016-06-20 60 views
0

我有一個直接的問題:我想編輯word文檔中的所有圖表。更確切地說,我想在所有圖表中執行搜索和替換(他們的數據更加精確)。現在我的方法到目前爲止是這樣做的:Vba:通過Excel.Application在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 

有沒有人有想法?我會很感激!謝謝:)

+0

你甚至試圖手動做到這一點?試着錄製一個宏,看看你得到了什麼? –

+0

@ScottHoltzman不要問「爲什麼?」,而是問「爲什麼不?」可能有更多的圖表比使用宏更實用。 – mbomb007

+0

嗨斯科特,在這種情況下宏錄製不好,因爲它不包括你在數據表窗口(或任何人要求這樣做)中所做的動作。這是因爲編輯數據發生在宏記錄器不包括的Excel應用程序中。 –

回答

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 
+0

嘿辛迪感謝您的回答!請查看我從其他帳戶提供的答案,並讓我知道您的想法!最好的問候,最大 –

0

@CindyMeister:嘿,這是從不同的帳戶原始的海報。感謝您的回答!但是我已經嘗試了你的方法,它似乎不適用於我的辦公室安裝,也不適用於我嘗試過的任何其他方法(我在自己的win10電腦上使用Office 2013,我嘗試在機器上運行代碼在win7/win10上運行Office 2010/2013)。每當您嘗試在同一個圖表上運行您提供的代碼多次時,就會出現問題。然後會發生以下運行時錯誤(可能不是德語的完全正確翻譯):對象'chartdata'的方法'工作簿'失敗,運行時錯誤-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或更早版本。我沒有機會在運行Office 2016的機器上測試它,但不幸的是。

你可以做這件事嗎?

+0

還有一個問題,我不明白。我必須聲明一個Excel.Range來做我必須做的事情。現在,只要我擴展我的代碼來覆蓋該功能(使用set rng = ...之類的東西),就會出現上述同樣的問題。所以,如果你想在chartdata.workbook上運行一些代碼,那麼看起來你不能設置excel對象。 –

+0

編輯:我確實在辦公室2016的機器上運行它,它工作。當我說你很好時,只要你不使用類似Excel.Workbook = chartdata.workbook的東西,我也不完全正確。你可以這樣做,但只要你用Excel.Workbook做了什麼,你就會遇到問題。我發現使用Excel.Range沒有那麼優雅的解決方法,但這種行爲對我來說似乎很奇怪。 –

+0

在if中,95%的代碼是重複的。請提取兩個變量來設置strA或b,並在if後面使用它們作爲單個替換中的參數。 –

0

首先,您需要激活Word圖表對象,這應該工作

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)