Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  Excel
  Excel direkt vs. Excel VBA - Wahrheitswerte in Formeln

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:  Excel direkt vs. Excel VBA - Wahrheitswerte in Formeln (253 / mal gelesen)
ArCADe-Spieler
Mitglied
Metallbautechniker


Sehen Sie sich das Profil von ArCADe-Spieler an!   Senden Sie eine Private Message an ArCADe-Spieler  Schreiben Sie einen Gästebucheintrag für ArCADe-Spieler

Beiträge: 307
Registriert: 05.12.2012

Win 10 64bit
Office 365 aber Excel 2013

erstellt am: 28. Nov. 2023 15:19    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Gemeinde,

seitdem ich Excel nutze - also seit der frühen Mitte der 90er Jahre - benutze ich die folgende Art von Formelkonstrukten wirklich exzessiv. Zum Beispiel:

Code:
=((REST(Zeile()/4;1)+1*(REST(Zeile()/4;1)=0)))*4

dies in eine Zelle geschrieben und nach unten gezogen, erzeugt eine endlos übereinander stehende Abfolge von 1-2-3-4-1-2-3-4... wobei der Term "1*(REST(Zeile()/4;1)=0)" nur dann 1 ergibt, wenn der Rest-Wert Null ist.


Nun auf Grund der Restriktionen in der VBA-Syntax den Term "REST(Zeile()/4;1)" durch "(ZEILE()/4)-GANZZAHL(ZEILE()/4)" ersetzt und mit Leerzeichen etwas VBA-artiger geschrieben:

Code:
=((ZEILE() / 4) - GANZZAHL(ZEILE() / 4) + 1 * ((ZEILE() / 4) - GANZZAHL(ZEILE() / 4) = 0)) * 4

dies in die Zelle neben der oben angesprochenen geschrieben und nach unten gezogen, gleicher Effekt: 1-2-3-4-1-2-3-4... untereinander


Versuche ich nun das gleiche Konstrukt als Term in einer Formel in VBA zu verwenden, muss ich natürlich dort "GANZZAHL" durch "Int" und "ZEILE()" durch die Laufvariable "Zähler" ersetzen:

Code:
((Zähler / 4) - Int(Zähler / 4) + 1 * ((Zähler / 4) - Int(Zähler / 4) = 0)) * 4

Am Ergebnis des Makros, in welchem ich diesen Term verwende, ersehe ich, dass in VBA die erzeugte Reihe 1-2-3-irgendwas-1-2-3-irgendwas... lautet - die erwartete 4 taucht nicht auf ... aber auch nicht die Null.

Was mache ich falsch?

Grüße
Gernot

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

ArCADe-Spieler
Mitglied
Metallbautechniker


Sehen Sie sich das Profil von ArCADe-Spieler an!   Senden Sie eine Private Message an ArCADe-Spieler  Schreiben Sie einen Gästebucheintrag für ArCADe-Spieler

Beiträge: 307
Registriert: 05.12.2012

Win 10 64bit
Office 365 aber Excel 2013

erstellt am: 28. Nov. 2023 15:58    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

da ich ja auch selbst gern herausfände, was schief läuft, habe ich mit dem gesamten verwendeten Term mal eine MessageBox aufgerufen:

Code:
DIM Zähler&, Spalte&

For Zähler = 1 To 24

    Spalte = 11 + ((Zähler / 4) - Int(Zähler / 4) + 1 * ((Zähler / 4) - Int(Zähler / 4) = 0)) * 4 * 2

    MsgBox ("Spalte = " & Spalte)

Next Zähler


Das Ergebnis macht mich vollends ratlos: 13-15-17-3-13-15-17-3...

Was bedeutet, dass der Term, der im Excel direkt 4 erzeugt hat, in Excel VBA stattdessen -4 erzeugt 

Einmal mehr: was mache ich falsch???

Grüße
Gernot

[Edit] Tippfehler auf dem Num-Tastaturfeld korrigiert

[Diese Nachricht wurde von ArCADe-Spieler am 28. Nov. 2023 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

ArCADe-Spieler
Mitglied
Metallbautechniker


Sehen Sie sich das Profil von ArCADe-Spieler an!   Senden Sie eine Private Message an ArCADe-Spieler  Schreiben Sie einen Gästebucheintrag für ArCADe-Spieler

Beiträge: 307
Registriert: 05.12.2012

Win 10 64bit
Office 365 aber Excel 2013

erstellt am: 28. Nov. 2023 16:08    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hm, mir dümpelte irgendwo im Hinterkopf gerade eine trübe Erinnerung herum, dass die Wahrheitswerte in VBA eben nicht Falsch = 0 und Wahr = 1 sondern Falsch = 0 und Wahr = -1 wären ... keine Ahnung, wo mir das begegnet ist.

Daher das obige Konstrukt wie folgt mit einem einzelnen durch ein Minuszeichen ersetztes Pluszeichen korrigiert, und alles ist schick:

Code:
DIM Zähler&, Spalte&

For Zähler = 1 To 24

    Spalte = 11 + ((Zähler / 4) - Int(Zähler / 4) - 1 * ((Zähler / 4) - Int(Zähler / 4) = 0)) * 4 * 2

    MsgBox ("Spalte = " & Spalte)

Next Zähler


erzeugt nun 13-15-17-19... bzw. 1-2-3-4... - aber ehrlich, so'n Schei..benhonig, warum denn sowas??!

Grüße
Gernot

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

M-Ott
Mitglied



Sehen Sie sich das Profil von M-Ott an!   Senden Sie eine Private Message an M-Ott  Schreiben Sie einen Gästebucheintrag für M-Ott

Beiträge: 231
Registriert: 21.11.2008

Win10 64 Pro
i7 2.9 GHz
32 GB RAM

erstellt am: 29. Nov. 2023 08:57    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für ArCADe-Spieler 10 Unities + Antwort hilfreich

Warum eigentlich so kompliziert?

Für Excel:

Code:

=REST(ZEILE()+3;4)+1

Wenn ich das richtig sehe, kann man in VBA den Divisionsrest ausgeben, indem man "Mod" (Modulo) benutzt, ich bin aber eher in C# unterwegs und in VBA nicht wirklich flüssig, also nagel mich nicht darauf fest.
Microsoft Learn: Mod in VBA

------------------
Grüße
Michael

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

ArCADe-Spieler
Mitglied
Metallbautechniker


Sehen Sie sich das Profil von ArCADe-Spieler an!   Senden Sie eine Private Message an ArCADe-Spieler  Schreiben Sie einen Gästebucheintrag für ArCADe-Spieler

Beiträge: 307
Registriert: 05.12.2012

Win 10 64bit
Office 365 aber Excel 2013

erstellt am: 29. Nov. 2023 11:08    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Michael,

na dann nagel ich mal

Tatsächlich wird die Funktion Mod aus dem englischen Excel häufig als Äquvalent zur Funktion Rest aus dem deutschen Excel aufgeführt.

Die beiden sind auch irgendwie verwandt, allerdings eben nicht identisch.

10 Mod 3 ergibt 1, was man ebenfalls mit Rest(10;3) als Ergebnis erhält - so weit, so gleich.

(10/3) Mod 1 ergibt 0, während man mit Rest(10/3;1) 0,333 Periode erhält.

Da ich allerdings innerhalb der Excel-VBA-Programmierung - soweit ich weiß - nur englische Funktionen verwenden kann, und ich kein 100%iges direktes englisches Äquivalent zur deutschen Rest-Funktion kenne, musste ich mir anders / umständlich behelfen.

Grüße
Gernot

[Edit] falsch geschriebenen Namen korrigiert

[Edit2] wobei ich es nach weiterem Herumprobieren noch etwas genauer sagen kann: Mod gibt wohl immer nur den Ganzzahl-Wert des Divisions-Restes als Ergebnis aus

[Edit3] nachdem ich nun auch Deinen Link bis zum Ende gelesen habe: Mod rundet nicht das Ergebnis ab, sondern sowohl Dividend als auch Divisor auf die nächste Ganzzahl auf oder ab, sodass auch immer ganzzahlige Ergebnisse herauskommen

[Edit4] ein Dividend-Term, der zusätzliche Rechenoperationen enthält, muss für die korrekte Funktion der Mod-Funktion in Klammern gesetzt werden, gilt genauso für den Divisor-Term
          wird diese Mod-Funktion als Teil von umfangreichen Formeln verwendet, sollte sie insgesamt zusätzlich eingeklammert werden

[Diese Nachricht wurde von ArCADe-Spieler am 29. Nov. 2023 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

M-Ott
Mitglied



Sehen Sie sich das Profil von M-Ott an!   Senden Sie eine Private Message an M-Ott  Schreiben Sie einen Gästebucheintrag für M-Ott

Beiträge: 231
Registriert: 21.11.2008

Win10 64 Pro
i7 2.9 GHz
32 GB RAM

erstellt am: 29. Nov. 2023 11:51    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für ArCADe-Spieler 10 Unities + Antwort hilfreich

Mod funktioniert mit "Kommazahlen" tatsächlich anders, als mit ganzen Zahlen, unter anderem rundet Mod Divisor und Dividend bevor die Rechnung durchgeführt wird, deshalb ist das Ergebnis immer eine Ganzzahl, das ist aber in Deinem Fall irrelevant, da Du ohnehin mit Ganzzahlen arbeitest.

Bevor Du sagst, Du kannst das nicht verwenden: Hast Du es denn ausprobiert? Gab es Unterschiede?

------------------
Grüße
Michael

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

ArCADe-Spieler
Mitglied
Metallbautechniker


Sehen Sie sich das Profil von ArCADe-Spieler an!   Senden Sie eine Private Message an ArCADe-Spieler  Schreiben Sie einen Gästebucheintrag für ArCADe-Spieler

Beiträge: 307
Registriert: 05.12.2012

Win 10 64bit
Office 365 aber Excel 2013

erstellt am: 29. Nov. 2023 12:18    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Michael,

das Ganze hat mir nun doch keine Ruhe gelassen.

daher nun Deine Formel:

Zitat:
Original erstellt von M-Ott:
Für Excel:
Code:

=REST(ZEILE()+3;4)+1


für Excel-VBA wie folgt umgestrickt:

Code:
Sub Makro_Mod_Test()

Dim Test&, Zähler&

For Zähler = 1 To 24

    Test = (Zähler + 3) Mod 4 + 1

    Debug.Print Test

Next Zähler

End Sub


und siehe da: kurz und elegant und funktioniert ... 10 Units sind unterwegs

Ach so: die Klammern um den Dividend-Term (Zähler + 3) sind doch erforderlich! Eine weitere Klammerebene um den gesamten Mod-Ausdruck herum in diesem Fall jedoch nicht.

Grüße
Gernot

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz