Thema Datum  Von Nutzer Rating
Antwort
06.05.2014 12:02:35 Corina
NotSolved
06.05.2014 18:07:59 Gast40018
NotSolved
06.05.2014 21:05:58 Corina
NotSolved
06.05.2014 22:34:55 Gast40018
NotSolved
06.05.2014 22:41:56 Gast40018
NotSolved
07.05.2014 09:16:31 Corina
NotSolved
07.05.2014 11:04:57 Gast68435
NotSolved
07.05.2014 14:46:36 Corina
NotSolved
07.05.2014 15:28:59 Gast22596
NotSolved
07.05.2014 16:36:58 Corina
NotSolved
07.05.2014 17:02:26 Gast65946
NotSolved
08.05.2014 08:41:22 Corina
NotSolved
08.05.2014 14:04:56 Gast89195
*****
Solved
08.05.2014 14:34:50 Gast83579
NotSolved
08.05.2014 15:36:16 Corina
NotSolved
08.05.2014 16:41:00 Corina
NotSolved
08.05.2014 17:11:13 Gast1901
NotSolved
08.05.2014 19:16:53 Corina
NotSolved
Rot Hm, Problem gebannt
08.05.2014 20:23:04 Gast31229
NotSolved
09.05.2014 13:36:57 Corina
NotSolved
09.05.2014 14:07:59 Gast21494
NotSolved

Ansicht des Beitrags:
Von:
Gast31229
Datum:
08.05.2014 20:23:04
Views:
907
Rating: Antwort:
  Ja
Thema:
Hm, Problem gebannt

Sry für die mangelnde sprachliche Päzision, war nur so überglücklich vorhin, dass ich das Wesentliche vergaß :)

:)

 

- in der nachfolgenden Zeile verstehe ich nicht, warum die Aktion direkt mit mdaAdd gleichgesetzt werden muss

 Optional Action As ModifyAction = mdaAdd _

Es steht dort nur aus einem einzigen Grund. Man soll im Tooltip der Funktion sehen können das die Standardaktion das Hinzufügen ist, mehr nicht.

Da mdaAdd in der Enumeration an erster Stelle steht und dadurch automatisch den Wert Null (0) hat, sowie Action ohne Angabe ebenfalls mit Null (0) initialisiert wird, sei hier mal gar nicht erwähnt. ;)

 

- hier wäre ich niemals darauf gekommen, das so zu formulieren, wobei das durchaus Sinn ergibt und zudem elegant gelöst ist

 blnField = Not (IsMissing(Field) Or IsEmpty(Field) Or IsNull(Field))

 blnValue = Not (IsMissing(Value) Or IsEmpty(Value) Or IsNull(Value))
 
Hab ich auch erst im zweiten/dritten Anlauf so hingeschrieben. ;)
 

- die Arbeitsweise mit LBound und UBound verstehe ich noch gar nicht, mir ist zudem nicht klar für welche Probleme eine solche Vorgehensweise sinnvoll ist und wie die Syntax aussehen muss (Beispiel von dir)

 If LBound(vntFilters) <= UBound(vntFilters)

LBound ... Lower Bound = untere Grenze

UBound ... Upper Bound = obere Grenze

Denke das wirst du bereits wissen. :)

Diese haben übrigens noch ein zweiten, optionalen Parameter (hilfreich wenn man mit mehrdimensionalen Arrays arbeitet) - siehe VBA Hilfe.

Der an dieser Stelle ist nun der springende Punkt, dass ich mich dazu entschieden habe immer ein Array in dieser Zeile vorliegen zu haben. Wendet man jedoch LBound() auf eine Variable an, die kein Array darstellt, kommt es zu einem Laufzeitfehler. Nun ist das ein Problem, denn im Urzustand gibt es keine Arrays die zwar ein Array sind, aber kein einziges Element besitzen. Sogesehen müsste man vor jedem LBound bzw. UBound prüfen, ob die Variable ein Array ist (IsArray()). Man müsste also jedesmal vorher prüfen ob es ein Array ist.

Es gibt nun aber einen Trick der so ein Array (ohne Elemente) erzeugt. Diesen findest du in der Hilfsfunktion RemoveElementFromArray1D im Ausdruck Split(Empty). Das Ergebnis davon ist ein Array dessen obere Grenze kleiner ist als die untere, es also kein Element besitzt.

An der Stelle noch nicht wirklich zwanghaft sinnvoll, aber ich wollte es nunmal so. ;)

 

- des Weiteren verstehe ich den nachfolgenden Codeschnipsel gar nicht

If InStr(1, Array1D, Expression, vbTextCompare) Then

      Array1D = Split(Empty)
    Else
      Array1D = Array(Array1D)
    End If
 
Es wird geprüft ob Expression in Array1D vorkommt, wenn ja ist der Rückgabewert größer 0 (was VBA sei dank automatisch in True umgewandelt wird).
Wenn nun also vorhanden, gilt es als entfernt (wir sind ja in der RemoveElementFromArray1D), ansonsten wird der Ausdruck (Filter) beibehalten.
 

- wofür steht ByRef prinzipiell und dann konkret in

Private Sub AddElementToArray1D(Expression As Variant, ByRef Array1D As Variant)
 
Grundstäzlich wird alles in VBA mittels ByRef übergeben.
Was genau das ist, ist anhand eines Beispiel am besten erklärt.
 
Option Explicit

Sub Beispiel()
  
  Dim a As Long
  Dim b As Long
  
  a = 2
  b = 3
  
  Debug.Print "Call Proc1(ByVal a:=" & a & ", b:=" & b & ")"
  Call Proc1(a, b)
  Debug.Print "     ->          a:=" & a & ", b:=" & b
  
  Debug.Print "Call Proc2(a:=" & a & ", ByRef b:=" & b & ")"
  Call Proc2(a, b)
  Debug.Print "     ->    a:=" & a & ",      b:=" & b
  
End Sub

Private Sub Proc1(ByVal a As Long, b As Long)
  a = 11
  b = 8
End Sub

Private Sub Proc2(a As Long, ByRef b As Long)
  a = 21
  b = 13
End Sub

Ausgabe ist:

Call Proc1(ByVal a:=2, b:=3)
     ->          a:=2, b:=8
Call Proc2(a:=2, ByRef b:=8)
     ->    a:=21,      b:=13

In Proc1 und Proc2 wird jeweils an den Werten der Parameter etwas geändert. Ist dieser ByRef übergeben worden, ändert sich auch dieser außerhalb der Prozedur, wurde er ByVal übergeben, hat es nach außen hin keinen Einfluss. Objekte werden immer ByRef übergeben, auch wenn man ByVal hinschreibt (der einzige unterschied mit ByVal ist, dass man die externe Objektvariable mittels Set nicht ändern kann).

Ohne weiter ins Detail zu gehen sei nur gesagt, das Daten mit ByRef schneller übergeben sind als mit ByVal. Darum arbeitet man auch fast nie mit ByVal in VB6/VBA.

Da die Angabe ByRef der Standard ist (und damit Optional) gebe ich sie auch nur an, wenn ich demjenigen der den Quellcode ließt verdeutlichen will, dass dieser Parameter innerhalb der Funktion geändert und in diesem geänderten Zustand zurückgegeben wird. Das ist wie gesagt mein eigener Stil und hat sich aus langjähriger Erfahrung heraus ergeben.

 

Gruß


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
06.05.2014 12:02:35 Corina
NotSolved
06.05.2014 18:07:59 Gast40018
NotSolved
06.05.2014 21:05:58 Corina
NotSolved
06.05.2014 22:34:55 Gast40018
NotSolved
06.05.2014 22:41:56 Gast40018
NotSolved
07.05.2014 09:16:31 Corina
NotSolved
07.05.2014 11:04:57 Gast68435
NotSolved
07.05.2014 14:46:36 Corina
NotSolved
07.05.2014 15:28:59 Gast22596
NotSolved
07.05.2014 16:36:58 Corina
NotSolved
07.05.2014 17:02:26 Gast65946
NotSolved
08.05.2014 08:41:22 Corina
NotSolved
08.05.2014 14:04:56 Gast89195
*****
Solved
08.05.2014 14:34:50 Gast83579
NotSolved
08.05.2014 15:36:16 Corina
NotSolved
08.05.2014 16:41:00 Corina
NotSolved
08.05.2014 17:11:13 Gast1901
NotSolved
08.05.2014 19:16:53 Corina
NotSolved
Rot Hm, Problem gebannt
08.05.2014 20:23:04 Gast31229
NotSolved
09.05.2014 13:36:57 Corina
NotSolved
09.05.2014 14:07:59 Gast21494
NotSolved