2013-06-26 6 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

PS: Это второй раз, когда я говорю, что что-то невозможно, и вы доказываете, что я неправ. Я не придаю слишком большого значения в первый раз, потому что мне вообще не нравился аскер и не анализировал проблему; но на этот раз я был так уверен ... Живи, чтобы учиться; Я предполагаю, что я должен удалить некоторые из моих предрассудков с 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 секунд выполнит процедуру с названием «Процедура удаления». В этой процедуре вы можете убедиться, что выделение находится на рабочем листе, а не в диаграмме, которую вы собираетесь удалить.

Вы можете в установленном порядке проверить, выбран ли в данный момент график. Если нет, удалите его, иначе установите таймер еще раз.

+1

Считаете ли вы это разумное/надежное решение? – varocarbas

+1

@varocarbas Ну, лично я предпочел бы добавить кнопку на рабочий лист, который пользователь может щелкнуть, чтобы удалить диаграмму. Тем не менее, я бы предпочел, чтобы мое решение было связано с внешней программой. –

+1

не поймите меня неправильно! Мое решение было: нет практического решения по тому, что вы хотите. Внешняя программа была похожа на то, что «это так сложно, если только у вас нет внешней программы, делающей такую ​​вещь ...». Во всяком случае, это может быть не слишком надежным, но это использование Application.OnTime - это самый близкий вариант, который у вас есть, и я не знал об этом: хорошая работа. – varocarbas

Смежные вопросы