Sign in to follow this  
Followers 0

ExcelChart UDF - Help & Support


113 posts in this topic

Posted

This is the "General Help and Support" thread for the ExcelChart UDF.

The UDF itself can be downloaded

So if you have any questions, suggestions or errors please post here.

Share this post


Link to post
Share on other sites



Posted

Hi Guys,

is there the possibilty to manage "error bars" with this great UDF?

For me error bars are the better solution to achive this:

Posted Image

A scatter chart with a vertical error bar and a label: a "dynamic" vertical bar.

Suggestions?

Thanks!

Share this post


Link to post
Share on other sites

Posted

Hi maba,

not yet.

Can you create the vertical lines with Excel manually? If yes, you could create a macro and we can have alook at the VBA code and can try to translate it to AutoIt.

What version of Excel do you use?

Share this post


Link to post
Share on other sites

Posted

:)

Something like this:

Sub ErrorBar()
'
' ErrorBar Macro
'
'
	ActiveSheet.ChartObjects("Grafico 4").Activate
	ActiveChart.SeriesCollection(2).Select
	ActiveChart.SeriesCollection.NewSeries
	ActiveChart.SeriesCollection(11).Name = "=""Error"""
	ActiveChart.SeriesCollection(11).XValues = "='Tabelle gestione grafico'!$H$9"
	ActiveChart.SeriesCollection(11).Values = "='Tabelle gestione grafico'!$I$9"
	ActiveSheet.ChartObjects("Grafico 4").Activate
	ActiveChart.SeriesCollection(11).Select
	ActiveChart.SeriesCollection(8).HasErrorBars = True
	ActiveSheet.ChartObjects("Grafico 4").Activate
	ActiveChart.SeriesCollection(11).ErrorBars.Select
	ActiveChart.SeriesCollection(11).ErrorBar Direction:=xlY, Include:= _
		xlMinusValues, Type:=xlFixedValue, Amount:=1
	ActiveChart.SeriesCollection(11).ErrorBars.EndStyle = xlNoCap
	ActiveChart.SeriesCollection(11).ErrorBar Direction:=xlY, Include:= _
		xlMinusValues, Type:=xlPercent, Amount:=5
	ActiveChart.SeriesCollection(11).ErrorBar Direction:=xlY, Include:= _
		xlMinusValues, Type:=xlPercent, Amount:=100
	ActiveSheet.ChartObjects("Grafico 4").Activate
	ActiveChart.SeriesCollection(11).ErrorBars.Select
	ActiveSheet.ChartObjects("Grafico 4").Activate
	ActiveChart.SeriesCollection(11).Select
	ActiveSheet.ChartObjects("Grafico 4").Activate
	ActiveChart.SeriesCollection(11).ApplyDataLabels
	ActiveSheet.ChartObjects("Grafico 4").Activate
	ActiveChart.SeriesCollection(11).DataLabels.Select
	Selection.Position = xlLabelPositionCenter
End Sub

I think that I can use this for now, should it work.. right?

At least Office 2007!

Share this post


Link to post
Share on other sites

Posted

If you translate it to AutoIt it should work.

ActiveChart.SeriesCollection(11).ErrorBar Direction:=xlY, Include:=xlMinusValues, Type:=xlPercent, Amount:=100
should become something like:
ActiveChart.SeriesCollection(11).ErrorBar($xlY, $xlMinusValues, $xlPercent, 100)
(but I'm not 100% sure - I will have to test it tomorrow)

Can you post a screenshot of the resulting Excel chart? So we can test that we get the same result when we put the error bars into a function of the UDF.

Share this post


Link to post
Share on other sites

Posted

This

Sub Macro6()

	Range("A5:B5").Select
	ActiveSheet.Shapes.AddChart.Select
	ActiveChart.SetSourceData Source:=Range("'Foglio1'!$A$5:$B$5")
	ActiveChart.ChartType = xlXYScatter
	ActiveChart.SeriesCollection(1).Select
	ActiveChart.SeriesCollection(1).HasErrorBars = True
	ActiveChart.SeriesCollection(1).ErrorBars.Select
	ActiveChart.SeriesCollection(1).ErrorBars.EndStyle = xlNoCap
	ActiveChart.SeriesCollection(1).ErrorBar Direction:=xlY, Include:= _
		xlMinusValues, Type:=xlFixedValue, Amount:=1
	ActiveChart.ChartArea.Select
	ActiveChart.SeriesCollection(1).ApplyDataLabels

End Sub

generates

Posted Image

but macro does not:

  • apply the styles
  • center the label
  • delete the horizontal error bar
Posted Image

Thanks

Share this post


Link to post
Share on other sites

Posted

Not perfect, but I hope it's a good start:

#include <ExcelChart.au3>

; *****************************************************************************
; Create example environment
; *****************************************************************************
Global $aExcel = _XLChart_Example(True, 0, -1, -1, -1)
If @error = 2 Then Exit MsgBox(16, "Excel Chart Example Script", "The installed Excel version is not supported by this UDF!" & @CRLF & "Version must be >= 12 (Excel 2007).")
If @error <> 0 Then Exit MsgBox(16, "Excel Chart Example Script", "Error " & @error & " returned by _XLChart_Example on line " & @ScriptLineNumber)

$iXLC_Debug = 2
Global $iTop
_ExcelWriteCell($aExcel[0], "", "B2:B5")                                            ; Clear all cells but one
_XLChart_SeriesSet($aExcel[1] .SeriesCollection(1), $xlLine)                        ; Remove markers
$aExcel[1].SeriesCollection(1).HasErrorBars = True                                    ; Activate Error bars
$aExcel[1].SeriesCollection(1).ErrorBars.EndStyle = $xlNoCap                        ; No cap
$aExcel[1].SeriesCollection(1).ErrorBar($xlY, $xlMinusValues, $xlPercent, 100)        ; Set error bars
$aExcel[1].SeriesCollection(1).ApplyDataLabels()                                    ; Appl
$aExcel[1].SeriesCollection(1).DataLabels.Position = 0                                ; Set the data labels above
_XLChart_LineSet($aExcel[1].SeriesCollection(1).ErrorBars, 1, 0x4A7EBB)                ; Set line color for the error bar
_XLChart_LineSet($aExcel[1].SeriesCollection(1).DataLabels, 2, 0x4A7EBB)            ; Set line color of the data label
$iTop = $aExcel[1].SeriesCollection(1).Points(5).DataLabel.Top
$aExcel[1].SeriesCollection(1).Points(5).DataLabel.Top = $iTop + 5                    ; Reposition the data label
$aExcel[1].SeriesCollection(1).Points(5).DataLabel.Text = "Test"                    ; Set text of a point of the data label

Share this post


Link to post
Share on other sites

Posted (edited)

Ok, as is I have:

>Running AU3Check (1.54.22.0)  from:C:Program Files (x86)AutoIt3
Z:AutoITsamplesErrorBar.au3(15,93) : WARNING: $xlNoCap: possibly used before declaration.
$aExcel[1].SeriesCollection(1).ErrorBars.EndStyle = $xlNoCap						; No cap
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
Z:AutoITsamplesErrorBar.au3(16,45) : WARNING: $xlY: possibly used before declaration.
$aExcel[1].SeriesCollection(1).ErrorBar($xlY,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

If I declare the vars, script works but I've two "Type mismatch" debug info.. If not styles aren't applied.

Probably not important now.

Bars does not cross X axis, in fact Display -> Direction is set to Both and not Negative and Error Amount is set to Fixed value: 5.0 and not Percentage: 100. Why? ;)

Label is not set correctly.. next step :)

Edited by maba

Share this post


Link to post
Share on other sites

Posted

Sorry, forgot to replace this two constants with their values.

$xlNoCap = 2 and $xlY = 1

I will post a screenshot of what I got with Excel 2010 tomorrow.

Share this post


Link to post
Share on other sites

Posted (edited)

Ok, is the right way :)

Posted Image

A little problem with the label.. but it is good. On Excel 2007.

Edited by maba

Share this post


Link to post
Share on other sites

Posted

The positioning of the text is not perfect in Excel 2010 too. We could either play around with changing the "left" property or to change the datalabels.position to center. But in this case the line will end in the center of the box. If we use a filling for the box then the line will be invisible and the text will be centered automatically.

I will check how much of the errorbar properties can be set by a function.

Share this post


Link to post
Share on other sites

Posted

Yes, box filling is perfect for me.

Thanks for your time!

Share this post


Link to post
Share on other sites

Posted

I'm going to post such an example tomorrow.

Share this post


Link to post
Share on other sites

Posted

Hi maba,

here is the enhanced version:

#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_AU3Check_Parameters= -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#AutoIt3Wrapper_AU3Check_Stop_OnWarning=Y
#include-once
#include <ExcelChart.au3>

; *****************************************************************************
; Create example environment
; *****************************************************************************
Global $aExcel = _XLChart_Example(True, 0, -1, -1, -1)
If @error = 2 Then Exit MsgBox(16, "Excel Chart Example Script", "The installed Excel version is not supported by this UDF!" & @CRLF & "Version must be >= 12 (Excel 2007).")
If @error <> 0 Then Exit MsgBox(16, "Excel Chart Example Script", "Error " & @error & " returned by _XLChart_Example on line " & @ScriptLineNumber)

$iXLC_Debug = 2
Global $iTop
_ExcelWriteCell($aExcel[0], "", "B4:B5")                                            ; Clear all cells but one
$aExcel[1].SeriesCollection(1).HasErrorBars = True                                    ; Activate Error bars
$aExcel[1].SeriesCollection(1).ErrorBars.EndStyle = 2                                ; No cap: $xlNoCap
$aExcel[1].SeriesCollection(1).ErrorBar(1, $xlMinusValues, $xlPercent, 100)            ; Set error bars: ($xlY, $xlMinusValues, $xlPercent, 100)
$aExcel[1].SeriesCollection(1).ApplyDataLabels()                                    ; Apply the datalabels
$aExcel[1].SeriesCollection(1).DataLabels.Position = -4108                            ; Set the data labels centered: $xlLabelPositionCenter
_XLChart_LineSet($aExcel[1].SeriesCollection(1), Default, Default, False, Default, Default, $xlSheetHidden) ; Set series 1 to invisible
$aExcel[1].Legend.LegendEntries.Item(1).Delete()                                     ; Remove the legend entry for dataseries 1
_XLChart_LineSet($aExcel[1].SeriesCollection(1).ErrorBars, 1, 0x4A7EBB)                ; Set line color for the error bar
_XLChart_LineSet($aExcel[1].SeriesCollection(1).DataLabels, 1, 0)                    ; Set line color of the data label
_XLChart_FillSet($aExcel[1].SeriesCollection(1).DataLabels, 0x4A7EBB)                ; Fill the datalabel
$aExcel[1].SeriesCollection(1).Points(5).DataLabel.Text = "Test3"                    ; Set text of a point of the data label
$aExcel[1].SeriesCollection(1).Points(2).DataLabel.Text = "Test2"
$aExcel[1].SeriesCollection(1).Points(1).DataLabel.Text = "Test1" & @LF & "Next line"

Share this post


Link to post
Share on other sites

Posted

Yep! It works well!

When I'll finish my charts I'll post a full example.

THANKS!

Share this post


Link to post
Share on other sites

Posted

I'm just writing the _XLChart_ErrorBarSet function. The next version of the UDF will have this function.

Share this post


Link to post
Share on other sites

Posted

One thing: error bars series is always in "background": both SeriesCollection(1) and SeriesCollection(n) are always set behind other series.

Share this post


Link to post
Share on other sites

Posted

You can change the plotorder of a data series within a chartgroup. It didn't work for the example - the markers of data series 2 always overwrite the errorbar.

Maybe this helps for your chart:

$aExcel[1].ChartGroups(1).SeriesCollection(2).PlotOrder = 1

Share this post


Link to post
Share on other sites

Posted

:) no way to set errorbar PlotOrder for now.

Share this post


Link to post
Share on other sites

Posted

Just for the records. When the error bars are moved to the secondary value axis they overwrite even the markers.

An example will follow!

Share this post


Link to post
Share on other sites

Posted

==Originally posted on the download thread (can't edit/remove it that I can see) ==

When creating charts using _XLChart_ChartCreate(), the chart name is not being set (it seems to work for charts created on a chart sheet).

For example, if I pass "A" into the $sXLC_ChartName parameter, and run _XLChart_ChartsGet(), the chart name is listed as "Chart 1". It is also listed as "Chart 1" in the Layout ribbon with the chart selected in excel.

I've added a messagebox to the _XLChart_ChartCreate() to make sure the value is passed in properly, and it is. The $oXLC_Chart.Name value will display as "SheetName Chart 1" where sheet name is the name of the sheet that has the chart.

Is it possible to get more info on what is wrong? Or perhaps have _XLChart_ChartsGet() also pull the chart title?

This UDF is otherwise very handy so far! Your beta release was perfect timing!

Share this post


Link to post
Share on other sites

Posted

To edit/remove a post you have to have at least a post count of 5 - IIRC.

I'm going to answer your question here.

What version of Excel do you use?

We have noticed a strange behaviour with the name property but haven't been able to find the reason.

Share this post


Link to post
Share on other sites

Posted

I confirm that this is an issue on my Excel 2007 as well as Excel 2010.

I didn't notice the issue because I didn't focus on the chart names (yet...)... sorry for this.

In debug mode I get effectively following error:

Error 2147352567 (80020009) 'Not enough storage is available to complete this operation'

for this line:

If $sXLC_ChartName <> "" Then $oXLC_Chart.Name = $sXLC_ChartName

When I use the raw code outside the function, for example

$oChart.Name = "Main Chart"

I get the same error.

I will search for a workaround and if possible for a bugfix.

Changing the chart name in interactive mode (Layout, Properties) works, so I guess we should find what is wrong in the code.

GreenCan

Share this post


Link to post
Share on other sites

Posted (edited)

I think this remark explains what's going on.

"This property is read-only for chart objects (embedded charts)."

So you can set the name for a chartsheet but not for a chart object.

In the next version of the UDF the parameter will be ignored for embedded charts work for both chartsheets and embedded charts.

Edited by water

Share this post


Link to post
Share on other sites

Posted (edited)

You are correct water but there is a solution...

This works:

$oChart1.Parent.Name = "Name of this Chart"

@valiryon, you can use this as a workaround until we come with a new release. that will be pretty soon (a matter of days).

... I am having a coffee break now :)

Edited by GreenCan

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0