PDA

Vollständige Version anzeigen : Mappe stürzt beim Öffnen ab - RibbonX schuld?


mathieu_91
21.09.2016, 09:21
Hallo,

bei zwei Nutzern ist folgendes Problem aufgetreten:

Sie haben die Mappe geöffnet, dabei ist Excel abgestürzt.
Teilweise konnten Sie noch Werte in einer Zelle ändern, daraufhin stürzte es ab.
Meist ist es aber bereits beim Excel Ladebildschirm (Grünes Rechteck) abgestürzt.

Makros waren aktiviert. Keine Fehlermeldungen.
Auch erneutes Öffnen führt zu keiner Besserung.
Irgendwann, nach teilweise 10-15 Mal Versuchen, geht es dann.
Manchmal hilft auch ein Neustart des Computers.

Bei den anderen Nutzern und mir läuft die Liste tadellos.

Ich habe diese Datei mit RibbonX erweitert, damit greife ich ja faktisch in den XML Kern der Datei ein. Könnte es hier zu Beschädigungen oder Konflikten gekommen sein?

Grüße

Mathieu

mumpel
21.09.2016, 14:06
Hallo!

Kann ich mir nicht vorstellen. Was da genau los ist kann ich nicht sagen. Tritt das auch bei anderen Dateien auf?

Gruß, René

mathieu_91
21.09.2016, 15:07
Hallo René,

nein, nur bei dieser.
Bei einem anderen Tool, habe ich aber inzwischen unter Kontrolle, stürzte Excel immer mal beim schließen ab, da ich ein Before_Close Ereignis hatte, welcher auch die Ribbons anspricht.

Was ebenfalls vorkommt ist der Absturz von RibbonX Listen, wenn zwei gleichzeitig offen sind. Jedenfalls ist es auffällig.

Habe für jede Liste versucht stets einzigartige Begriffe für die Variablen zu wählen, da mir aufgefallen ist, dass bei gleichen Variablennamen in verschiedenen Listen mit RibbonX es vermehrt zu Abstürzen gekommen ist...

Option Explicit

Public wlYourRibbon As IRibbonUI
Public MyTag As String
Public Press As Boolean

#If VBA7 Then
Public Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef destination As Any, ByRef source As Any, ByVal length As Long)
#Else
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef destination As Any, ByRef source As Any, ByVal length As Long)
#End If

Public Sub wlRibbonOnLoad(wlribbon As IRibbonUI)
Set wlYourRibbon = wlribbon
ThisWorkbook.Sheets("LOP-Config").Range("A1").Value = ObjPtr(wlribbon)
If LeadStat = True Then
Call RefreshRibbon(Tag:="MASTAT")
Else
Call RefreshRibbon(Tag:="WLSTAT")
End If
End Sub

#If VBA7 Then
Function GetRibbon(ByVal lRibbonPointer As LongPtr) As Object
#Else
Function GetRibbon(ByVal lRibbonPointer As Long) As Object
#End If
Dim wlobjRibbon As Object
CopyMemory wlobjRibbon, lRibbonPointer, LenB(lRibbonPointer)
Set GetRibbon = wlobjRibbon
Set wlobjRibbon = Nothing
End Function

Public Sub Checkbox_onAction_wlhalten(control As IRibbonControl, pressed As Boolean)
Dim ws As Worksheet
Dim shp As ChartObject
Dim Diagramm As String
Dim MyChart As Chart
On Error Resume Next
Set ws = ThisWorkbook.Worksheets("PJ-Statistic")
With ws
If .Columns(51).Width > 0 Then
.Columns(51).EntireColumn.Hidden = True
Else
.Columns(51).EntireColumn.Hidden = False
For Each shp In .ChartObjects
Diagramm = shp.Name
Set MyChart = ws.ChartObjects(Diagramm).Chart
With MyChart
.FullSeriesCollection(1).Format.Fill.ForeColor.RGB = RGB(169, 83, 255)
End With
Next
End If
End With
Set ws = Nothing
End Sub

Public Sub Checkbox_onAction_wloffen(control As IRibbonControl, pressed As Boolean)
Dim ws As Worksheet
Dim shp As ChartObject
Dim Diagramm As String
Dim MyChart As Chart
On Error Resume Next
Set ws = ThisWorkbook.Worksheets("PJ-Statistic")
With ws
If ActiveSheet.Columns(52).Width > 0 Then
ActiveSheet.Columns(52).EntireColumn.Hidden = True
Else
ActiveSheet.Columns(52).EntireColumn.Hidden = False
For Each shp In .ChartObjects
Diagramm = shp.Name
Set MyChart = ws.ChartObjects(Diagramm).Chart
With MyChart
.FullSeriesCollection(2).Format.Fill.ForeColor.RGB = RGB(255, 255, 0)
End With
Next
End If
End With
Set ws = Nothing
End Sub

Public Sub Checkbox_onAction_wlgenehmigen(control As IRibbonControl, pressed As Boolean)
Dim ws As Worksheet
Dim shp As ChartObject
Dim Diagramm As String
Dim MyChart As Chart
On Error Resume Next
Set ws = ThisWorkbook.Worksheets("PJ-Statistic")
With ws
If ActiveSheet.Columns(53).Width > 0 Then
ActiveSheet.Columns(53).EntireColumn.Hidden = True
Else
ActiveSheet.Columns(53).EntireColumn.Hidden = False
For Each shp In .ChartObjects
Diagramm = shp.Name
Set MyChart = ws.ChartObjects(Diagramm).Chart
With MyChart
.FullSeriesCollection(3).Format.Fill.ForeColor.RGB = RGB(255, 124, 128)
End With
Next
End If
End With
Set ws = Nothing
End Sub

Public Sub Checkbox_onAction_wlerledigt(control As IRibbonControl, pressed As Boolean)
Dim ws As Worksheet
Dim shp As ChartObject
Dim Diagramm As String
Dim MyChart As Chart
On Error Resume Next
Set ws = ThisWorkbook.Worksheets("PJ-Statistic")
With ws
If ActiveSheet.Columns(54).Width > 0 Then
ActiveSheet.Columns(54).EntireColumn.Hidden = True
Else
ActiveSheet.Columns(54).EntireColumn.Hidden = False
For Each shp In .ChartObjects
Diagramm = shp.Name
Set MyChart = ws.ChartObjects(Diagramm).Chart
With MyChart
.FullSeriesCollection(4).Format.Fill.ForeColor.RGB = RGB(0, 176, 80)
End With
Next
End If
End With
Set ws = Nothing
End Sub

Public Sub Checkbox_getPressed_wlhalten(control As IRibbonControl, ByRef returnValue)
If Press Then returnValue = 1
returnValue = 1
End Sub

Public Sub Checkbox_getPressed_wloffen(control As IRibbonControl, ByRef returnValue)
If Press Then returnValue = 1
returnValue = 1
End Sub

Public Sub Checkbox_getPressed_wlgenehmigen(control As IRibbonControl, ByRef returnValue)
If Press Then returnValue = 1
returnValue = 1
End Sub

Public Sub Checkbox_getPressed_wlerledigt(control As IRibbonControl, ByRef returnValue)
If Press Then returnValue = 1
returnValue = 1
End Sub

Sub GetVisible_PJstat(control As IRibbonControl, ByRef visible)
On Error Resume Next
Select Case MyTag
Case "MASTAT"
visible = False
Case "PJSTAT"
visible = True
wlYourRibbon.ActivateTab ("tab" & ActiveSheet.Name)
Case "WLSTAT"
visible = False
Case "WLLOPCONF"
visible = False
Case Else
If control.Tag Like MyTag Then
visible = True
Else
visible = False
End If
End Select
End Sub

Sub GetVisible_MAstat(control As IRibbonControl, ByRef visible)
On Error Resume Next
Select Case MyTag
Case "PJSTAT"
visible = False
Case "MASTAT"
visible = True
wlYourRibbon.ActivateTab ("tab" & ActiveSheet.Name)
Case "WLSTAT"
visible = False
Case "WLLOPCONF"
visible = False
Case Else
If control.Tag Like MyTag Then
visible = True
Else
visible = False
End If
End Select
End Sub

Sub GetVisible_WLstat(control As IRibbonControl, ByRef visible)
On Error Resume Next
Select Case MyTag
Case "PJSTAT"
visible = False
Case "MASTAT"
visible = False
Case "WLSTAT"
visible = True
wlYourRibbon.ActivateTab ("tab" & ActiveSheet.Name)
Case "WLLOPCONF"
visible = False
Case Else
If control.Tag Like MyTag Then
visible = True
Else
visible = False
End If
End Select
End Sub

Sub GetVisible_wlLOPConf(control As IRibbonControl, ByRef visible)
On Error Resume Next
Select Case MyTag
Case "PJSTAT"
visible = False
Case "MASTAT"
visible = False
Case "WLSTAT"
visible = False
Case "WLLOPCONF"
visible = True
wlYourRibbon.ActivateTab ("tab" & ActiveSheet.Name)
Case Else
If control.Tag Like MyTag Then
visible = True
Else
visible = False
End If
End Select
End Sub

Sub RefreshRibbon(Tag As String)
MyTag = Tag
If wlYourRibbon Is Nothing Then
Set wlYourRibbon = GetRibbon(ThisWorkbook.Sheets("LOP-Config").Range("A1").Value)
wlYourRibbon.Invalidate
Else
wlYourRibbon.Invalidate
End If
End Sub

Sub Macro1(control As IRibbonControl)
Run "IniDocument"
End Sub

Sub Macro2(control As IRibbonControl)
Run "IniDocument"
End Sub

Sub Macro3(control As IRibbonControl)
Run "IniDocument"
End Sub

Sub Macro4(control As IRibbonControl)
Run "ScrollToEndToTop"
End Sub

Sub Macro5(control As IRibbonControl)
Run "ScrollToCharts"
End Sub

Sub Macro6(control As IRibbonControl)
Call ShowConfig
End Sub

Sub Macro7(control As IRibbonControl)
Run "SortWL"
End Sub

Sub Macro8(control As IRibbonControl)
Call Reset
End Sub

Sub Macro9(control As IRibbonControl)
Run "OpenHelpFileLead"
End Sub

Sub Macro10(control As IRibbonControl)
Run "OpenHelpFileUser"
End Sub

Sub Macro11(control As IRibbonControl)
Call cmdCheckUser
End Sub

Sub Macro12(control As IRibbonControl)
Run "ResetFilters"
End Sub

Sub Macro13(control As IRibbonControl)
Run "ResizeYAxis"
End Sub

Sub Macro14(control As IRibbonControl)
Run "Loadfrm_HandOver_Export"
End Sub

Sub Macro15(control As IRibbonControl)
Run "Loadfrm_LessonsLearned_Export"
End Sub


Das ist im Tool, was beim Schließen abstrüzte das RibbonX Modul.

Grüße

Mathieu

mumpel
21.09.2016, 18:12
Ich schau mir das mal bei Gelegheit an. Derzeit bin ich in Urlaub (bis 16.10.).

xlph
22.09.2016, 07:29
Habe für jede Liste versucht stets einzigartige Begriffe für die Variablen zu wählen, da mir aufgefallen ist, dass bei gleichen Variablennamen in verschiedenen Listen mit RibbonX es vermehrt zu Abstürzen gekommen ist...

Deswegen gibt es auch den Parameter 'control As IRibbonControl' !

If control.ID = "xyz" then