Конечный пользователь Excel VBA Выбор объекта диаграммы - PullRequest
0 голосов
/ 28 октября 2019

Я хотел бы сгенерировать некоторый код, который позволит конечному пользователю выбрать одну из многих диаграмм из листа, после чего я сделаю кучу манипуляций на основе этого выбора.

Я ищу что-топохож на Application.Inputbox Type: = 8, который допускает выбор объекта вместо выбора диапазона.

Я прошу большую часть скромного старого VBA ??

1 Ответ

0 голосов
/ 29 октября 2019

Гораздо проще сначала выбрать диаграмму, а затем запустить код на выбранных диаграммах, чем приостановить код и попытаться выбрать диаграммы из кода.

Но это можно сделать.

Вам нужна пользовательская форма, называемая F_ChartChooser с двумя кнопками btnCancel и btnContinue.

Код в модуле F_ChartChooser:

Option Explicit

Private Sub btnCancel_Click()
  CancelProcedure
End Sub

Private Sub btnContinue_Click()
  ContinueProcedure
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  ' so clicking red X doesn't crash
  If CloseMode = 0 Then
    Cancel = True
    CancelProcedure
  End If
End Sub

Код в обычном модуле состоит из основной процедуры, которая должна получить диаграмму (ы) от пользователя. Он должен вызывать пользовательскую форму немодально, чтобы пользователь мог выбирать диаграммы на листе. Это означает, что код продолжает работать, пока отображается форма, поэтому нужно завершить подпрограмму, когда вызывается пользовательская форма.

В зависимости от того, что происходит с пользовательской формой, код либо продолжается с CancelProcedure, либос ContinueProcedure. Вот код:

Option Explicit

Dim mfrmChartChooser As F_ChartChooser

Sub Main()
  ' code here

  ' need to select chart(s) here
  Application.Goto ActiveCell
  Set mfrmChartChooser = New F_ChartChooser
  mfrmChartChooser.Show vbModeless
End Sub

Sub CancelProcedure()
  Unload mfrmChartChooser
  Set mfrmChartChooser = Nothing
  MsgBox "User canceled.", vbExclamation
End Sub

Sub ContinueProcedure()
  Unload mfrmChartChooser
  Set mfrmChartChooser = Nothing
  If Not ActiveChart Is Nothing Then
    ' do something with active chart

    ' this demo is announcing that it was selected
    MsgBox """" & ActiveChart.ChartTitle.Text & """ was selected.", vbExclamation
    ' end of demo code
  ElseIf TypeName(Selection) = "DrawingObjects" Then
    Dim sh As Shape
    Dim vCharts As Variant
    Dim nChart As Long
    ReDim vCharts(0 To nChart)
    For Each sh In Selection.ShapeRange
      If sh.HasChart Then
        ' do something here with each chart

        ' this demo is building a list of selected charts
        nChart = nChart + 1
        ReDim Preserve vCharts(0 To nChart)
        vCharts(nChart) = sh.Chart.ChartTitle.Text
        ' end of demo code
      End If
    Next

    ' this demo now is showing the list of selected charts
    If nChart = 0 Then
      MsgBox "No chart selected.", vbExclamation
    Else
      If nChart = 1 Then
        MsgBox """" & vCharts(nChart) & """ was selected.", vbExclamation
      Else
        Dim sPrompt As String
        sPrompt = nChart & " charts selected:" & vbNewLine & vbNewLine
        Dim iChart As Long
        For iChart = 1 To nChart
          sPrompt = sPrompt & """" & vCharts(iChart) & """" & IIf(iChart < nChart, vbNewLine, "")
        Next
        MsgBox sPrompt, vbExclamation
      End If
    End If
    ' end of demo code
  Else
    ' do nothing because no chart was selected

    ' this demo is announcing that nothing was selected
    MsgBox "No chart selected.", vbExclamation
    ' end of demo code
  End If
End Sub

Вышеуказанные подпрограммы CancelProcedure и ContinueProcedure содержат избыточный код, чтобы помочь с демонстрацией. В реальном коде я бы упорядочил их следующим образом, возможно, даже не удосужился бы уведомить пользователя, когда ничего не было выбрано (они знают, что отменили, верно?), И просто обработать выбранные диаграммы:

Sub CancelProcedure()
  Unload mfrmChartChooser
  Set mfrmChartChooser = Nothing
End Sub

Sub ContinueProcedure()
  Unload mfrmChartChooser
  Set mfrmChartChooser = Nothing
  If Not ActiveChart Is Nothing Then
    ' do something with active chart
    ProcessChart ActiveChart
  ElseIf TypeName(Selection) = "DrawingObjects" Then
    Dim sh As Shape
    Dim vCharts As Variant
    Dim nChart As Long
    ReDim vCharts(0 To nChart)
    For Each sh In Selection.ShapeRange
      If sh.HasChart Then
        ' do something here with each chart
        ProcessChart sh.Chart
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...