gussilago
gussilago

Reputation: 932

Pop up charts in VBA Excel

I was wondering if there is a way to create pop-up charts in Excel with press of a button, based on values found in a specific worksheet?
The best way would be to be able to do it in VBA.

I have been researching but can't find any real solutions.

Any suggestions?

Upvotes: 3

Views: 19384

Answers (1)

Siddharth Rout
Siddharth Rout

Reputation: 149335

You! You lucky guy! :p

Since I was free, I created a basic version for you. :)

Requirement: Show Chart in a Userform

Logic:

  1. Create a Userform and place an image control and a command button in it.
  2. Identify your chart's data range
  3. Add a Temp sheet
  4. Create your chart in the temp sheet
  5. Export the chart as a bmp to the user's temp directory
  6. Load the image control with that image

Assumptions:

I am assuming that your chart's data range is in [Sheet1] and look like this. Please amend the code accordingly.

enter image description here

Preparing your Userform

enter image description here

Code

This code goes in the userform code area. I have commented the code so that you will not have any problem understanding it. Still if you so, post back.

Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _
(ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long

Private Const MAX_PATH As Long = 260

Private Sub CommandButton1_Click()
    Dim ws As Worksheet
    Dim wsTemp As Worksheet
    Dim rng As Range
    Dim oChrt As ChartObject

    '~~> Set the sheet where you have the charts data
    Set ws = [Sheet1]

    '~~> This is your charts range
    Set rng = ws.Range("A1:B3")

    '~~> Delete the temp sheeet if it is there
    Application.DisplayAlerts = False
    On Error Resume Next
    ThisWorkbook.Sheets("TempOutput").Delete
    On Error GoTo 0
    Application.DisplayAlerts = True

    '~~> Add a new temp sheet
    Set wsTemp = ThisWorkbook.Sheets.Add

    With wsTemp
        '~~> Give it a name so that we can delete it as shown above
        '~~> This is just a precaution in case `wsTemp.Delete` fails below
        .Name = "TempOutput"

        '~~~> Add the chart
        Set oChrt = .ChartObjects.Add _
            (Left:=50, Width:=300, Top:=75, Height:=225)

        '~~> Set the chart's source data and type
        '~~> Change as applicable
        With oChrt.Chart
            .SetSourceData Source:=rng
            .ChartType = xlXYScatterLines
        End With
    End With

    '~~> Export the chart as bmp to the temp drive
    oChrt.Chart.Export Filename:=TempPath & "TempChart.bmp", Filtername:="Bmp"

    '~~> Load the image to the image control
    Me.Image1.Picture = LoadPicture(TempPath & "TempChart.bmp")

    '~~> Delete the temp sheet
    Application.DisplayAlerts = False
    wsTemp.Delete
    Application.DisplayAlerts = True

    '~~> Kill the temp file
    On Error Resume Next
    Kill TempPath & "TempChart.bmp"
    On Error GoTo 0
End Sub

'~~> Function to get the user's temp path
Function TempPath() As String
    TempPath = String$(MAX_PATH, Chr$(0))
    GetTempPath MAX_PATH, TempPath
    TempPath = Replace(TempPath, Chr$(0), "")
End Function

Output:

When you run the userform and press the command button, you will see the image populate in the userform.

enter image description here

Upvotes: 11

Related Questions