06.03.2018, 23:04
Servus!
Ich bin auf der Suche nach einer Lösung zu diesem Sachverhalt:
In einer Exceldatei gibt es - neben anderen Tabellenblättern- solche, die jeweils als Datenblatt für
ein bestimmtes Produkt fungieren. Diese weisen jeweils einen Range "Sachnummer" bzw. "Bezeichnung" auf.
Ich habe in einem Klassenmodul die Klasse "Datasheet" definiert.
Drüber hinaus habe ich eine Prozedur "InterneDatenblattListe_Erstellen" formuliert, die durch die ganze Mappe durchschleift und die Attribute der Datenblätter
einsammelt.
Für die Ausgabe der Inhalte auf einem Übersichtsblatt gibt es schließlich noch die UDF "DatenblattInfo".
Die Prozeduren funktionieren; jedoch stört mich, dass ich die Prozedur "InterneDatenblattListe_Erstellen" beim erneuten Öffnen der Datei
immer erst wieder durchführen muss. (Knopf "Interne Datenblattliste erzeugen" auf Blatt "Übersicht")
(Meine schöne interne Datenblattliste ist offenbar leider nur flüchtig da - ich verliere sie beim Schließen der Datei.)
Kennt ihr eine Möglichkeit, die attribuierten Instanzen einer Klasse dauerhalft zu behalten?
Vielen Dank schon mal für gute Tipps.
Gruß
Ludwig
Ich bin auf der Suche nach einer Lösung zu diesem Sachverhalt:
In einer Exceldatei gibt es - neben anderen Tabellenblättern- solche, die jeweils als Datenblatt für
ein bestimmtes Produkt fungieren. Diese weisen jeweils einen Range "Sachnummer" bzw. "Bezeichnung" auf.
Ich habe in einem Klassenmodul die Klasse "Datasheet" definiert.
Drüber hinaus habe ich eine Prozedur "InterneDatenblattListe_Erstellen" formuliert, die durch die ganze Mappe durchschleift und die Attribute der Datenblätter
einsammelt.
Für die Ausgabe der Inhalte auf einem Übersichtsblatt gibt es schließlich noch die UDF "DatenblattInfo".
Die Prozeduren funktionieren; jedoch stört mich, dass ich die Prozedur "InterneDatenblattListe_Erstellen" beim erneuten Öffnen der Datei
immer erst wieder durchführen muss. (Knopf "Interne Datenblattliste erzeugen" auf Blatt "Übersicht")
(Meine schöne interne Datenblattliste ist offenbar leider nur flüchtig da - ich verliere sie beim Schließen der Datei.)
Kennt ihr eine Möglichkeit, die attribuierten Instanzen einer Klasse dauerhalft zu behalten?
Vielen Dank schon mal für gute Tipps.
Gruß
Ludwig
Code:
Option Explicit
'############# Klasse Datasheet definieren ##########
Private mstrSachnummer As String
Private mstrBezeichnung As String
Private mstrBlattName As String
'####################################################
Public Property Get Bezeichnung() As String
Bezeichnung = mstrBezeichnung
End Property
Public Property Let Bezeichnung(ByVal vNewValue As String)
mstrBezeichnung = vNewValue
End Property
'####################################################
Public Property Get Sachnummer() As String
Sachnummer = mstrSachnummer
End Property
Public Property Let Sachnummer(ByVal vNewValue As String)
mstrSachnummer = vNewValue
End Property
'####################################################
Public Property Get BlattName() As String
BlattName = mstrBlattName
End Property
Public Property Let BlattName(ByVal vNewValue As String)
mstrBlattName = vNewValue
End Property
Code:
Option Explicit
Public datasheet() As cls_Datasheet
Sub InterneDatenblattListe_Erstellen()
'############################################################
'##### Prozedur zur Erstellung einer ##################
'##### prozedurinternen Datenblattliste ##################
'############################################################
Dim wsBlatt As Worksheet 'einige Variablen
Dim bolDaBla As Boolean
Dim i As Integer, j As Integer
i = 0 'sichern, dass integers auf 0 stehn
j = 0
For Each wsBlatt In Worksheets 'Tabellenblätter zählen, die denn Kenn-Range "Sachnummer" aufweisen
bolDaBla = True 'Arbeitshypothese: Tabellenblatt ist ein Datenblatt
On Error Resume Next 'Fehlerroutine, falls Range "Sachnummer" nicht gefunden wird
If IsError(Intersect(wsBlatt.Range("1:100"), wsBlatt.Range("Sachnummer"))) Then
bolDaBla = False 'wenn kein Range "Sachnummer", dann ist es kein Datenblatt
End If
Err.Clear
On Error GoTo 0
If bolDaBla Then 'Für identifiziertes datenblatt Zähler um 1 hochsetzen
j = j + 1
End If
Next
ReDim datasheet(j) 'cls_Datsheet-Objekt dimensionieren
For Each wsBlatt In Worksheets 'alle Tabellenblätter durchgehen
bolDaBla = True 'Arbeitshypothese: Tabellenblatt ist ein Datenblatt
On Error Resume Next 'Fehlerroutine, falls Range "Sachnummer" nicht gefunden wird
If IsError(Intersect(wsBlatt.Range("1:100"), wsBlatt.Range("Sachnummer"))) Then ' aus den identifizierten Tabellenblättern
' wird das cls_datasheet-Objekt
bolDaBla = False 'wenn kein Range "Sachnummer", dann ist es kein Datenblatt
End If
On Error GoTo 0
If bolDaBla Then
i = i + 1 'wenn es ein Datenblatt ist,
Set datasheet(i) = New cls_Datasheet
datasheet(i).Sachnummer = wsBlatt.Range("Sachnummer").Value 'dann werden Atrribute
datasheet(i).Bezeichnung = wsBlatt.Range("Bezeichnung").Value
datasheet(i).BlattName = wsBlatt.Name
End If 'befüllt
Next
Application.Calculate 'Berechnung starten
End Sub
Code:
'###############################Funktion zur Infoausgabe in der Excel-Mappe #########################################
Public Function DatenblattInfo(strAttribut As String, z As Integer) As String
Application.Volatile
If strAttribut = "Sachnummer" Then
DatenblattInfo = datasheet(z).Sachnummer
End If
If strAttribut = "Bezeichnung" Then
DatenblattInfo = datasheet(z).Bezeichnung
End If
If strAttribut = "Blattname" Then
DatenblattInfo = datasheet(z).BlattName
End If
End Function