2017-01-05 25 views
1

主要代碼的一部分與圖表工作表相關,它允許點擊圖表(編碼在圖表中完成)觸發宏。但主要程序涉及刪除和創建圖表。一旦程序刪除圖表工作表,圖表中的代碼也會被刪除。如何在創建新圖表時執行圖表代碼?需要從任何其他圖表工作表模塊或普通模塊或任何類別運行圖表工作表的代碼

Sub AddNewChart() 
Dim Newchart As Chart, ram As String, ram1 As String, num As Long 

num = InputBox("Please Enter the Sheet Number", "Sheet Number") 
'To execute code in particular sheet number 

ram = Worksheets(num).Range("AY4").End(xlDown).Address(False, False) 
ram1 = Worksheets(num).Range("AZ4").End(xlDown).Address(False, False) 


Set Newchart = Charts.Add 

With Newchart 
    .ChartType = xlXYScatterLinesNoMarkers 

    Do Until .SeriesCollection.Count = 0 
    .SeriesCollection(1).Delete 
    Loop 

    .SeriesCollection.NewSeries 
    .SeriesCollection(1).Name = "=""Values""" 

    .SeriesCollection(1).XValues = Worksheets(num).Range("AY4", ram) 

    .SeriesCollection(1).Values = Worksheets(num).Range("AZ4", ram1) 


End With 
Application.DisplayAlerts = False 
     Sheets("Ravi").Delete 
'*sheet named ravi is deleted along with code* 
     Application.DisplayAlerts = True 

Newchart.Name = "Ravi" 
'How to get another code in this Ravi Chart sheet module? 
Sheets("Ravi").Activate 


End Sub 

下面是一個圖表代碼,即使在刪除和替換之後仍會出現在圖表工作表模塊中。

Sub Chart_mouseup(ByVal Button As Long, ByVal Shift As Long, _ByVal x As Long, ByVal y As Long) 
Dim ElementID As Long, Arg1 As Long, Arg2 As Long 
Dim myX As Variant, myY As Double 

With ActiveChart 
    ' Pass x & y, return ElementID and Args 
    .GetChartElement x, y, ElementID, Arg1, Arg2 

    ' Did we click over a point or data label? 
    If ElementID = xlSeries Or ElementID = xlDataLabel Then 
     If Arg2 > 0 Then 
      ' Extract x value from array of x values 
      myX = WorksheetFunction.Index _ 
       (.SeriesCollection(Arg1).XValues, Arg2) 
      ' Extract y value from array of y values 
      myY = WorksheetFunction.Index _ 
       (.SeriesCollection(Arg1).Values, Arg2) 

      ' Display message box with point information 
      MsgBox "Series " & Arg1 & vbCrLf _ 
       & """" & .SeriesCollection(Arg1).Name & """" & vbCrLf _ 
       & "Point " & Arg2 & vbCrLf _ 
       & "X = " & myX & vbCrLf _ 
       & "Y = " & myY 
     End If 
    End If 
End With 
End Sub 
+0

在刪除之前複製代碼,然後將其粘貼回新的工作表。看看這[鏈接](http://stackoverflow.com/q/24701517/2521004)是否有助於你開始。對於圖表來說,它應該與對普通圖表背後的代碼使用相同的方法。 –

+0

感謝@PortlandRunner它幫助 – Kk12345

回答

0

您需要的圖表的代碼模塊來處理任何排行榜中的事件之外創建一個單獨的類模塊,然後使用其他代碼到這個類鏈接到其事件需要捕獲圖表。

本質上,您添加一個類模塊,並將其命名爲C_ChartEvents。包括您放置圖表的代碼模塊中的事件代碼,並在聲明節(略低於Option Explicit)插入

Public With Events Cht As Chart 

然後修改現有的代碼使用Cht_而不是Chart_爲前綴爲每個事件程序的名稱,例如,

Sub Cht_MouseUp(ByVal Blah As Blah...) 

,在您創建一個新的圖表,插入的代碼模塊的頂部:

Dim clsChartEvents As New C_ChartEvents 

後創建圖(比方說,以後隨着NewChart/End With塊)插入:

Set clsChartEvents.Cht = NewChart 

現在NewChart將與在C_ChartEvents程序的事件做出響應。

我寫了一個教程,Chart Events in Microsoft Excel,有更多的血淋淋的細節。

相關問題