Excel mit VBA läuft nicht auf Mac

lobered

Mitglied
Thread Starter
Dabei seit
12.08.2011
Beiträge
60
Reaktionspunkte
6
Ich würde gerne eine Excel-Datei, die unter Windows funktioniert, auch am Mac, MacOS 10.13, unter Excel 2016 Mac verwenden.
Allerdings kommt beim Start der Anwendung ein Laufzeitfehler "438" bei der Codezeile
If Worksheets("WortUhr").OptionButton1.Value = True Then (siehe Eintrag in rot)

Kann dazu jemand was beitragen?


(kann leider die XLSM-Datei nicht hochladen, daher nachf. VBA-Code)





Code:

'Public Const Schriftfarbe As Long = 255 'Farbe der Schrift, hier jetzt rot.
'Public Const Diffusor As Long = 5263440 'Farbe des Diffusors, hier jetzt grau
'Public Const Frontfolie As Long = 0 'Farbe der Frontfolie, hier jetzt schwarz
Dim Schriftfarbe As Long
Dim Diffusor As Long
Dim Frontfolie As Long
Dim U As TextRange2
Dim NextEvent As Date
Dim e, c, m, h, l, r, x, y, z As Long
Sub updateUhr() 'Dauerschleife zum Anzeigen der Uhrzeit

x = Worksheets("WortUhr").Cells(25, 2).Value 'gewählte Frontfolie einlesen
Frontfolie = Worksheets("UhrFarben").Cells(x + 1, 2).Value

y = Worksheets("WortUhr").Cells(28, 2).Value 'gewählte Schriftfarbe einlesen
Schriftfarbe = Worksheets("UhrFarben").Cells(y + 1, 2).Value

z = Worksheets("WortUhr").Cells(31, 2).Value 'gewählte Diffusorfarbe einlesen
Diffusor = Worksheets("UhrFarben").Cells(z + 1, 2).Value

' WÖRTER:
'ES/IT=2, IST/IS=3, FÜNF/FIVE=4, ZEHN/TEN=5, VIERTEL/QUARTER=6, ZWANZIG/TWENTY=7, VOR/TO=8, NACH/PAST=9, HALB/HALF=10
'EIN/A=11, EINS/ONE=12, ZWEI/TWO=13, DREI/THREE=14, VIER/FOUR=15, FÜNF/FIVE=16, SECHS/SIX=17, SIEBEN/SEVEN=18
'ACHT/EIGHT=19, NEUN/NINE=20, ZEHN/TEN=21, ELF/ELEVEN=22, ZWÖLF/TWELVE=23, UHR/O´CLOCK=24

Call deutsch 'stellt die Matrix auf deutsch um
Call löscheUhr 'löscht alle Buchstaben/Wörter

If Worksheets("WortUhr").OptionButton3.Value = False Then 'steht der OptionButton auf Uhrzeit ?
Call updateSekunden 'wurde die Sekundenanzeige gewählt, dann geht es hier weiter
Else 'wurde die Stundenzeige gewählt, dann geht es hier weiter

' ES IST / IT IS
Call zeigeZeit(2)
Call zeigeZeit(3)

' Minutenpunkte 1-4
For c = 1 To Minute(Now) Mod 5
Worksheets("WortUhr").Shapes("Minute" & c).Fill.ForeColor.RGB = Schriftfarbe
Next c

' alle fünf Minuten / UHR oder O`CLOCK wenn volle Stunde
m = Minute(Now) \ 5

'Minuten

Select Case m
Case 0: Call zeigeZeit(24) 'UHR, WENN VOLLE STUNDE
Case 1: Call zeigeZeit(4): Call zeigeZeit(9) 'FÜNF NACH
Case 2: Call zeigeZeit(5): Call zeigeZeit(9) 'ZEHN NACH
Case 3: Call zeigeZeit(6): Call zeigeZeit(9) 'VIERTEL NACH
Case 4: Call zeigeZeit(7): Call zeigeZeit(9) 'ZWANZIG NACH
Case 5: Call zeigeZeit(4): Call zeigeZeit(8): Call zeigeZeit(10): P = 1 'FÜNF VOR HALB + 1 STUNDE
Case 6: Call zeigeZeit(10): P = 1 'HALB + 1 STUNDE
Case 7: Call zeigeZeit(4): Call zeigeZeit(9): Call zeigeZeit(10): P = 1 'FÜNF NACH HALB + 1 STUNDE
Case 8: Call zeigeZeit(7): Call zeigeZeit(8): P = 1 'ZWANZIG VOR + 1 STUNDE
Case 9: Call zeigeZeit(6): Call zeigeZeit(8): P = 1 'VIERTEL VOR + 1 STUNDE
Case 10: Call zeigeZeit(5): Call zeigeZeit(8): P = 1 'ZEHN VOR + 1 STUNDE
Case 11: Call zeigeZeit(4): Call zeigeZeit(8): P = 1 'FÜNF VOR + 1 STUNDE
End Select



'Stunden
h = Hour(Now) + P 'Stunde plus 1 Stunde wenn P = 1

'wir rechnen mit 12 Stunden
If h <= 12 Then
h = h + 12
End If
If h > 12 Then
h = h - 12
End If


Select Case h
Case 1:
Select Case m
Case Is = 0: Call zeigeZeit(11) 'EIN (Minuten kleiner als 5 dann noch glatte Stunde)
Case Is > 0: Call zeigeZeit(12) 'EINS (Minuten größer als 4 dann "fünf nach")
End Select
Case 2: Call zeigeZeit(13) 'ZWEI
Case 3: Call zeigeZeit(14) 'DREI
Case 4: Call zeigeZeit(15) 'VIER
Case 5: Call zeigeZeit(16) 'FÜNF
Case 6: Call zeigeZeit(17) 'SECHS
Case 7: Call zeigeZeit(18) 'SIEBEN
Case 8: Call zeigeZeit(19) 'ACHT
Case 9: Call zeigeZeit(20) 'NEUN
Case 10: Call zeigeZeit(21) 'ZEHN
Case 11: Call zeigeZeit(22) 'ELF
Case 12: Call zeigeZeit(23) 'ZWÖLF
End Select
End If
NextEvent = Time + TimeSerial(0, 0, 1) 'eine Sekunde warten
Worksheets("WortUhr").Cells(2, 2).Value = Time 'die digitale Uhrzeit in Zelle B2 ausgeben
Application.OnTime NextEvent, "updateUhr" 'die Uhr updaten
End Sub
Sub updateSekunden() 'zeigt die Sekunden in der Matrix
Call löscheUhr
r = Right$(Format(Time, "ss"), 1) 'die Einer der Sekunden
l = Left$(Format(Time, "ss"), 1) 'die Zehner der Sekunden
e = 6 'ab Spalte 7(6) die Einer Sekunden
Select Case r 'die Einer der Sekunden
Case 0: Call zero 'Null
Case 1: Call eins 'Eins
Case 2: Call zwei 'Zwei
Case 3: Call drei 'Drei
Case 4: Call vier 'Vier
Case 5: Call fünf 'Fünf
Case 6: Call sechs 'Sechs
Case 7: Call sieben 'Sieben
Case 8: Call acht 'Acht
Case 9: Call neun 'Neun
End Select
e = 0 'ab Spalte 1(0) die Zehner Sekunden
Select Case l 'die Zehner der Sekunden
Case 0: Call zero 'Null
Case 1: Call eins 'Eins
Case 2: Call zwei 'Zwei
Case 3: Call drei 'Drei
Case 4: Call vier 'Vier
Case 5: Call fünf 'Fünf
Case 6: Call sechs 'Sechs
Case 7: Call sieben 'Sieben
Case 8: Call acht 'Acht
Case 9: Call neun 'Neun
End Select
End Sub
Sub zeigeZeit(row) 'zeigt die Worte in der Matrix
With Worksheets("UhrWorte")
If Worksheets("WortUhr").OptionButton1.Value = True Then 'wurde die deutsche Sprache gewählt, dann geht es hier weiter
Set U = Worksheets("WortUhr").Shapes("UhrForm").TextFrame2.TextRange
U.Characters(.Cells(row, 2), .Cells(row, 3)).Font.Fill.ForeColor.RGB = Schriftfarbe 'wo finde ich die deutschen Worte
Else 'wurde die englische Sprache gewählt, dann geht es hier weiter
Set U = Worksheets("WortUhr").Shapes("UhrForm").TextFrame2.TextRange
U.Characters(.Cells(row, 6), .Cells(row, 7)).Font.Fill.ForeColor.RGB = Schriftfarbe 'wo finde ich die englischen Worte
End If
End With
End Sub
Sub zeigeSekunden(row)
With Worksheets("UhrZahlen")
Set U = Worksheets("WortUhr").Shapes("UhrForm").TextFrame2.TextRange
U.Characters(.Cells(row, 1) + e, .Cells(row, 2)).Font.Fill.ForeColor.RGB = Schriftfarbe 'wo finde ich die Zahlen für die Einer/Zehner Sekunden
End With
End Sub

.
.
.
.
 
Ich selbst benutze kein Excel und kenne mich auch mit VBA nicht aus. Eine kurze Recherche verrät mir aber, dass die Kompatibilität zwischen Windows und Mac was VBA angeht nicht besonders gut ist. Von daher musst du das Skript entsprechend anpassen/umschreiben (wenn möglich) oder am besten eine Lösung verwenden, die platformunabhängig ist.

PS: Ich würde den Code in Code-Tags setzen. Das macht den VBA-Code zwar nicht viel besser, aber zumindest kann man ihn dann halbwegs lesen.
 
Dummerweise ist der Debugger unter VBA und die Fehlermeldungen nicht immer Zielführend. Manchmal wird eine Zeile rot markiert - auch wenn eigentlich die Zeile davor oder danach einen Crash verursacht.

Bei Dir könnte es also sein:
a) Das Worksheet mit dem Namen WortUhr existiert nicht
b) Der OptionButton wird nicht gefunden
c) Das Shape "UhrForm" wurde nicht gefunden

Der Fehler 438 tritt aber auch bei einem AddIn Fehler auf. Deaktiviere mal daher nacheinander alle AddIn.

Man muss allerdings auch sagen - vielleicht geht das VBA Makro auch erst gar nicht. Windows Excel VBA ist eben nicht Mac Excel VBA und beide VBA sind nur so lange kompatibel, so lange es um einfachste Sachen geht.
 
Ich würde gerne eine Excel-Datei, die unter Windows funktioniert, auch am Mac, MacOS 10.13, unter Excel 2016 Mac verwenden.
Allerdings kommt beim Start der Anwendung ein Laufzeitfehler "438" bei der Codezeile
If Worksheets("WortUhr").OptionButton1.Value = True Then (siehe Eintrag in rot)
438 ist typisch bei (fehlgeschlagener) Prüfung einer Wertes, der erst zur Laufzeit erzeugt wird.
Enthält das abgefragte Ding also tatsächlich einen Wert, in dem Moment wo der Fehler auftritt?
(nicht Leer und nicht NIL)

Falls nicht würde ich rückwärts prüfen, wo einer hätte zugewiesen werden müssen.

Denkbar, dass beim Mac an irgendeiner Stelle eine geringfügig andere Syntax verwendet werden muss, um eines Deiner Objekte anzusprechen.

Zudem ist macOS strenger beim Zugriff System-Ressourcen (Uhr/Time käme hier in Frage). Vielleicht möchte Dein Code eine Ressource abfragen, die er nicht abfragen darf und bekommt dann 0 oder Nichts zurück, was dann weiter unten den Fehler verursacht.
 
Zurück
Oben Unten