Diskussion:VBA in Excel/ Namenskonventionen
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)
Darstellung von Tabellen im pdf
BearbeitenIn 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)
Namenskonventionen von akademischer Bedeutung
BearbeitenDieses 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.