2015-12-03 98 views
0

我在一張Excel表格中有幾個圖表, 在另一個Excel表格中,我創建了一個表格來列出上表中列出的所有圖表,我可以找到圖表名稱和在哪張紙上,還有圖表類型。獲取圖表區域重疊的單元格區域

但我想知道這個圖表的單元格範圍是什麼,即在圖表對象所在的單元格之上。我如何得到這個?

這裏是我的代碼

Enum myEnum 
    xl3DArea = -4098 
xl3DAreaStacked = 78 
xl3DAreaStacked100 = 79 
xl3DBarClustered = 60 
xl3DBarStacked = 61 
xl3DBarStacked100 = 62 
xl3DColumn = -4100 
xl3DColumnClustered = 54 
xl3DColumnStacked = 55 
xl3DColumnStacked100 = 56 
xl3DLine = -4101 
xl3DPie = -4102 
xl3DPieExploded = 70 
xlArea = 1 
xlAreaStacked = 76 
xlAreaStacked100 = 77 
xlBarClustered = 57 
xlBarOfPie = 71 
xlBarStacked = 58 
xlBarStacked100 = 59 
xlBubble = 15 
xlBubble3DEffect = 87 
xlColumnClustered = 51 
xlColumnStacked = 52 
xlColumnStacked100 = 53 
xlConeBarClustered = 102 
xlConeBarStacked = 103 
xlConeBarStacked100 = 104 
xlConeCol = 105 
xlConeColClustered = 99 
xlConeColStacked = 100 
xlConeColStacked100 = 101 
xlCylinderBarClustered = 95 
xlCylinderBarStacked = 96 
xlCylinderBarStacked100 = 97 
xlCylinderCol = 98 
xlCylinderColClustered = 92 
xlCylinderColStacked = 93 
xlCylinderColStacked100 = 94 
xlDoughnut = -4120 
xlDoughnutExploded = 80 
xlLine = 4 
xlLineMarkers = 65 
xlLineMarkersStacked = 66 
xlLineMarkersStacked100 = 67 
xlLineStacked = 63 
xlLineStacked100 = 64 
xlPie = 5 
xlPieExploded = 69 
xlPieOfPie = 68 
xlPyramidBarClustered = 109 
xlPyramidBarStacked = 110 
xlPyramidBarStacked100 = 111 
xlPyramidCol = 112 
xlPyramidColClustered = 106 
xlPyramidColStacked = 107 
xlPyramidColStacked100 = 108 
xlRadar = -4151 
xlRadarFilled = 82 
xlRadarMarkers = 81 
xlStockHLC = 88 
xlStockOHLC = 89 
xlStockVHLC = 90 
xlStockVOHLC = 91 
xlSurface = 83 
xlSurfaceTopView = 85 
xlSurfaceTopViewWireframe = 86 
xlSurfaceWireframe = 84 
xlXYScatter = -4169 
xlXYScatterLines = 74 
xlXYScatterLinesNoMarkers = 75 
xlXYScatterSmooth = 72 
xlXYScatterSmoothNoMarkers = 73 

End Enum 

Sub ListChartInfo() 
'Update 20141112 
    Dim appExcel As Application 
    Dim objWorkbook As Workbook 
    Dim path As String 
    path = ActiveWorkbook.path 
    Dim St As Worksheet 
    Dim NewSt As Worksheet 
    Dim Cb As ChartObject 

    Dim I, K As Long 

    'create new excel application object 
    Set appExcel = New Application 
    'set the applications visible property to false 
    appExcel.Visible = False 
    'open the workbook with data 
    'Set objWorkbook = appExcel.Workbooks.Open(path & "\Defect Management Dashboard - 20151201 - 002.xlsx") 

    'Set objWorkbook = ActiveWorkbook.Sheets("Name of Report").Cells(B, 2) 

    Application.ScreenUpdating = False 
    Set NewSt = ActiveWorkbook.Sheets("ChartInfo") 
    I = 1 
    NewSt.Cells(I, 1) = "Chart Name" 
    NewSt.Cells(I, 2) = "Sheet Name" 
    NewSt.Cells(I, 3) = "Chart Type" 
    NewSt.Cells(I, 4) = "Shape Range" 
    NewSt.Cells(I, 5) = "Full Path" 

    'NewSt.Cells(I, 6) = "Type" 
    'NewSt.Cells(I, 6) = "Location" 
    For sCounter = 2 To 50 
     'Either we can put all names in an array , here we are printing all the names in Sheet 2 
     path = Sheets("NameofReport").Range("B" & sCounter).Value 
     If path = "" Then 
      GoTo A 
     Else 
      Set objWorkbook = appExcel.Workbooks.Open(path) 
      With NewSt 

     For Each St In objWorkbook.Worksheets 
      For Each Cb In St.ChartObjects 
       I = I + 1 
       .Cells(I, 1).Value = Cb.Name 
       .Cells(I, 2).Value = St.Name 
       On Error Resume Next 
       '.Cells(I, 3).Value = Cb.Chart.ChartType 
       .Cells(I, 3).Value = getEnumName(Cb.Chart.ChartType) 

       .Cells(I, 4).Value = Cb.Chart 



       .Cells(I, 5).Value = path 
       '.Cells(I, 5).Value = Cb.QueryTable.CommandType 
       On Error GoTo 0 
       '.Cells(I, 7).Value = tb.ResultRange 
      Next 
     Next 
     .Activate 
    End With 
      'close the workbooks 
      objWorkbook.Close 
      'close the application 
      appExcel.Quit 
    End If 
A: 

Next sCounter 
Application.ScreenUpdating = True 
End Sub 


Function getEnumName(eValue As myEnum) As String 

    Select Case eValue 
    Case -4098 
     getEnumName = "xl3DArea" 
    Case 78 
     getEnumName = "xl3DAreaStacked" 
    Case 79 
     getEnumName = "xl3DAreaStacked100" 
    Case 60 
     getEnumName = "xl3DBarClustered" 
    Case 61 
     getEnumName = "xl3DBarStacked" 
    Case 62 
     getEnumName = "xl3DBarStacked100" 
    Case -4100 
     getEnumName = "xl3DColumn" 
    Case 54 
     getEnumName = "xl3DColumnClustered" 
    Case 55 
     getEnumName = "xl3DColumnStacked" 
    Case 56 
     getEnumName = "xl3DColumnStacked100" 
    Case -4101 
     getEnumName = "xl3DLine" 
    Case -4102 
     getEnumName = "xl3DPie" 
    Case 70 
     getEnumName = "xl3DPieExploded" 
    Case 1 
     getEnumName = "xlArea" 
    Case 76 
     getEnumName = "xlAreaStacked" 
    Case 77 
     getEnumName = "xlAreaStacked100" 
    Case 57 
     getEnumName = "xlBarClustered" 
    Case 71 
     getEnumName = "xlBarOfPie" 
    Case 58 
     getEnumName = "xlBarStacked" 
    Case 59 
     getEnumName = "xlBarStacked100" 
    Case 15 
     getEnumName = "xlBubble" 
    Case 87 
     getEnumName = "xlBubble3DEffect" 
    Case 51 
     getEnumName = "xlColumnClustered" 
    Case 52 
     getEnumName = "xlColumnStacked" 
    Case 53 
     getEnumName = "xlColumnStacked100" 
    Case 102 
     getEnumName = "xlConeBarClustered" 
    Case 103 
     getEnumName = "xlConeBarStacked" 
    Case 104 
     getEnumName = "xlConeBarStacked100" 
    Case 105 
     getEnumName = "xlConeCol" 
    Case 99 
     getEnumName = "xlConeColClustered" 
    Case 100 
     getEnumName = "xlConeColStacked" 
    Case 101 
     getEnumName = "xlConeColStacked100" 
    Case 95 
     getEnumName = "xlCylinderBarClustered" 
    Case 96 
     getEnumName = "xlCylinderBarStacked" 
    Case 97 
     getEnumName = "xlCylinderBarStacked100" 
    Case 98 
     getEnumName = "xlCylinderCol" 
    Case 92 
     getEnumName = "xlCylinderColClustered" 
    Case 93 
     getEnumName = "xlCylinderColStacked" 
    Case 94 
     getEnumName = "xlCylinderColStacked100" 
    Case -4120 
     getEnumName = "xlDoughnut" 
    Case 80 
     getEnumName = "xlDoughnutExploded" 
    Case 4 
     getEnumName = "xlLine" 
    Case 65 
     getEnumName = "xlLineMarkers" 
    Case 66 
     getEnumName = "xlLineMarkersStacked" 
    Case 67 
     getEnumName = "xlLineMarkersStacked100" 
    Case 63 
     getEnumName = "xlLineStacked" 
    Case 64 
     getEnumName = "xlLineStacked100" 
    Case 5 
     getEnumName = "xlPie" 
    Case 69 
     getEnumName = "xlPieExploded" 
    Case 68 
     getEnumName = "xlPieOfPie" 
    Case 109 
     getEnumName = "xlPyramidBarClustered" 
    Case 110 
     getEnumName = "xlPyramidBarStacked" 
    Case 111 
     getEnumName = "xlPyramidBarStacked100" 
    Case 112 
     getEnumName = "xlPyramidCol" 
    Case 106 
     getEnumName = "xlPyramidColClustered" 
    Case 107 
     getEnumName = "xlPyramidColStacked" 
    Case 108 
     getEnumName = "xlPyramidColStacked100" 
    Case -4151 
     getEnumName = "xlRadar" 
    Case 82 
     getEnumName = "xlRadarFilled" 
    Case 81 
     getEnumName = "xlRadarMarkers" 
    Case 88 
     getEnumName = "xlStockHLC" 
    Case 89 
     getEnumName = "xlStockOHLC" 
    Case 90 
     getEnumName = "xlStockVHLC" 
    Case 91 
     getEnumName = "xlStockVOHLC" 
    Case 83 
     getEnumName = "xlSurface" 
    Case 85 
     getEnumName = "xlSurfaceTopView" 
    Case 86 
     getEnumName = "xlSurfaceTopViewWireframe" 
    Case 84 
     getEnumName = "xlSurfaceWireframe" 
    Case -4169 
     getEnumName = "xlXYScatter" 
    Case 74 
     getEnumName = "xlXYScatterLines" 
    Case 75 
     getEnumName = "xlXYScatterLinesNoMarkers" 
    Case 72 
     getEnumName = "xlXYScatterSmooth" 
    Case 73 
     getEnumName = "xlXYScatterSmoothNoMarkers" 
    Case Else 
     getEnumName = "unknown" 
    End Select 

End Function 
+0

你是什麼意思的「單元格範圍」?你是指圖表中繪製的數據在哪裏?或者在圖表所在的單元格之上? –

+0

我想要在圖表所在的單元格之上。 – user3110224

+0

爲什麼'Enum myEnum'?這些已經內置到Excel VBA中。 –

回答

-1

這裏終於解決了是我的代碼

Enum myEnum 
    xl3DArea = -4098 
xl3DAreaStacked = 78 
xl3DAreaStacked100 = 79 
xl3DBarClustered = 60 
xl3DBarStacked = 61 
xl3DBarStacked100 = 62 
xl3DColumn = -4100 
xl3DColumnClustered = 54 
xl3DColumnStacked = 55 
xl3DColumnStacked100 = 56 
xl3DLine = -4101 
xl3DPie = -4102 
xl3DPieExploded = 70 
xlArea = 1 
xlAreaStacked = 76 
xlAreaStacked100 = 77 
xlBarClustered = 57 
xlBarOfPie = 71 
xlBarStacked = 58 
xlBarStacked100 = 59 
xlBubble = 15 
xlBubble3DEffect = 87 
xlColumnClustered = 51 
xlColumnStacked = 52 
xlColumnStacked100 = 53 
xlConeBarClustered = 102 
xlConeBarStacked = 103 
xlConeBarStacked100 = 104 
xlConeCol = 105 
xlConeColClustered = 99 
xlConeColStacked = 100 
xlConeColStacked100 = 101 
xlCylinderBarClustered = 95 
xlCylinderBarStacked = 96 
xlCylinderBarStacked100 = 97 
xlCylinderCol = 98 
xlCylinderColClustered = 92 
xlCylinderColStacked = 93 
xlCylinderColStacked100 = 94 
xlDoughnut = -4120 
xlDoughnutExploded = 80 
xlLine = 4 
xlLineMarkers = 65 
xlLineMarkersStacked = 66 
xlLineMarkersStacked100 = 67 
xlLineStacked = 63 
xlLineStacked100 = 64 
xlPie = 5 
xlPieExploded = 69 
xlPieOfPie = 68 
xlPyramidBarClustered = 109 
xlPyramidBarStacked = 110 
xlPyramidBarStacked100 = 111 
xlPyramidCol = 112 
xlPyramidColClustered = 106 
xlPyramidColStacked = 107 
xlPyramidColStacked100 = 108 
xlRadar = -4151 
xlRadarFilled = 82 
xlRadarMarkers = 81 
xlStockHLC = 88 
xlStockOHLC = 89 
xlStockVHLC = 90 
xlStockVOHLC = 91 
xlSurface = 83 
xlSurfaceTopView = 85 
xlSurfaceTopViewWireframe = 86 
xlSurfaceWireframe = 84 
xlXYScatter = -4169 
xlXYScatterLines = 74 
xlXYScatterLinesNoMarkers = 75 
xlXYScatterSmooth = 72 
xlXYScatterSmoothNoMarkers = 73 

End Enum 

Sub ListChartInfo() 
'Update 20141112 
    Dim appExcel As Application 
    Dim objWorkbook As Workbook 
    Dim path As String 
    path = ActiveWorkbook.path 
    Dim St As Worksheet 
    Dim NewSt As Worksheet 
    Dim Cb As ChartObject 
    Dim oSeries As Series 
    Dim I, K As Long 
    Dim co As ChartObject 
    'create new excel application object 
    Set appExcel = New Application 
    'set the applications visible property to false 
    appExcel.Visible = False 
    'open the workbook with data 
    'Set objWorkbook = appExcel.Workbooks.Open(path & "\Defect Management Dashboard - 20151201 - 002.xlsx") 

    'Set objWorkbook = ActiveWorkbook.Sheets("Name of Report").Cells(B, 2) 

    Application.ScreenUpdating = False 
    Set NewSt = ActiveWorkbook.Sheets("Charts") 
    I = 1 
    NewSt.Cells(I, 1) = "Chart Name" 
    NewSt.Cells(I, 2) = "Sheet Name" 
    NewSt.Cells(I, 3) = "Chart Type" 
    NewSt.Cells(I, 4) = "Chart Location" 
    NewSt.Cells(I, 5) = "Full Path" 

    'NewSt.Cells(I, 6) = "Type" 
    'NewSt.Cells(I, 6) = "Location" 
    For sCounter = 2 To 50 
     'Either we can put all names in an array , here we are printing all the names in Sheet 2 
     path = Sheets("NameofReport").Range("B" & sCounter).Value 
     If path = "" Then 
      GoTo A 
     Else 
      Set objWorkbook = appExcel.Workbooks.Open(path) 
      With NewSt 

     For Each St In objWorkbook.Worksheets 
      For Each Cb In St.ChartObjects 
       I = I + 1 
       .Cells(I, 1).Value = Cb.Name 
       .Cells(I, 2).Value = St.Name 
       On Error Resume Next 
       '.Cells(I, 3).Value = Cb.Chart.ChartType 
       .Cells(I, 3).Value = getEnumName(Cb.Chart.ChartType) 
       .Cells(I, 4).Value = "Location:" 
       For Each oSeries In Cb.Chart.SeriesCollection 
        .Cells(I, 4).Value = .Cells(I, 4).Value & oSeries.Formula 
       Next 
       '.Cells(I, 4).Value = Cb.Chart.SeriesCollection.Formula 


       .Cells(I, 5).Value = path 
       '.Cells(I, 5).Value = Cb.QueryTable.CommandType 
       On Error GoTo 0 
       '.Cells(I, 7).Value = tb.ResultRange 
      Next 
     Next 
     .Activate 
    End With 
      'close the workbooks 
      'objWorkbook.Close 
      'close the application 
      'appExcel.Quit 
    End If 
A: 

Next sCounter 
Application.ScreenUpdating = True 
End Sub 


Function getEnumName(eValue As myEnum) As String 

    Select Case eValue 
    Case -4098 
     getEnumName = "xl3DArea" 
    Case 78 
     getEnumName = "xl3DAreaStacked" 
    Case 79 
     getEnumName = "xl3DAreaStacked100" 
    Case 60 
     getEnumName = "xl3DBarClustered" 
    Case 61 
     getEnumName = "xl3DBarStacked" 
    Case 62 
     getEnumName = "xl3DBarStacked100" 
    Case -4100 
     getEnumName = "xl3DColumn" 
    Case 54 
     getEnumName = "xl3DColumnClustered" 
    Case 55 
     getEnumName = "xl3DColumnStacked" 
    Case 56 
     getEnumName = "xl3DColumnStacked100" 
    Case -4101 
     getEnumName = "xl3DLine" 
    Case -4102 
     getEnumName = "xl3DPie" 
    Case 70 
     getEnumName = "xl3DPieExploded" 
    Case 1 
     getEnumName = "xlArea" 
    Case 76 
     getEnumName = "xlAreaStacked" 
    Case 77 
     getEnumName = "xlAreaStacked100" 
    Case 57 
     getEnumName = "xlBarClustered" 
    Case 71 
     getEnumName = "xlBarOfPie" 
    Case 58 
     getEnumName = "xlBarStacked" 
    Case 59 
     getEnumName = "xlBarStacked100" 
    Case 15 
     getEnumName = "xlBubble" 
    Case 87 
     getEnumName = "xlBubble3DEffect" 
    Case 51 
     getEnumName = "xlColumnClustered" 
    Case 52 
     getEnumName = "xlColumnStacked" 
    Case 53 
     getEnumName = "xlColumnStacked100" 
    Case 102 
     getEnumName = "xlConeBarClustered" 
    Case 103 
     getEnumName = "xlConeBarStacked" 
    Case 104 
     getEnumName = "xlConeBarStacked100" 
    Case 105 
     getEnumName = "xlConeCol" 
    Case 99 
     getEnumName = "xlConeColClustered" 
    Case 100 
     getEnumName = "xlConeColStacked" 
    Case 101 
     getEnumName = "xlConeColStacked100" 
    Case 95 
     getEnumName = "xlCylinderBarClustered" 
    Case 96 
     getEnumName = "xlCylinderBarStacked" 
    Case 97 
     getEnumName = "xlCylinderBarStacked100" 
    Case 98 
     getEnumName = "xlCylinderCol" 
    Case 92 
     getEnumName = "xlCylinderColClustered" 
    Case 93 
     getEnumName = "xlCylinderColStacked" 
    Case 94 
     getEnumName = "xlCylinderColStacked100" 
    Case -4120 
     getEnumName = "xlDoughnut" 
    Case 80 
     getEnumName = "xlDoughnutExploded" 
    Case 4 
     getEnumName = "xlLine" 
    Case 65 
     getEnumName = "xlLineMarkers" 
    Case 66 
     getEnumName = "xlLineMarkersStacked" 
    Case 67 
     getEnumName = "xlLineMarkersStacked100" 
    Case 63 
     getEnumName = "xlLineStacked" 
    Case 64 
     getEnumName = "xlLineStacked100" 
    Case 5 
     getEnumName = "xlPie" 
    Case 69 
     getEnumName = "xlPieExploded" 
    Case 68 
     getEnumName = "xlPieOfPie" 
    Case 109 
     getEnumName = "xlPyramidBarClustered" 
    Case 110 
     getEnumName = "xlPyramidBarStacked" 
    Case 111 
     getEnumName = "xlPyramidBarStacked100" 
    Case 112 
     getEnumName = "xlPyramidCol" 
    Case 106 
     getEnumName = "xlPyramidColClustered" 
    Case 107 
     getEnumName = "xlPyramidColStacked" 
    Case 108 
     getEnumName = "xlPyramidColStacked100" 
    Case -4151 
     getEnumName = "xlRadar" 
    Case 82 
     getEnumName = "xlRadarFilled" 
    Case 81 
     getEnumName = "xlRadarMarkers" 
    Case 88 
     getEnumName = "xlStockHLC" 
    Case 89 
     getEnumName = "xlStockOHLC" 
    Case 90 
     getEnumName = "xlStockVHLC" 
    Case 91 
     getEnumName = "xlStockVOHLC" 
    Case 83 
     getEnumName = "xlSurface" 
    Case 85 
     getEnumName = "xlSurfaceTopView" 
    Case 86 
     getEnumName = "xlSurfaceTopViewWireframe" 
    Case 84 
     getEnumName = "xlSurfaceWireframe" 
    Case -4169 
     getEnumName = "xlXYScatter" 
    Case 74 
     getEnumName = "xlXYScatterLines" 
    Case 75 
     getEnumName = "xlXYScatterLinesNoMarkers" 
    Case 72 
     getEnumName = "xlXYScatterSmooth" 
    Case 73 
     getEnumName = "xlXYScatterSmoothNoMarkers" 
    Case Else 
     getEnumName = "unknown" 
    End Select 

End Function 

我用.Cells(I,4).value的= .Cells(I,4).value的& oSeries。公式 得到一系列單元格

0

,你可以嘗試這樣的事情來獲得傳說/數據系列的圖表範圍:

Dim oSeries As Series 
Dim oChart As ChartObject 
Dim oWS As Worksheet 

For Each oWS In ActiveWorkbook.Sheets 
    For Each oChart In oWS.ChartObjects 
     For Each oSeries In oChart.Chart.SeriesCollection 
      Debug.Print oSeries.Formula 
     Next 
    Next 
Next 

你必須從提取過程中的數據公式。

順便說一句:如果你使用後期綁定,你必須將oSeries定義爲Object當然。如果你使用早期綁定(因爲你的代碼表明你使用類似Dim objWorkbook As Workbook的東西),所以不應該需要那些Enum的東西,因爲所有的常量已經在lib中聲明瞭。

+0

SeriesCollection不是chartObject支持的屬性,任何其他建議? – user3110224

+0

在我這邊結束瞭解決方案的工作......用ActiveChart而不是Cb檢查了它......但這不應該是一個問題。你使用哪個Excel版本? – cboden

+0

啊...我看到問題了。 Cb被聲明爲ChartObject ...然後我們必須先調用該對象的Chart屬性。已調整我的示例以上 – cboden

1

使用ChartObject對象的TopLeftCellBottomRightCell屬性。在下面的例子中,我用橙色突出顯示了圖表區域重疊的單元格;這確實是在MsgBox中返回的範圍。

Dim co As ChartObject 
Dim r As Range 

Set co = ActiveChart.Parent 
Set r = Range(co.TopLeftCell, co.BottomRightCell) 
MsgBox r.Address 

enter image description here

+0

感謝您的回覆,但您的示例是使用ActiveChart.Parent,但在我的情況下,我正在使用循環For Each Cb在St.ChartObjects在此循環即使我訪問範圍(Cb.TopLeftCell,Cb .BottomRightCell),我什麼都得不到,請告訴我如何在循環中使用它? – user3110224

+0

我可以,但我希望你先去看看它。 –

+0

終於解決了Cb.Chart.SeriesCollection中的每個系列 .Cells(I,4).Value = .Cells(I,4).Value&oSeries.Formula Next – user3110224