Option Explicit
Private SheetGraph As Worksheet
Private SheetData As Worksheet
Private Const FrequencyCount As Integer = 21
Private ReferenceData As String
Private Const sUpperLimit As String = "Upper"
Private Const sLowerLimit As String = "Lower"
Public Sub ChangeChartsParameters()
Set SheetGraph = Sheet2
Set SheetData = Sheet3
ReferenceData = "=" & SheetData.Name & "!"
Chart "110", 334
'Chart "100", 312
'Chart "90", 290
'Chart "80", 268
'Chart "70*", 246
'Chart "70", 224
'Chart "60*", 202
'Chart "60", 180
'Chart "50*", 158
'Chart "50", 136
'Chart "40*", 114
'Chart "40", 92
'Chart "20", 48
'Chart "110", 334
MsgBox "Done"
End Sub
Private Sub Chart(dB As String, rowStart As Integer)
Dim ChartObject As Object
'Find the value of dB which matches with ChartTitle
For Each ChartObject In SheetGraph.ChartObjects
ChartObject.Activate
If Left(ActiveChart.ChartTitle.Caption, Len(dB)) = dB Then
Dim Series As Object
For Each Series In ActiveChart.SeriesCollection *
If Series.Name = sUpperLimit Or Series.Name = sLowerLimit Then *
ChangeSeriesLimit Series, rowStart
Else
ChangeSeries Series, rowStart
End If
Next
End If
Next
End Sub
Private Sub ChangeSeries(Series As Object, rowStart As Integer)
Dim col As Integer, colItem As Integer
col = FindCaptionAtRow(Series.Name, 1) 'Series.Name must match with the Header
colItem = 0 'Frequency
Series.XValues = ReferenceData & "R" & rowStart & "C" & col + colItem & ":R" & rowStart + FrequencyCount - 1 & "C" & col + colItem
colItem = 1 'Attenuation
Series.Values = ReferenceData & "R" & rowStart & "C" & col + colItem & ":R" & rowStart + FrequencyCount - 1 & "C" & col + colItem *
'Change Error Bars
colItem = 2 'MU for Y Error Bars
Dim errorRange As String
errorRange = ReferenceData & "R" & rowStart & "C" & col + colItem & ":R" & rowStart + FrequencyCount - 1 & "C" & col + colItem
Series.ErrorBar Direction:=xlY, Include:=xlBoth, Type:=xlCustom, Amount:=errorRange, MinusValues:=errorRange
End Sub
Private Sub ChangeSeriesLimit(Series As Object, rowStart As Integer)
Dim colX As Integer, colLimit
colX = FindCaptionAtRow("Ref", 1) '"Ref" must match with the Header
colLimit = FindCaptionAtRow(Series.Name, 2) '"Ref" must match with the Header
Series.XValues = ReferenceData & "R" & rowStart & "C" & colX & ":R" & rowStart + FrequencyCount - 1 & "C" & colX
Series.Values = ReferenceData & "R" & rowStart & "C" & colLimit & ":R" & rowStart + FrequencyCount - 1 & "C" & colLimit
End Sub
Private Sub ChangeErrorBars(Series As Object, index As Integer) *The whole section
With Series
.ErrorBar Direction:=xlX, Include:=xlBoth, _
Type:=xlCustom, Amount:="=Sheet1!R1C3:R10C3", MinusValues:= _
"=Sheet1!R1C3:R10C3"
.ErrorBar Direction:=xlY, Include:=xlBoth, _
Type:=xlCustom, Amount:="=Sheet1!R1C3:R10C3", MinusValues:= _
"=Sheet1!R1C3:R10C3"
End With
End Sub
'Find a string at desired row and return column number
Private Function FindCaptionAtRow(label As String, row As Integer) As Integer
Dim i As Integer
Do
i = i + 1
Debug.Print SheetData.Cells(row, i).Value *
Loop Until SheetData.Cells(row, i).Value = label Or i = 100
If i = 100 Then
Err.Raise 1001, "FindCaptionAtRow", "Can't find match"
Else
FindCaptionAtRow = i
End If
End Function
The * indicates the ones i need explanation. Thanks a lot.
Bookmarks