Excel VBA – wenn man mich nicht aufhält..

Eigentlich will ich doch nur die Breite eine Spalte ermitteln – wenn da nicht der Parameter wäre…

Da als Spaltenindex sowohl eine Zahl als auch eine Buchstabenkombination angegeben werden können, soll der Parameter für die Spalte vom Typ Variant sein, doch da ist viel Unheil möglich. Selbst wenn es sich dabei um einen Integer, Long oder String handelt, kann auch noch der Wert selbst falsch sein. So ist „ABC“ ein gültiger Spaltenindex, „ABBA“ aber nicht.

  1. Public Function getWidth(oWs As Worksheet, vColumn As Variant) As Double
  2. Const ciTypEmpty As Integer = 0
  3. Const ciTypNull As Integer = 1
  4. Const ciTypObject As Integer = 9
  5. Const csFunction As String = "modExcel.getWidth()"
  6. Const ciMinErrNumber As Integer = 1000
  7. Const ciTypeError As Integer = 13
  8. Const csTypeError As String = _
  9. "Der übergebene Parameter kann nicht als Spaltenindex interpretiert" & _
  10. " werden. Übergeben wurde: "
  11. Const ciErrArgumentNull As Integer = 20
  12. Const csErrArgumentNull As String = _
  13. "Statt Spaltenindex NULL übergeben."
  14. Const ciUnbekanntErr As Integer = 23
  15. Dim sFehler As String, iNummer As Long, sDescription As String
  16. Dim iTyp As Integer
  17. On Error GoTo Fehler
  18.  
  19. iTyp = VarType(vColumn)
  20.  
  21. If iTyp = ciTypEmpty Or iTyp = ciTypNull Or iTyp = ciTypObject Then _
  22. Err.Raise Number:=ciErrArgumentNull + ciMinErrNumber + vbObjectError, _
  23. Source:=csFunction, _
  24. Description:=csErrArgumentNull
  25.  
  26.  
  27. getWidth = oWs.Columns(vColumn).Width
  28.  
  29. Ende:
  30. On Error GoTo 0
  31. Exit Function
  32.  
  33. Fehler:
  34. sDescription = Err.Description
  35. iNummer = Err.Number
  36. On Error GoTo 0
  37. If iNummer = ciTypeError Then
  38. sFehler = csTypeError & CStr(vColumn)
  39. iNummer = ciTypeError + ciMinErrNumber + vbObjectError
  40. Err.Raise Number:=iNummer, Source:=csFunction, _
  41. Description:=sFehler
  42. Else
  43. sFehler = "Ein unbekannter Fehler wurde ausgelöst." & _
  44. "Womöglich war der Spaltenindex ungültig. Meldung: " & _
  45. sDescription
  46. iNummer =iNummer + ciMinErrNumber + vbObjectError
  47.  
  48. Err.Raise Number:=iNummer, Source:=csFunction, _
  49. Description:=sFehler
  50. End If
  51. GoTo Ende
  52. End Function

Der gewünschte Abgabewert wird einzig und allein in Zeile 27 ermittelt, der ganze Rest ist Fehlerbehandlung.

Bonuspunkte für jede(n), der oder die erkennt, dass der Mumpitz nicht mal wiederverwendbar ist.

Kaufrausch

Im Gartencenter verfallen wir leicht in einen Kaufrausch…

Diverse Pflanzen für unseren Garten
Diverse Pflanzen für unseren Garten

Unten rechts ist eine kleine Gurke zu sehen; in der Zwischenzeit konnten wir schon die ersten der leckeren Früchte ernten.

Hornveilchen 2020

Ein fester Bestandteil unseres Gartens sind Hornveilchen (aka viola cornuta).
Dieses Jahr habe ich auch eine Auswahl an Farben verzichtet und nur diese blau-weißen Blüten mit etwas gelb gewählt.

Hornveilchen im Frühling 2020

25000 Primzahlen mit MS Word und VBA

Aus Langeweile habe ich ein Word-Makro geschrieben, welches die ersten 25000 Primzahlen berechnet. Die Primzahlen werden ans Ende eines Worddokuments geschrieben.

Womöglich ist es ja für den einen oder die andere von Interesse… ;-)

  1. Option Explicit
  2.  
  3. Sub Primzahlen()
  4. Const ciMax As Integer = 25000 ' 25000 Primzahlen
  5. Dim aPrimzahlen() As Long
  6. Dim iPruefling As Long, iIndex As Integer
  7. Dim iAnzahl As Long ' Long, damit die Funktion "inc" funktioniert.
  8. Dim bTeilbar As Boolean, oParagraf As Paragraph
  9. Dim iWurzel As Long
  10. iAnzahl = 0
  11. iPruefling = 2
  12. ReDim aPrimzahlen(1 To ciMax)
  13. While iAnzahl < ciMax
  14. bTeilbar = False
  15. iWurzel = Round(Sqr(iPruefling), 0) + 1 ' Plus 1 wegen eventuellem Abrunden
  16. For iIndex = 1 To iAnzahl
  17. ' Es reicht, bis zur Quadratwurzel des Prüflings zu testen.
  18. If aPrimzahlen(iIndex) >= iWurzel Then
  19. Exit For
  20. End If
  21. If iPruefling Mod aPrimzahlen(iIndex) = 0 Then
  22. bTeilbar = True
  23. Exit For
  24. End If
  25. Next
  26. If Not bTeilbar Then
  27. inc iAnzahl
  28. aPrimzahlen(iAnzahl) = iPruefling
  29. End If
  30. inc iPruefling
  31. Wend
  32. For iIndex = LBound(aPrimzahlen) To UBound(aPrimzahlen)
  33. Set oParagraf = ActiveDocument.Paragraphs.Add(ActiveDocument.Paragraphs.Last.Range)
  34. oParagraf.Range.Text = CStr(aPrimzahlen(iIndex)) & vbCrLf
  35. Set oParagraf = Nothing ' Nötig; nur: Warum?
  36. Next
  37. End Sub
  38.  
  39. Sub inc(ByRef iZahl As Long)
  40. iZahl = iZahl + 1
  41. End Sub

Eine unserer Rosen, vom Frost gezuckert

Da der Winter 2019/2020 sehr mild war, wussten einige unserer Pflanzen nicht, ob sie überwintern oder blühen sollten.

Und so kam es zu diesem Bild, wo plötzlich einsetzender Frost die Rosenblüte verzuckerte.

Dies ist wieder ein Bild mit einer FX-Kamera und einem DX-Objektiv. Bei dem Thema habe ich das Engelchen und das Teufelchen auf den Schultern: Einerseits hätte ich ja gerne ein FX-Makro, doch andererseits ist das Micronikkor 1:3,5 / 85mm sehr gut.

Schwierig!

(Und ja, Nikon nennt seine Makroobjektive Micronikkore.)

Ein neues Bild

Mango ist begeistert!

Mango ist begeistert, ist doch sein bester Hundekumpel Teo (hinten rechts; unscharf 😉) zu Besuch.

Hier zeigt das gute und doch günstige Nikkor 1:1,8/50mm seine Stärke als Hundeportraitlinse: Einerseits wird das „Gesicht“ gut vom Hintergrund abgehoben; andererseits  bleibt die Schnauze plastisch und nicht so flach wie einst beim 1:2,8/180mm. Und Mango bleibt jetzt brav sitzen, wenn ich ihn fotografieren will.

Zwergpudel Mango ist begeistert

Mit Mina auf Ameland

Mina bittet geduldig auf die Aufmerksamkeit ihres Menschen…

Wir waren mit zwei Freunden/Verwandten und ihren zwei Hunden auf Ameland, doch obwohl ich über einhundert Fotos schoss, sind kaum welche was geworden: Die Coolpix P6000 ist für flinke Hunde zu langsam.

Mina erbittet besseres Wetter und Leckerchen

Mina erbittet besseres Wetter und Leckerchen