Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

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)
Antworten Top
#2
Hallo, :19:

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


Code:
Option Explicit
Private Sub Workbook_Open()
    Call InterneDatenblattListe_Erstellen
End Sub
________
Servus
Case
Antworten 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
Antworten 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
Antworten 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
Antworten Top


Gehe zu:


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