Daten aus Klassenelementen dauerhalft behalten
#1
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


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


Angehängte Dateien
.xlsm   20180306_LB1972_Skizze_mit_Klasse.xlsm (Größe: 35,51 KB / Downloads: 4)
Top
#2
Hallo, :19:

nimm doch folgenden Code unter "DieseArbeitsmappe": :21:


Code:
Option Explicit
Private Sub Workbook_Open()
    Call InterneDatenblattListe_Erstellen
End Sub
Top
#3
Hallo Case,


vielen Dank für deinen Tipp.

Das mit dem ereignisgesteuerten Prozedurstart ist als Plan B
wohl das Mittel der Wahl.


Meine Hoffnung besteht jedoch darin, dass jemand einen Kniff kennt,

die ermittelten Attribute "irgendwo im Hintergrund" behalten zu können.

(Vielleicht gibt es sowas schlicht nicht und dann werde ich gerne deinem Rat folgen.)

Danke und schönen Abend

Gruß

Ludwig
Top
#4
Klasse ? Wozu ?


Code:
Sub M_snb()
    For Each it In ThisWorkbook.Names
       If InStr(it, "!") Then c00 = c00 & vbLf & Split(Mid(it, 2), "!")(0) & "|" & it.RefersToRange
    Next

    MsgBox c00
End Sub
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Top
#5
Hallo snb,

weil ich einer relativ langen Liste von Teilen
(identifiziert durch die Sachnummer)

denjenigen, für die es ein Datenblatt (Tabellenblatt) gibt,

dieses auf der jeweiligen Excelzeile zuordnen möchte.
(harte Zelleinträge kein Sverweis aus einem Tabellenblattindex o.ä.)

Ich hoffe, ich konnte einen Eindruck meines Plans vermitteln,
ohne einen Roman zu schreiben.


Was spricht deiner Meinung nach gegen eine Lösung mit einem Klassenobjekt?

Deine Methode, die Infos einzusammeln, gefällt mir allerdings schon,
die könnte meine Prozedur zur Attribuierung deutlich kürzer halten.

Vielen Dank

und schönen Abend noch

Gruß

Ludwig
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste