Anzeige
Archiv - Navigation
1776to1780
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Übergabe einer numerischen Option

VBA Übergabe einer numerischen Option
20.08.2020 16:22:22
W
Hallo Forum.
hat mir jemand eine brauchbare Vorgehensweise, wie ich einer Funktion eine Bitmaske als Option mitgeben und in der Funktion auswerten kann.
Meine Funktion hat insgesamt 3 Möglichkeiten. Ich möchte aber bei einem Aufruf unter Umständen alle 3 Möglichkeiten gleichzeitig auswählen. Mein Ansatz sieht einfach aus: 1 + 2 + 4 ergibt die Zahl 7 oder Bit-mäßig 0111. Das kann ich auch in der Funktion wieder prüfen. Aber: wenn jemand beim Aufruf statt "1 + 2" "2+2" angibt, dann gibt das insgesamt 4 oder Bit-mäßig "0100". Wie kann ich diesen Fehler erkennen. Gibt es einen anderen Lösungsansatz?
Ich möchte ni´och erwähnen, dass ich nicht die Zahlen 1, 2 oder 3 verwende, sondern 3 Variable, welchen diese 3 Werte zugeordnet sind. So habe ich sprechende Parameter.
Es erscheint unlogisch, dass bei einem Aufruf bis zu 3 Unterfunktionen gleichzeitig möglich sein sollten. Aber in meinem Fall ist das so, und keine der Unterfunktionen hat mit den anderen Unterfunktionen etwas zu tun.
In meiner Funtion findet die Prüfung z. B,. so statt:
If CInt(Auswahl And 1) = 1 Then Debug.Print "Option 1"
If CInt(Auswahl And 2) = 2 Then Debug.Print "Option 2"
If CInt(Auswahl And 4) = 4 Then Debug.Print "Option 4"
Wer hat eine gute Idee?
Gruß
W H21

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Übergabe einer numerischen Option
20.08.2020 16:45:27
Daniel
Hi
anhand des wertes "Auswahl" kannst du nicht mehr feststellen ob die 4 durch 1+3 oder 2+2 zustande gekommen ist.
da müsstest du vorher eingreifen, bevor du "Auswahl" berechnest.
Wie und in welcher Form trifft denn der Anwender seine Auswahl?
ich kann mir nicht vorstellen, dass du ihn den Text "1+2" so eingeben lässt.
Gruß Daniel
AW: VBA Übergabe einer numerischen Option
20.08.2020 17:08:08
W
Hallo Daniel, und vielen Dank für Deine Antwort.
Wir reden hier nicht von Daten in einer Excel-Tabelle sondern von Programm-Code. Und dort kann man höhere Ansprüche stellen.
Deine Frage habe ich in meinem Beitrag schon beantwortet: ich habe 3 Konstanten definiert und denen die Werte 1, 2 und 4 zugewiesen. Jetzt kann ich die Funktion aufrufen und z. B. "Drucken+Speichern" angeben, oder nur "Drucken". Verstanden?
Gruß
W H21
Anzeige
AW: VBA Übergabe einer numerischen Option
20.08.2020 17:15:15
Daniel
Hi
dann kann der Fehler nicht passieren und muss auch nicht geprüft werden.
Gruß Daniel
AW: VBA Übergabe einer numerischen Option
20.08.2020 17:29:18
W
Hallo Daniel,
es ist mir selbst schon passiert. Deshalb suche ich nach einer besseren Lösung.
Gruß
W H21
AW: VBA Übergabe einer numerischen Option
20.08.2020 17:37:51
Daniel
zeige bitte deine bisherige Lösung.
wie kommt der Wert zustande?
deine bisherige Beschreibung ist noch zu schwammig und ungenau um daraus was ableiten zu können.
AW: VBA Übergabe einer numerischen Option
20.08.2020 17:36:03
Gerd
Hallo,
bewerte deine Auswahlen mit dreistelligen Zahlen.
Gruß Gerd
AW: VBA Übergabe einer numerischen Option
20.08.2020 17:38:32
W
Hallo Gerd L,
ich verstehe nicht ganz, wie Du das meinst.
Gru
W H21
AW: VBA Übergabe einer numerischen Option
20.08.2020 17:44:46
Gerd
Hallo
001, 010, 100, 002, 020, 200, 011, 012, 014, ....,111,....444
Gruß Gerd
Anzeige
AW: VBA Übergabe einer numerischen Option
20.08.2020 18:23:05
W
Hallo Gerd L.
dann bin ich wieder an dem Stand, bevor ich mit den +-Optionen angefangen habe. Das Problem dabei: ich muss mir genau merken, welche Position in der 3-stelligen Zahl welche Bedeutung hat. Bei meiner aktuellen Lösung brauche ich nur noch den symbolischen Namen der gewünscheten Funktion kennen. Die Reihenfolge in der +-Aufzählung hat keine Auswirkung; 1+2 oder 2+1 gibt immer 3.
Gruß
W H21
AW: VBA Übergabe einer numerischen Option
20.08.2020 19:36:37
GerdL
Naja,
du könntest dann statt 1, 2, 4 zum Beispiel 1, 5, 8 nehmen.
Gruß Gerd
AW: VBA Übergabe einer numerischen Option
22.08.2020 00:46:01
W
Hallo GerL,
Entschuldigung, dass ich so verspätet antworte. Aber es gibt auch noch ein Leben ohne PC und VBA.
Wenn ich mir Deine Antwort anschaue, dann muss ich feststellen: Du hast das System nicht verstanden.
Nein, ich habe es nicht erfunden, sondern in verschiedenen Standard-Funktionen gesehen. Mit einem Aufruf und einem numerischen Parameter kann man dadurch mehrere "Optionen" auswählen, dass man ein Bit-Muster übergibt. Und dieses Bit-Muster entsteht durch die Addition mehrerer "sprechenden" Begriffe, hinter denen sich die Zahlen 1, 2, 4, 8, 16 usw. verbergen. Diese Technik erlaubt es, die "gewählten" Optionen am Bit-Muster zu erkennen.
Bei Deinem Vorschlag entsteht aus dem Begriff "1" das Bit-Muster "0001", aus "5" jedoch "0101". Wie soll man jetzt erkennen, was sich hinter "0101" verbirgt? Normal wäre 1 + 4. Und wenn ich "1 + 5" auswähle, gibt es insgesamt 6 und als Bit-Muster "0110". Verstanden?
Gruß
W H21 (und "gute Nacht"
Anzeige
AW: VBA Übergabe einer numerischen Option
22.08.2020 16:28:55
EtoPHG
Hallo,
Du willst 3 mögliche Parameter, die du aufsummieren kannst und gleichzeitig erkennen kannst ob keine ungültige Übergabe stattfindet. Für das müssen die Parameter mindesten eine Bit-Abstand von 2 haben, denn bei nur 1 Bit-Abstand kannst du Fehler nicht erkennen. Beispiel (P=Parameter):
P1 Const=1
P2 Const=4
P3 Const=16
Daraus ergeben sich nur die möglichen Summen
1, 4, 16 (bei nur einem Parameter)
5 (bei P1+P2 oder P2+P1)
17 (bei P1+P3 oder P3+P1)
20 (bei P2+P3 oder P3+P2)
21 (bei drei Parametern, egal in welcher Reihenfolge)
alle andere Summen die ggf. aus 2 oder 3 maliger Addition des gleichen Parameters ergeben Resultate, die nicht in die gültigen fallen und damit gem. deiner Definition Fehler wären.
Schau dir die binären Werte der möglichen Summen an, dann erkennst du, dass zwischen 2 1er Werten immer mindestens 1 Null sein muss.
Gruess Hansueli
Anzeige
AW: VBA Übergabe einer numerischen Option
23.08.2020 09:00:02
W
Hallo Hansueli,
Danke für Deinen Vorschlag.
Aus Deinem Vorschlag erkenne ich, dass Du die Problematik und das System verstanden hast. Ich werde mir das in den nächsten Tagen nochmals "durch den Kopf gehen lassen".
Das grundsätzliche Problem liegt darin, dass ich mit der aktuellen Schreibweise des Aufrufparameters eine Summe mitgebe. Wie die Summe entsteht, ist in der aufgerufenen Routine nicht mehr erkennbar.
Ich müsste als Parameter eine Liste der Zahlen bekommen, die zusammenaddiert die bisher benutzte Summe darstellt. Dann könnte ich in der aufgerufenen Routine prüfen, ob ein Wert mehrfach angegeben wurde. Ergibt die Prüfung keinen Fehler, kann ich die Summe (und damit die Bit-Maske) erstellen.
Das Problem: die Anzahl der Parameter darf sich dadurch nicht verändern, weil sich sonst alles verschiebt.
Gruß
W H21
Anzeige
AW: VBA Übergabe einer numerischen Option
23.08.2020 09:25:13
EtoPHG
Hallo,
Zitat: Das Problem: die Anzahl der Parameter darf sich dadurch nicht verändern, weil sich sonst alles verschiebt.
Das verstehe ich nicht. Du kannst bei deiner Anforderung 1-3 Parameter angeben. Aus diesen entsteht automatisch, beim Aufruf eine Summe. Du musst also keine Summe bilden! Was du aber mit 'nicht verändern' meinst, verstehe ich nicht. Wenn also ein Anwender (bei meinem Vorschlag) auf die Idee kommt statt (max.) 3 Parameter, deren 4 oder noch mehr, anzuwenden, wird er das System immer noch übertölpeln können.
Er könnte zb. P1+P1+P1+P1 im Aufruf angeben. Das kannst du dann nicht mehr von einem Aufruf mit nur P2 unterscheiden. Kein System der Welt das auf deinem 'Bit-Maske'-Ansatz beruht kann das verhindern. 4*P2 wäre = P3, oder 16*P1 = P3, oder 12*P1+P2 = P3 wären andere 'fehlerhafte' und detektierbare Aufrufe.
Ein mathematischer Ansatz für ein System, das auch dieses verhindern würde, müsste auf einer Primzahlen-Enumeration der Parameter und deren Produkt beruhen. Aber ein solches würde weit ausserhalb von einer Implementation in VBA liegen!
Gruess Hansueli
Anzeige
AW: VBA Übergabe einer numerischen Option
23.08.2020 09:59:10
W
Hallo Hansuelli.
Was ich im zweiten Teil meiner Antwort meinte, war ein geänderter Aufruf. Diese Technik mit der Bitmaske habe ich inzwischen in mehreren Funktionen im Einsatz. Das Problem: jede Funktion hat unter Umständen eine unterschiedliche Anzahl von Muss-Parameter. Daneben gibt es dann noch Kann-Parameter (Optional). Wenn ich jetzt an der Stelle im Parameter, an der bisher meine gebildete Summe übergeben wird, eine Liste der einzelnen Zahlen einfüge, dann verschieben sich die Parameter, und meine Funktionen funktionieren nicht mehr. Die Anzahl der zusammenzuzählenden Zahlen (welche dann die Bitmakse ergeben) ist nicht fix, je nachdem, was gewünscht ist. Wenn z. B. bisher der 3. Parameter die Summe ist, dann muss in Zukunft der 3. Parameter eine Liste der zusammenzuzählenden Zahlen sein. Und ich müsste in der aufgerufenen Funktion die andere Schreibweise erkennen.
Beispiel:
bisher Call Test(Filename,Datum,Opt1+Opt3,Parameter4)
zukünftig: Call Test(Filename,Datum,(Opt1,Opt3),Parameter4)
Leider erlaubt VBA diese Schreibweise nicht. Und wenn ich es mit "Opt1,Opt2" versuche, dann wird mir statt dem Wert der Begriff übergeben, oder die Schreibweise wird sehr umständlich.
Natürlich müssen die Funktionen, die eine Bitmaske erwarten, zuvor auf die mögliche andere Schreibweise umgestellt werden, bevor sie aus anderen Routinen benutzt werden darf.
Ich hoffe, ich habe das verständlich beschrieben.
Gruß
W H21
Anzeige
AW: VBA Übergabe einer numerischen Option
23.08.2020 16:15:32
EtoPHG
Hallo H oder W (hast du auch einen ansprechenderen Namen?)
Alles kann nicht gehen, du suchst offensichtlich die eierlegende Wollmilchsau.
Für eine Parameterliste, die eine vorher nicht bekannte Anzahl Elemente enthalten kann, steht der ParamArray varName() as Variant zur Verfügung. Die Nachteile hier sind:
1. Er kann nur als letzter Parameter in der Sub/Function Definition aufgeführt werden.
2. Es können keine Optional Parameter vor ihm stehen, sondern nur Required Parameter.
Vorteil, die Argumente der Parameter können von beliebigem Datentyp sein.
Ein Beispiel:
Function varNrOfPrm(strName As String, _
ParamArray vArgs() As Variant) _
As String
Dim iX As Integer
varNrOfPrm = strName & " hat "
For iX = 0 To UBound(vArgs())
varNrOfPrm = varNrOfPrm & vArgs(iX) & " "
Next iX
If VarType(vArgs(UBound(vArgs))) = 2 Then _
varNrOfPrm = varNrOfPrm & "Punkte"
End Function
Sub Test()
MsgBox varNrOfPrm("Mona", 10, 26, 32, 15, 22, 24, 16, 0, 17)
MsgBox varNrOfPrm("Lisa", "Höchste PktZahl. und ist", 24, _
"über dem Mittel")
End Sub
Vielleicht wäre das ein Variante für dein Problem, denn die Bitmasketechnik und v.a. deine Vorgabe "Fehler zu erkenne", finde ich eine zu aufwändige Methode. In deinem im Originalbeispiel erwähnten Problem würde ich allerdings nach den Required-Parameter einfach noch 3 Optionale anhängen und der Benutzer kann dann einfach die setzen, die seinen Wünschen entsprechen. Innerhalb des Codes entstehen dann einfache If-Abfragen und kein Bit-Gefrikel.
Gruess Hansueli
Anzeige
AW: VBA Übergabe einer numerischen Option
23.08.2020 17:23:06
W
Hallo Hansuelli.
Danke für Deinen Lösungsvorschlag, den ich erfolgreich getestet habe.
Als ich Dein Beispiel studiert habe, bin ich auf eine Idee gekommen (warum erst jetzt?): ich könnte doch den fraglichen x. Parameter entweder als Ganzzahl (also als Summe) oder als Array(1,2,4) angeben. Mit ISARRAY(xxx) kann ich erkennen, ob eine Ganzzahl oder eine Aufzählung angegeben wurde. Die Anzahl der Parameter ändert sich dadurch nicht. Nach diesem Array-Parameter sind trotzdem noch optionale Parameter möglich.
Wenn es sich um einen Array handelt, dann müssen die Werte angegeben werden, die zusammenaddiert die Bitmaske ergeben. Und weil jeder einzelne Wert erkennbar ist, kann auch eine Prüfung auf doppelte oder ungültige Werte innerhalb der aufgerufenen Funktion durchgeführt werden.
Ich habe mir inzwischen eine kleine Testroutine erstellt:
Sub Parmtest()
Call PFunc(1 + 2 + 4)
Call PFunc(Array(1, 2, 4))
End Sub
Function PFunc(P As Variant)
Dim Loop1 As Integer
Dim Bitmask As Integer
If IsArray(P) Then
For Loop1 = 0 To UBound(P)
Debug.Print "Parm" & Loop1 & "=" & P(Loop1)
Bitmask = Bitmask + P(Loop1)
Next Loop1
Else
Bitmask = P
End If
Für mich ist das Problem dadurch gelöst. Ich danke nochmals allen, die mir geantwortet haben.
Gruß
W H21

Anzeige

8 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige