Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

VBA Funktion in eine Abfrage einbinden

Begonnen von pahiti78, Dezember 01, 2011, 06:45:15

⏪ vorheriges - nächstes ⏩

pahiti78

Hallo Zusammmen,

ich habe das ca. 400.000 Datensätze habe und enthalten in einer Spalte Postleitzahlen. Diese Postleitzahlen möchte in bestimmte Regionen unterteilen. Ich möchte also eine Abfrage starten bei der zum Beispiel die Postleitzahlen zwichen 14000 und 16000 die Region 1 zugewiesen bekommt usw.
Ich habe das ganze schon einmal versucht in VBA zu schreiben. Wenn ich diese Funktion dann in die Abfrage einbinde, gibt diese kein Wert zurück. Anbei mein Code. Ich habe das ganze nur eingegrenzt, dass alle PLZ über 16000 die Region 2 und alle unter 16000 die Region 1 sind.
Vielleicht kann mir jemand helfen. Vielen Dank  :)

Public Function PlzZuweisen(EmpfaengerPLZ As Variant) As Variant
    If IsNull(EmpfaengerPLZ) Then Exit Function
        Select Case EmpfaengerPLZ
       
Case Is < 16000 = 1
Case Is > 16000 = 2



        End Select
End Function
Gruß
Matze

MzKlMu

Hallo,
Du musst natürlich einen Rückgabewert zuweisen:
Public Function PlzZuweisen(EmpfaengerPLZ As String) As Integer
    If IsNull(EmpfaengerPLZ) Then Exit Function
        Select Case EmpfaengerPLZ
             Case Is < 16000
                  PlzZuweisen = 1
             Case Is > 16000
                  PlzZuweisen = 2
        End Select
End Function

Außerdem würde ich Übergabewert und Rückgabewert andere Datentypen zuweisen.
Mit > und < schließt Du aber die 16000 direkt aus. Du musst also noch eine Zuweisung ändern, entweder <= oder >=
Gruß Klaus

DF6GL

Hallo,

kleine Hinweise:

Wenn "EmpfaengerPLZ"    den Datentyp String erhält, dann greift die ISNull()-Funktion nicht mehr...

Wenn die PLZ in der Tabelle vom Datentyp String (TEXT) ist, dann sollte im Select-Block auch mit einem String verglichen werden.


wenn nur Bereiche betroffen sind (im Beispiel allerdings nicht der Fall) , also nicht alle möglichen PLZ durch eine Case-Bedingung abgedeckt werden, dann sollte Case Else zur Sicherheit/Klarheit eingebaut werden.



Public Function PlzZuweisen(EmpfaengerPLZ As String) As Long   '(möglichst Integer vermeiden)
If IsNull(EmpfaengerPLZ) Then Exit Function

Select Case EmpfaengerPLZ
  Case Is < "16000"
  PlzZuweisen = 1
 
  Case Is > "16000"
  PlzZuweisen = 2
   
  Case Else
  PlzZuweisen = 3
 
End Select

End Function

MzKlMu

#3
Hallo,
danke für die Korrektur, hätte doch nicht so schnell antworten sollen.  ;D

Integer würde ich hier aber bedenkenlos verwenden, es wird ja wohl kaum mehr als 32.767 Gruppen geben.
Aber auf die 2 Byte für Long kommt es natürlich auch nicht an.
Gruß Klaus

pahiti78

Es klappt. Ich habe zwei Bücher über Access Programmierung durchgelesen bzw. nachgeschlagen und ich habe nichts gefunden. Ich war total verzweifelt. Vielen Dank für Eure Hilfe. :)
Gruß
Matze

pahiti78

Habe gleich noch zwei Fragen dazu. Kann ich auch Zwischenwerte abrufen. Und zwar will ich dass alle Postleitzahlen zwischen 16000 und 18000 den Wert Region =2 erhalten. Kann man das so definieren: case is =>16000 <=18000?
Meine zweite Fragen lautet. Kann man in dieser Funktion einen zweiten Angeben so dass alle in der Region 2 den Wert A-Kunde oder einen bestimmten Eurobetrag erhalten?
Gruß
Matze

DF6GL

Hallo,



Case "16000" to "18000"




Die 2. Frage versteh ich nicht.




@Klaus:

Bei "Long" ist mein "Hintergedanke" nicht in erster Linie der des Wertebereiches, eher der internen Speicherverwaltung von Windows und des VBA-Kompilers wegen deren Reservierung eines Ganzwortes  auch bei "kleineren" Zahlentypen.  Wie auch immer, ansonsten sollte man nie nie sagen   ;)

Schnell übernimmt man unbedacht die Integer-Deklaration bei anderen Variablen, die den Wertebereich überschreiten können und schon wächst die Beule....  ;D

pahiti78

Also die Funktion soll die Postleitzahlen abfragen und dann die Regionen zuweisen. Das kann Sie jetzt ja. Dann soll sie für die Region 1 rechnen (wenn region =1 dann rechne 15% * 25 Euro) und für Region 2 10% und Region 3 5%. Wie könnte der VCod dafür aussehen oder muss man dafür eine neue Funktion erstellen? Danke schonmal vorab.
Gruß
Matze

Beaker s.a.

Hallo pahiti78,

ZitatDann soll sie für die Region 1 rechnen (wenn region =1 dann rechne 15% * 25 Euro) und für Region 2 10% und Region 3 5%. Wie könnte der VCod dafür aussehen oder muss man dafür eine neue Funktion erstellen? Danke schonmal vorab.

Das musst Du in einem zusätzlichen, berechneten Feld in Deiner Abfrage machen; - diese Function gibt Dir ja nur einen Wert für das Feld "Region" zurück. Schreibst Du also eine zweite Function, der Du den eben berechneten Wert übergibst, und die Dir dann wieder genau einen Wert zurück gibt.

hth
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

pahiti78

Hallo, ich mal wieder. Wollte jetzt die PLZ einbinden. Es haut allerings bei den Zahlenbereichen nicht hin. Die Abfrage gibt lediglich den Wert 1 zurück. Danke schonmal vorab.


Public Function Gebiet(EmpfaengerPLZ As String) As Long '(möglichst Integer vermeiden)
If IsNull(EmpfaengerPLZ) Then Exit Function

Select Case EmpfaengerPLZ 'Wähle EmpfaengerPLZ'

Case "1000 to 3253" 'alle Postleitzahlen zwischen 1000 und 3253 entsprechen dem Gebiet 49'
Gebiet = 49
Case "4100 to 4200"
Gebiet = 9      'alle PLZ zwischen 4100 und 4200 entsprechen den Gebiet 09'

Case Else
Gebiet = 1

 
End Select

End Function

Gruß
Matze

pahiti78

Vergesst es. Ich habe selbst schon bemerkt, dass lediglich die Anführungszeichen fehlen. Sorry 8)
Gruß
Matze

pahiti78

Hallo Zusammen,
ich muss doch noch etwas loswerden. Bei den Gebieten, welche den Postleitzahlen zugeordent werden sollen, handelt es sich um mehrere hundert stück. Diese sind bereits in einer Exceltabelle erfasst wurden. Ist es möglich diese Daten in einer Accesstabelle zu integrieren. Zum Beispiel Tabelle A mit den Spalten PLZvon, PLZbis, Gebiet. Die Abfarge sollte dann die einzelnen PLZ diesen Gebieten zuordnen. Zum Beispiel lautet dann der erste Datensatz in Tabelle A: Plzvon =1000, PLZbis=3265, Gebiet 1. Die Abfrage muss dann meine PLZ (3263) dem Gebiet 1 zuordnen. Ist soetwas möglich und wenn ja wie könnte so einen Funktion aussehen?
Gruß
Matze

DF6GL

Hallo,

Select b.plz,  a.PLZVon,   a.PLZBis,   a.Gebiet
From tblPLZGebiete as a
Inner join  tblPLZ  as b
On  ( b.Plz between a.Plzvon and a.Plzbis)

pahiti78

Müssen diese Anweisungen dann in die Case Funktion eingebaut werden?
Gruß
Matze

DF6GL

Hallo,



nein, das ist die SQL einer Abfrage, kein VBA-Code....



Öffne den Abfrageentwurf und kopiere  dort  unter    Ansicht/SQL-Ansicht diesen SQL-String hinein.  Mach noch die Namens-Anpassungen an Deine Tabellen/Felder und führ die Abfrage aus.