2013-06-26 5 views
1
Sub aaGraphing() 
' 
' aaGraphing Macro 
' 

' 
    Range("L948:W949,D948:D949").Select 
    Range("D949").Activate 
    ActiveSheet.Shapes.AddChart.Select 
    ActiveChart.ChartType = xlLineMarkers 
    ActiveChart.SetSourceData Source:=Range(_ 
     "Analytics!$L$948:$W$949,Analytics!$D$948:$D$949") 
End Sub 

이 코드는 원하는 데이터 차트를 생성합니다. 생성 된 차트를 임시로 만들어 차트 외부의 아무 곳이나 클릭해도 삭제되도록하는 방법이 있습니까?임시 Excel 차트 만들기

답변

2

정기 모듈 ....

Option Explicit 


Public PlotName As String 
Public PlotRange As Range 


Sub Tester() 
AddPlot ActiveSheet.Range("B3:B7,D3:D7") 
End Sub 

Sub AddPlot(rng As Range) 
    With ActiveSheet.Shapes.AddChart 
     PlotName = .Name 
     .Chart.ChartType = xlLineMarkers 
     .Chart.SetSourceData Source:=Range(rng.Address()) 
    End With 
    Set PlotRange = rng 
    Application.EnableEvents=False  
    rng.Select 
    Application.EnableEvents=True 
End Sub 

Sub RemovePlot(rng As Range) 
    If Not PlotRange Is Nothing Then 
     If Application.Intersect(rng, PlotRange) Is Nothing Then 
      On Error Resume Next 
      rng.Parent.Shapes(PlotName).Delete 
      On Error GoTo 0 
     End If 
    End If 
End Sub 

시트 코드 모듈 :

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    RemovePlot Target 
End Sub 
+2

정말 놀랍습니다. 심각하게 _SelectionChange 이벤트가 잘 작동 할 것으로 기대하지 않았습니다. 나는 그것이 매우 신뢰할 수 없다고 생각했다. 나는 완전하고 절대적으로 틀렸고 그래서 나는 나의 대답을 지워야 만했다. 코드를 보내 주셔서 감사합니다. – varocarbas

+2

추신 : 나는 이것이 무언가 불가능하다고 말하면서 두 번째로 나에게 틀린 것을 증명합니다. 저는 처음에는 질문자를별로 좋아하지 않았고 문제를 분석하지 않았기 때문에 처음에는 너무 중요하지 않았습니다. 하지만 이번엔 정말 확신 했어요. 나는 VBA로 나의 편견을 제거해야한다고 생각합니다. – varocarbas

+1

많은 것들이 가능하지만 모두가 좋은 아이디어는 아닙니다. 단지 당신이 얼마나 강건 해야할지에 달려 있습니다. 예를 들어 사용자가 저장하고 플롯을 만든 직후에 통합 문서를 닫으면 내 코드가 깨집니다. 좋은 추가는'AddPlot'이 이미 존재하는 차트를 삭제하게하는 것입니다. –

3

워크 시트의 SelectionChange 이벤트를 사용하여 차트를 삭제할 수 있습니다. 아래에서는 워크 시트에있을 수있는 차트 하나만 있다고 가정합니다.

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    If Me.Shapes.Count = 1 Then 
     Me.Shapes(1).Delete 
    End If 
End Sub 

이 이벤트를 동적으로 첨부하고 제거 할 수 있습니다. 그러나, 나는 그것이 약간 복잡하다고 믿습니다.

일정 기간 후에 삭제하려면 Application.OnTime을 사용하는 것이 좋습니다.

Application.OnTime Now + TimeValue("00:00:40"), "ProcedureToDelete" 

은 40 초 후에 'ProcedureToDelete'라는 절차를 실행합니다. 이 절차에서는 삭제하려는 차트가 아니라 워크 시트에 선택 영역이 있는지 확인할 수 있습니다.

시간 지정 절차에서 차트가 현재 선택되어 있는지 확인할 수 있습니다. 그렇지 않은 경우 삭제하거나 그렇지 않으면 타이머를 다시 설정하십시오.

+1

당신이 현명한/신뢰할 수있는 솔루션 생각하십니까? – varocarbas

+1

@varocarbas 글쎄, 개인적으로 차트를 삭제하기 위해 사용자가 클릭 할 수있는 워크 시트에 버튼을 추가하고 싶습니다. 여전히, 나는 외부 프로그램을 첨부하는 내 솔루션을 선호합니다. –

+1

나를 오해하지 마십시오! 내 솔루션은 : 당신이 원하는 것에 대한 실용적인 솔루션이 없습니다. 외부 프로그램은 "그런 일을하는 외부 프로그램이 없다면 ... 그렇게 어렵습니다"라고 말하는 것과 같았습니다. 어쨌든, 너무 안정적이지는 않지만, Application.OnTime을 사용하는 것은 당신이 여기에 가장 가까운 옵션이고, 나는 그것에 대해 깨닫지 못했습니다. – varocarbas