Diskussion:VBA in Excel/ Klassenmodule
Fehler bei clsWinkel
BearbeitenUwe 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 ~~~~)