Diskussion:VBA in Excel/ Klassenmodule

Aus Wikibooks
Zur Navigation springen Zur Suche springen

Fehler bei clsWinkel[Bearbeiten]

Uwe Wolf, Weinheim

Das Klassenmodul 'clsWinkel' enthält zwei Fehler:

1. In der Subroutine 'NormiereWinkel' wird die interne Funktion 'Mod' verwendet, die nur für Ganzzahlen definiert ist. Bei Kommawerten für das zur Ungenauigkeiten.

' Winkel in den Bereich 0...360° verschieben
Private Sub NormiereWinkel()
    If Abs(WinkelWert) > 2 * Faktor(WinkelMass) Then
        '### Mod - Gibt den Rest einer ganzzahligen Division zweier Zahlen zurück.
        '### Bei Eingabe von Kommazahlen sind die normierten Werte ungenau!
        WinkelWert = Sgn(WinkelWert) * (Abs(WinkelWert) Mod (2 * Faktor(WinkelMass)))
    End If
    If WinkelWert < 0 Then WinkelWert = WinkelWert + 2 * Faktor(WinkelMass)
End Sub

2. Der Eingabewert kann nach 'Normalisieren = True' nicht mehr zurückgeholt werden. Da die Routine erst in der Property Get aufgerufen wird, wäre eine Definition als Function mit temporären Variablen vorteilhafter. Der Originalwert der Zuweisung bliebe erhalten, wodurch man 'Normalisieren = False' setzen könnte und den alten Wert zurückbekäme.

Zusätzliche Anmerkung

Insgesamt finde ich die Programmierung interessant, teilweise sogar elegant, aber für Einsteiger von Klassenmodulen unbrauchbar, da sie für diese nur schwer nachvollziehbar ist. Ich schlage deshalb das nachfolgende Modul vor, das die gleichen Funktionen erfüllt, aber auch für Einsteiger leicht verständlich ist. Falls Interesse besteht, kann ich auch ein Modul liefern, das über erweiterte Funktionen zu diesem Thema verfügt (z.B. Umrechnung in DMS[DegreesMinuteSecond], Ausgabe aller Umrechnungen als Vektor/Matrix, Funktion fürs Tabellenblatt).

Option Explicit

'----- Data -----

Dim DEGWert As Double
Dim RADWert As Double
Dim GONWert As Double
Dim NormIt As Boolean

'----- Properties -----

'Altgrad (Deg) speichern
Public Property Let DEG(ByVal Wert As Double)
  DEGWert = Wert
  RADWert = WorksheetFunction.Pi() * Wert / 180
  GONWert = 200 * Wert / 180
End Property

'Altgrad (Deg) holen
Public Property Get DEG() As Double
  If NormIt Then DEG = NormWert("DEG") Else DEG = DEGWert
End Property

'Radiant (rad) speichern
Public Property Let RAD(ByVal Wert As Double)
  RADWert = Wert
  DEGWert = 180 * Wert / WorksheetFunction.Pi()
  GONWert = 200 * DEGWert / 180
End Property

'Radiant (rad) holen
Public Property Get RAD() As Double
  If NormIt Then RAD = NormWert("RAD") Else RAD = RADWert
End Property

'Neugrad (Gon) speichern
Public Property Let GON(ByVal Wert As Double)
  GONWert = Wert
  DEGWert = 180 * Wert / 200
  RADWert = WorksheetFunction.Pi() * DEGWert / 180
End Property

'Neugrad (Gon) holen
Public Property Get GON() As Double
  If NormIt Then GON = NormWert("GON") Else GON = GONWert
End Property

'Steuerwert 'Normalisieren' (True/False) holen
Public Property Let Normalisieren(ByVal Normalisieren As Boolean)
  NormIt = Normalisieren
End Property

'Steuerwert 'Normalisieren' (True/False) speichern
Public Property Get Normalisieren() As Boolean
  Normalisieren = NormIt
End Property

'----- Private Functions -----

'Winkel in den Bereich 0...360° verschieben
Private Function NormWert(ByVal UnitOut)
  Dim Wert As Double
  Wert = Int(0.5 + 360000 * (DEGWert / 360 - Int(DEGWert / 360))) / 1000
  If UnitOut = "DEG" Then
    NormWert = Wert
  ElseIf UnitOut = "RAD" Then
    NormWert = WorksheetFunction.Pi() * Wert / 180
  ElseIf UnitOut = "GON" Then
    NormWert = 200 * Wert / 180
  End If
End Function 'NormWert

-- 2003:C6:BF33:6AF4:A86F:7256:F8E9:D435 18:57, 09. Okt. 2018 (Signatur nachgetragen von: Jürgen 11:38, 10. Okt. 2018 (CEST)-- bitte signiere deine künftigen Beiträge selbst mit 4 Tilden ~~~~)