Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

Messpunktlage Diagramm in einer Zeile mit Höhe 15

Forumthread: Messpunktlage Diagramm in einer Zeile mit Höhe 15

Messpunktlage Diagramm in einer Zeile mit Höhe 15
17.12.2025 16:21:03
Matthias Kästner
Hallo zusammen,

ich möchte am Ende meiner Tabelle ein Messpunktlage Diagramm einfügen wie auf den Bild zu sehen.

Userbild

Ich habe es jetzt schon mit Gemini und Copilot probiert und bekomme es nicht hin. Das ist der aktuelle Status über VBA.

Userbild

Ich möchte eine Zeilen höhe von 15, Gemini sagt ich muss 19 mindestens nehmen, aber auch dann sieht es nicht so aus wie auf Bild 1.

Der VBA Code lautet:
Option Explicit


' ===== FESTE EINSTELLUNGEN =====
Const MAIN_SHEET As String = "Test"
Const FIRST_DATA_ROW As Long = 11
Const CHART_LEFT_COL As Long = 14
Const CHART_WIDTH As Double = 120
Const CHART_HEIGHT As Double = 19 ' Optimierte Höhe für scharfe Striche

Public Sub BuildScatterErrorCharts()
Dim ws As Worksheet
Dim lastRow As Long, r As Long

' Hilfsfunktion sicher aufrufen
Set ws = SheetByNameSafe(MAIN_SHEET)
If ws Is Nothing Then Exit Sub

lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row
If lastRow FIRST_DATA_ROW Then Exit Sub

DeleteChartsOnRight ws

For r = FIRST_DATA_ROW To lastRow
If NzDbl(ws.Cells(r, "D").value) > 0 Or NzDbl(ws.Cells(r, "E").value) > 0 Then
CreateErrorBarChart ws, r
End If
Next r
End Sub

Private Sub CreateErrorBarChart(ws As Worksheet, ByVal r As Long)
Dim minVal As Double, maxVal As Double, istVal As Double, uMM As Double
Dim co As chartObject, ch As Chart

' Daten einlesen
minVal = NzDbl(ws.Cells(r, "D").value)
istVal = NzDbl(ws.Cells(r, "E").value)
maxVal = NzDbl(ws.Cells(r, "F").value)
uMM = NzDbl(ws.Cells(r, "H").value) / 1000#

Set co = ws.ChartObjects.Add( _
Left:=ws.Cells(r, CHART_LEFT_COL).Left + 2, _
Top:=ws.Cells(r, CHART_LEFT_COL).Top + 1, _
Width:=CHART_WIDTH, Height:=CHART_HEIGHT)

Set ch = co.Chart
ch.ChartType = xlXYScatter

' 1. HORIZONTALE BALKEN (Toleranz & Unsicherheit)
' Blaue Toleranz
AddHorizontalRange ch, istVal, minVal, maxVal, RGB(0, 112, 192), 6
' Rote Unsicherheit
AddHorizontalRange ch, istVal, istVal - uMM, istVal + uMM, RGB(255, 0, 0), 2.5

' 2. VERTIKALE STRICHE (Begrenzungen wie Bild 1)
AddVerticalStrich ch, minVal, RGB(0, 0, 150), 1.5, 0.6
AddVerticalStrich ch, maxVal, RGB(0, 0, 150), 1.5, 0.6
AddVerticalStrich ch, istVal, RGB(0, 0, 0), 2.2, 0.85

' --- OPTIK & ACHSEN ---
ch.HasLegend = False: ch.HasTitle = False
ch.ChartArea.Format.Line.Visible = msoFalse

With ch.Axes(xlCategory)
.MinimumScale = minVal - 0.03
.MaximumScale = maxVal + 0.03
.TickLabelPosition = xlTickLabelPositionNone
.MajorTickMark = xlTickMarkNone
.Format.Line.Visible = msoFalse
End With

With ch.Axes(xlValue)
.MinimumScale = 0: .MaximumScale = 2
.TickLabelPosition = xlTickLabelPositionNone
.Format.Line.Visible = msoFalse
End With

' PlotArea dehnen
On Error Resume Next
With ch.PlotArea: .Top = 0: .Left = 0: .Width = co.Width: .Height = co.Height: End With
On Error GoTo 0
End Sub

' ==== UNVERZICHTBARE HILFSFUNKTIONEN ====

Private Sub AddHorizontalRange(ch As Chart, ist As Double, vMin As Double, vMax As Double, col As Long, w As Double)
Dim s As Series: Set s = ch.SeriesCollection.NewSeries
s.xValues = Array(ist): s.Values = Array(1)
s.MarkerStyle = xlMarkerStyleNone
s.HasErrorBars = True
With s.ErrorBars
.EndStyle = xlNoCap
s.ErrorBar Direction:=xlX, Include:=xlBoth, Type:=xlCustom, _
Amount:=Abs(vMax - ist), MinusValues:=Abs(ist - vMin)
With .Format.Line: .ForeColor.RGB = col: .weight = w: End With
End With
End Sub

Private Sub AddVerticalStrich(ch As Chart, xPos As Double, col As Long, w As Double, h As Double)
Dim s As Series: Set s = ch.SeriesCollection.NewSeries
s.xValues = Array(xPos): s.Values = Array(1)
s.MarkerStyle = xlMarkerStyleNone
s.HasErrorBars = True
With s.ErrorBars
.EndStyle = xlNoCap
s.ErrorBar Direction:=xlY, Include:=xlBoth, Type:=xlFixedValue, Amount:=h
With .Format.Line: .ForeColor.RGB = col: .weight = w: End With
End With
End Sub

Private Sub DeleteChartsOnRight(ws As Worksheet)
Dim co As chartObject
For Each co In ws.ChartObjects
If co.Left >= ws.Cells(1, CHART_LEFT_COL).Left - 5 Then co.Delete
Next co
End Sub

Private Function NzDbl(v As Variant) As Double
If IsError(v) Then NzDbl = 0# Else If IsEmpty(v) Or v = "" Then NzDbl = 0# Else NzDbl = CDbl(v)
End Function

Private Function SheetByNameSafe(ByVal sName As String) As Worksheet
On Error Resume Next
Set SheetByNameSafe = ThisWorkbook.Worksheets(sName)
On Error GoTo 0
End Function



Könnte mir eventuell jemand helfen?

Viele Grüße
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
sollen wir das nachbauen? owT
17.12.2025 16:58:40
Uduuh
AW: Messpunktlage Diagramm in einer Zeile mit Höhe 15
18.12.2025 19:23:48
Uduuh
Hallo,
das dürfte deiner Vorstellung recht nahe kommen:
Private Sub CreateErrorBarChart(ws As Worksheet, ByVal r As Long)

Dim minVal As Double, maxVal As Double, istVal As Double, uMM As Double
Dim co As chartObject, ch As Chart

' Daten einlesen
minVal = NzDbl(ws.Cells(r, "D").value)
istVal = NzDbl(ws.Cells(r, "E").value)
maxVal = NzDbl(ws.Cells(r, "F").value)
uMM = NzDbl(ws.Cells(r, "H").value) / 1000#

Set co = ws.ChartObjects.Add(0, 0, 0, 0)
With co
.Left = ws.Cells(r, CHART_LEFT_COL).Left + 2
.Top = ws.Cells(r, CHART_LEFT_COL).Top - 7
.Width = CHART_WIDTH
.Height = CHART_HEIGHT
End With



Set ch = co.Chart
ch.ChartType = xlXYScatter

' 1. HORIZONTALE BALKEN (Toleranz & Unsicherheit)
' Blaue Toleranz
AddHorizontalRange ch, istVal, minVal, maxVal, RGB(0, 112, 192), 6
' Rote Unsicherheit
AddHorizontalRange ch, istVal, istVal - uMM, istVal + uMM, RGB(255, 0, 0), 2.5

' 2. VERTIKALE STRICHE (Begrenzungen wie Bild 1)
AddVerticalStrich ch, minVal, RGB(0, 0, 150), 1.5, 0.6
AddVerticalStrich ch, maxVal, RGB(0, 0, 150), 1.5, 0.6
AddVerticalStrich ch, istVal, RGB(0, 0, 0), 2.2, 0.85

' --- OPTIK & ACHSEN ---
ch.HasLegend = False: ch.HasTitle = False
ch.ChartArea.Format.Line.Visible = msoFalse

ch.ChartArea.Format.Fill.Visible = False

With ch.Axes(xlCategory)
.MinimumScale = minVal - 0.03
.MaximumScale = maxVal + 0.03
.TickLabelPosition = xlTickLabelPositionNone
.MajorTickMark = xlTickMarkNone
.Format.Line.Visible = msoFalse
End With

With ch.Axes(xlValue)
.MinimumScale = 0: .MaximumScale = 2
.TickLabelPosition = xlTickLabelPositionNone
.Format.Line.Visible = msoFalse
.MajorGridlines.Format.Line.Visible = msoFalse
End With

' PlotArea dehnen
On Error Resume Next
With ch.PlotArea: .Top = 0: .Left = 0: .Width = co.Width: .Height = co.Height: End With
On Error GoTo 0
End Sub

Gruß aus'm Pott
Udo
Anzeige
AW: das kommt dem ...
19.12.2025 11:40:09
schauan
... noch etwas näher ...
Übrigens, wenn man das PlotArea selektiert, wird es auch ordentlich skaliert ;-) Entsprechend könnte man am Ende vom aufrufenden Sub eine Zelle aktivieren.

Private Sub CreateErrorBarChart(ws As Worksheet, ByVal r As Long)

Dim minVal As Double, maxVal As Double, istVal As Double, uMM As Double, solVal As Double
Dim co As chartObject, ch As Chart

' Daten einlesen und in double wandeln
solVal = NzDbl(ws.Cells(r, "C").value) 'Max
minVal = NzDbl(ws.Cells(r, "D").value) 'Min
istVal = NzDbl(ws.Cells(r, "E").value) 'Ist
maxVal = NzDbl(ws.Cells(r, "F").value) 'Max
uMM = NzDbl(ws.Cells(r, "H").value) / 1000# 'Unsicherheit_1

'Diagramm in Zelle einfuegen
Set co = ws.ChartObjects.Add( _
Left:=ws.Cells(r, CHART_LEFT_COL).Left + 2, _
Top:=ws.Cells(r, CHART_LEFT_COL).Top + 1, _
Width:=CHART_WIDTH, Height:=CHART_HEIGHT)

'Diagrammtyp
Set ch = co.Chart
ch.ChartType = xlXYScatter

'2. VERTIKALE STRICHE (Begrenzungen wie Bild 1)
AddVerticalStrich ch, minVal, RGB(0, 0, 150), 1.5, 1.6
AddVerticalStrich ch, maxVal, RGB(0, 0, 150), 1.5, 1.6
AddVerticalStrich ch, solVal, RGB(0, 0, 150), 2.2, 1.6
AddVerticalStrich ch, istVal, RGB(255, 0, 0), 2.2, 0.5

' --- OPTIK & ACHSEN ---
ch.HasLegend = False: ch.HasTitle = False
ch.ChartArea.Format.Line.Visible = msoFalse

With ch.Axes(xlCategory)
.MinimumScale = minVal - 0.03
.MaximumScale = maxVal + 0.03
.TickLabelPosition = xlTickLabelPositionNone
.MajorTickMark = xlTickMarkNone
.Format.Line.Visible = msoFalse
End With

With ch.Axes(xlValue)
.MinimumScale = 0: .MaximumScale = 2
.TickLabelPosition = xlTickLabelPositionNone
.MajorGridlines.Format.Line.Visible = msoFalse
End With

'sekundaere Achse fuer rechte Begrenzungslinie
ch.FullSeriesCollection(1).AxisGroup = 2
' Sekundäre X-Achse: AxisGroup(2), xlCategory
With ch.Axes(xlCategory, xlSecondary)
.HasTitle = False ' Achsentitel ausblenden
End With

' Sekundäre Y-Achse: AxisGroup(2), xlValue
With ch.Axes(xlValue, xlSecondary)
.MinimumScale = 0: .MaximumScale = 2
.HasTitle = False
.TickLabelPosition = xlTickLabelPositionNone
End With

'Istwert verdicken
ch.FullSeriesCollection(4).ErrorBars.Format.Line.weight = 6
'horizontale rote Linie
Dim xVal, yVal
xVal = Array(istVal - 0.03, istVal + 0.03) 'hierfuer ggf. Werte berechnen
yVal = Array(1, 1)
With ch.SeriesCollection.NewSeries
.xValues = xVal
.Values = yVal
.Border.Color = RGB(255, 0, 0)
.Name = "HorizontalLine"
End With

' PlotArea dehnen
With ch.PlotArea
.Select
.Top = 0
.Left = -5
.Width = co.Width - 1
.Height = co.Height - 5
End With
End Sub
Anzeige
AW: sollen wir das nachbauen? owT
18.12.2025 07:31:37
Matthias Kästner
https://www.herber.de/bbs/user/179871.xlsm

Hallo Uduuh,

nein nachbauen soll niemand etwas. Ich möchte in einer Zeile Höhe 15 das Diagramm aus Bild1 und bekomme es nicht hin, daher dachte ich mir das vielleicht ein Excelprofi helfen könnte?
Anzeige
AW: Hast Du mal
18.12.2025 09:54:08
schauan
... im Code geschaut, wo es um die Höhen geht? Da hilft zuweilen ein Wörterbuch und die Kommentare erklären so einiges ;-)
Da steht z.B.

Const CHART_HEIGHT As Double = 19 ' Optimierte Höhe für scharfe Striche

Könnte sein, dass die 19 nicht zur gewünschten 15 passt.
Könnte natürlich sein, wenn Du die 19 senkst, dass die Striche nicht mehr Schaaf sind ;-)
Könnte auch sein, dass Du flexibel auf verschiedene Höhen und Tiefen reagieren willst, die Constanze wäre dann nicht zielführend.
Könnte ...
Anzeige

Forumthreads zu verwandten Themen

Anzeige