Zum Inhalt springen

Diskussion:VBA in Excel/ Namenskonventionen

Seiteninhalte werden in anderen Sprachen nicht unterstützt.
Abschnitt hinzufügen
Aus Wikibooks

Das ganze ist ziemlich erklärungsbedürftig. Glaube nicht, dass jeder weiß, was ein Boolean, Integer usw. ist. auch Workbook und Chart sollten erklärt werden. Man geht ja immer von einem DAU aus (der ein BOFH werden will ;). --217.6.244.199 11:00, 1. Mär. 2012 (CET)Beantworten

Darstellung von Tabellen im pdf

[Bearbeiten]

In der pdf-Version des Buches wird die Tabelle "Die Bestandteile eines Namens/ Die Art" als Tabelle dargestellt, die folgende Tabelle der Variablentypen jedoch als Fließtext. Ich konnte auf Anhieb keinen Grund dazu erkennen. Die MS-Forms-Elemente werden ebenfalls nicht als Tabelle dargestellt. --BurkhardS 11:52, 4. Nov. 2013 (CET)Beantworten

Namenskonventionen von akademischer Bedeutung

[Bearbeiten]

Dieses Kapitele bedarf dingend einer vollständigen Überarbeitung, auch weil es das erste Kapitel ist das sich ein Anfänger zuwendet.

Dahingehend dumme Fraga an den/die Autor, will man ernsthaft ein Array das eine Auflistung von Artikel enthält als varArtikel benennen, und eine Range das auf Artikel verweist mit objArtikel benennen? varArtikel könnte ebenso ein Variant mit dem untertypen Decimal darstellen.

So richtig lustig wird es wenn das Array eine Auflistung von Range enthält die auf Artikel verweisen, korrekt dann varobjArtikel benennen?

So nebenbei auch noch die Frage - gedenkt man ernsthaft ein Collection mit objArtikel zu bezeichnen, schlicht und einfach aus dem Umstand heraus das eine Collektion und Dictionary nichts anders als Objekte sind?

Wird die Variablen objArtikel benannt ist nicht ersichtlich ob das jetzt eine Verweis zu einem Objekct (welchem? Es gibt 10000ende Objecte in Excel) die dann eine eine Auflistung von Verweisen darstellt.

Das Module, Formen und Steuerelemente umbenennen soll, stammt aus einer Urbanen Legende heraus, das Visual Basis besonderen Rechenaufwand benötigen würde und seit mehr als 30 Jahren kursiert. Und leider nicht zu töten ist.

Bei Class macht die Umbenennung Sinn hier verwende ich Class_ gerne aber auch ©Class_ das sofort ersichtlich ist das das kein Verweis auf ein internes Excel-Object darstellt. Bei größeren Projekten wie AddIns Modul_, Form_

Private Class_Test© As New ©Class_Test
Private WithEvents Class_Test© As ©Class_Test

Das Kapitel Namenskonvention so wie hier präsentiert ist von rein akademischer Bedeutung abseits jeglicher Realität.

Was hingegen erwähnenswert wäre, sind die Projectnamen für Addins, XLSB und Dateien, das bestimmt die Reihenfolge wie sie geladen werden, das wird wiederum Relevant wenn eine Addin oder Datei Verweise auf andere AddIns beinhalten, derartige AddIn sowie Dateien wären nachrangig von des Basis Addins zu benennen. Wenn hier Fehler begangen werden ist Excel beleidigt und macht so richtig Stress. AddIns und die Personal.Xlsb wird bei mir Grundsätzlich © Vorangestellt damit ist auch sichergestellt das normale Daten im Manger und in der Ladereihenfolge unter stehen und nachrangig erfolgen. Hier ist Anzumerken das der Dateiname vollkommen irrelevant ist in welcher Reihenfolge geladen wird, die Ladereihenfolge kann ausschließlich durch den Projectnamen beeinflusst werden.

Wie wohl eine paar Konventionen Sinn machen, für Arrays (bsp.: aArray), Collection (bsp.: bColl) und Dictionary (Bsp.: cDic) wobei die jeweilige Basis a, b, und c als Auflistung in For Each und For Next verwendet werden.

Im Idealfall sollte aus dem Quellen Code und den Deklarationen ersichtlich sein, was passiert.

Als Beispiel, das auch gleich so ziemlich alle Fallstricke behandelt die einem passieren können:

   Option Explicit
   Private cColl(0 To 255) As Collection
   Private DoTime As Single
   
   Private Sub Create_cColl()
       Select Case True
              Case DoTime > 0: Exit Sub
              Case Not TypeOf Selection Is Range: Exit Sub
       End Select
       
       Dim a As Range, b As Range, cKey As Long
       Dim Target As Range: Set Target = Intersect(Selection.Worksheet.UsedRange, Selection)
       If Target Is Nothing Then Exit Sub
       
       For cKey = LBound(cColl) To UBound(cColl)
           Set cColl(cKey) = New Collection
       Next
       
       For Each a In Target.Areas
           For Each b In a
               If Not IsEmpty(b.Value) Then cColl(Asc(b.Value)).Add b
               If Timer > DoTime Then
                  Application.StatusBar = b.Address(False, False) & "= " & b.Value
                  DoEvents
                  If DoTime = -1 Then GoTo 1 Else DoTime = Timer + 0.75
               End If
           Next
       Next
       
   1:  If DoTime = -1 Then
          For cKey = LBound(cColl) To UBound(cColl)
              Set cColl(cKey) = New Collection
          Next
       End If
       
       DoTime = 0
       Application.StatusBar = False
   End Sub
   
   Private Function Union_cColl(Index As Long) As Range
       Select Case True
              Case DoTime > 0: Exit Function
              Case cColl(Index) Is Nothing: Exit Function
       End Select
       
       Dim u As Range: Set u = cColl(Index)(1)
       Dim c As Range
       
       For Each c In cColl(Index)
           Set u = Union(u, c)
           If Timer > DoTime Then
              Application.StatusBar = c.Address(False, False) & "= " & c.Value
              DoEvents
              If DoTime = -1 Then GoTo 1 Else DoTime = Timer + 0.75
           End If
       Next
       Set Union_cColl = u
       
   1:  DoTime = 0
       Application.StatusBar = False
   End Function
   
   Public Function Is_cColl(Optional ByVal Index) As Boolean
       If Not IsMissing(Index) Then Is_cColl = Not (cColl(Index) Is Nothing): Exit Function
       Dim c As Variant
       
       Is_cColl = True
       For Each c In cColl
           If Not c Is Nothing Then Exit Function
       Next
       Is_cColl = False
   End Function
   
   Public Sub Abbruch()
       If DoTime > 0 Then DoTime = -1
   End Sub
   
   Public Sub Test()
       Create_cColl
       
       Dim Target As Range: Set Target = Union_cColl(55)
       If Not Is_cColl() Then Stop
       If Not Is_cColl(55) Then Stop
       
       If Not Target Is Nothing Then Target.Select
   End Sub


Relavant ist cColl, das wird mit der Function Create_cColl beschrieben, die Functionen Union_cColl, Is_cColl und Abbruch sind für sich selbst sprechend, ebenso Test

Bleibt einzig noch die Variable DoTime. Da ich das so wie hier seit Jahren verwende ist diese für mich Selbstsprechend. Für Außenstehende sollte die Verwendung mit der Suche sehr schnell verständlich werden.

Dahingehend ist für mich ein sauberer Quellencode wesentlich wichtiger als sich sinnlos in eine Namenskonvention zu versticken.

Anmerkungen dazu: Das ganze Beispiel macht nur Sinn wenn der Inhalt der Cells Text ist, und ein Index benötigt wird mit dem ersten Zeichen.

Die Funktion Create_cColl beansprucht bei 1.000.000 Cells etwa 25 Sekunden was gerade noch im Bereich des akzeptablen ist, wobei 8 Sekunden und somit 1/3 der Rechenzeit der IsEmpty() Prüfung geschuldet ist. Damit ist eine On Error Resume Next Anweisung anstelle der Prüfung effektiver.

Die Funktion Union_cColl ist vollkommen ungeeignet bei derart vielen Einträgen.

Und das sollte dann auch noch nach 5 Jahre verständlich bleiben.

RaiseEvent 01:20, 14. Jul. 2022 (CEST)Beantworten