Chart numberformat space bug
2019-06-28 Charts 0 247
Are you using a space char as the thousandsseparator in numberformats, like "# ##0", "# ##0.00", "# ##0 " or "# ##0.0 "?
You have probably noticed that ticklabels and datalabels in a chart sometimes show your numbers with an incorrect numberformat.
The numbers will be displayed correct if you replace the space in the numberformat for the ticklabels and datalabels with Chr(160) (nobreakspace).
The macros below can be used to update all charts in a workbook and replace the space char with a nobreakspace char in ticklabels and datalabels numberformats that has a space character as the thousandsseparator:
Sub Charts_FixThousandsSeparatorBug(Optional wb As Workbook = Nothing) ' updated 2019-06-28 by OPE ' fixes bug regarding numberformats using space as thousandsseparator (converts space to nobreakspace) ' example: Charts_FixThousandsSeparatorBug ActiveWorkbook Dim strTS As String, ws As Worksheet, objCO As ChartObject, objChart As Chart If Application.UseSystemSeparators Then strTS = Application.International(xlThousandsSeparator) Else strTS = Application.ThousandsSeparator End If If strTS <> " " Then Exit Sub ' no bug to fix If wb Is Nothing Then On Error Resume Next Set wb = ActiveWorkbook On Error GoTo 0 If wb Is Nothing Then Exit Sub End If For Each ws In wb.Worksheets For Each objCO In ws.ChartObjects Chart_FixThousandsSeparatorBug objCO.Chart, strTS Next objCO Next ws For Each objChart In wb.Charts Chart_FixThousandsSeparatorBug objChart, strTS Next objChart End Sub Sub Chart_FixThousandsSeparatorBug(objChart As Chart, Optional strTS As String = vbNullString) ' updated 2019-06-28 by OPE ' fixes bug regarding numberformats using space as thousandsseparator (converts space to nobreakspace) ' example: Chart_FixThousandsSeparatorBug ActiveSheet.ChartObjects(1).Chart Dim i As Long, j As Long, varAxis As Variant, varIndex As Variant If objChart Is Nothing Then Exit Sub If Len(strTS) = 0 Then If Application.UseSystemSeparators Then strTS = Application.International(xlThousandsSeparator) Else strTS = Application.ThousandsSeparator End If End If If strTS <> " " Then Exit Sub ' no bug to fix varAxis = Array(xlValue, xlCategory) varIndex = Array(xlPrimary, xlSecondary) With objChart ' update numberformat for the chart axis tickmark labels For i = LBound(varAxis) To UBound(varAxis) For j = LBound(varIndex) To UBound(varIndex) If .HasAxis(varAxis(i), varIndex(j)) Then With .Axes(varAxis(i), varIndex(j)).TickLabels If InStr(1, .NumberFormat, "# #", vbTextCompare) > 0 Then .NumberFormat = Replace(.NumberFormat, " ", Chr(160)) ' fixes bug but unlinks the numberformat End If End With End If Next j Next i ' update numberformat for the chart series data labels For i = 1 To .FullSeriesCollection.Count With .FullSeriesCollection(i) If .HasDataLabels Then For j = 1 To .Points.Count With .Points(j).DataLabel If InStr(1, .NumberFormat, "# #", vbTextCompare) > 0 Then .NumberFormat = Replace(.NumberFormat, " ", Chr(160)) ' fixes bug but unlinks the numberformat End If End With Next j End If End With Next i End With End Sub