Excel 图形作为用户窗体中的图像未更新
我创建了以下宏,它“打印”两个图形中的两个图像,并以用户形式输出它们。有三个下拉栏,首先选择类别,然后选择子类别(然后显示)。由于某些原因,当我更改类别和子类别时,左侧图像/图形正在更新。但是,当我更改右侧图像/图形的子类别时,它不会被更新。理想情况下,我希望将两个图像/图形合并到一个图形中,以便于比较。我怎样才能做到这一点Excel 图形作为用户窗体中的图像未更新,excel,graph,userform,vba,Excel,Graph,Userform,Vba,我创建了以下宏,它“打印”两个图形中的两个图像,并以用户形式输出它们。有三个下拉栏,首先选择类别,然后选择子类别(然后显示)。由于某些原因,当我更改类别和子类别时,左侧图像/图形正在更新。但是,当我更改右侧图像/图形的子类别时,它不会被更新。理想情况下,我希望将两个图像/图形合并到一个图形中,以便于比较。我怎样才能做到这一点 Option Explicit Private Sub UpdateGraph(rowHeader$, colHeader$, chartName$)
Option Explicit
Private Sub UpdateGraph(rowHeader$, colHeader$, chartName$)
If rowHeader = "" Or colHeader = "" Then Exit Sub
Dim ch As Chart
Dim oFind As Range
Dim row%, col%
Dim imgPath$, img As Image
START
With shData
Set oFind = .Range("C:C").Find(rowHeader, , xlValues, xlWhole)
If oFind Is Nothing Then
MsgBox "Header " & rowHeader & " not found in column C", vbCritical
Exit Sub
End If
row = oFind.row
Set oFind = .Range("2:2").Find(colHeader, , xlValues, xlWhole)
If oFind Is Nothing Then
MsgBox "Header " & colHeader & " not found in row 2", vbCritical
Exit Sub
End If
col = oFind.Column
End With
imgPath = ThisWorkbook.Path & Application.PathSeparator & "TempChart.gif"
With shHiddenChart
.Range("H_ColHeader").Value = colHeader
.Range("H_" & chartName).Value = rowHeader
shData.Range(shData.Cells(row, col + 5), shData.Cells(row, col + 20)).Copy
.ListObjects("tbl" & chartName).DataBodyRange.PasteSpecial xlPasteValues
Set ch = .ChartObjects(chartName).Chart
ch.Export imgPath, "GIF"
End With
Set img = IIf(chartName = "Chart1", imgGraph1, imgGraph2)
img.Picture = LoadPicture(imgPath)
On Error Resume Next
Kill imgPath
On Error GoTo 0
FINISH
End Sub
Private Sub btnClose_Click()
Unload Me
End Sub
Private Sub dd1_Change()
Call UpdateGraph(dd2.Value, dd1.Value, "Chart1")
Call UpdateGraph(dd3.Value, dd1.Value, "Chart2")
End Sub
Private Sub dd2_Change()
Call UpdateGraph(dd2.Value, dd1.Value, "Chart1")
End Sub
Private Sub dd3_Change()
Call UpdateGraph(dd3.Value, dd1.Value, "Chart2")
End Sub
Private Sub UserForm_Initialize()
With shConfig
Call FillListBox(.ListObjects("tblDD1").DataBodyRange, dd1)
Call FillListBox(.ListObjects("tblDD2").DataBodyRange, dd2)
Call FillListBox(.ListObjects("tblDD2").DataBodyRange, dd3)
End With
End Sub
Private Sub FillListBox(rng As Range, lBox As ComboBox)
Dim cell As Range
lBox.Clear
For Each cell In rng.Cells
lBox.AddItem cell.Value
Next
End Sub