PDA

Vollständige Version anzeigen : Obergrenze!?


Goki
07.05.2004, 06:11
Hallo zusammen,

ich sitz seit drei Tagen an etwas und weiß nicht wie ich es in Access lösen kann ... folgendes:

Die User erfaßen in Formularen Länge und Breite von Glasscheiben (soll ein Berechnungsprogramm werden) ... nun das ist nicht das Problem.

Die Maße sollen aber auf die nächste durch 3 teilbare Zahl immer aufgerundet werden. In Excel gibt es hierfür die Funktion

=OBERGRENZE(feldname;3)

In Access habe ich bisher keine vergleichbare Funktion gefunden oder stehe ich nur einfach vor einem Wald und sehe die Bäume nicht?

:eek: :confused:

MRR
07.05.2004, 06:24
Hi Goki,
versuch es mal mit folgendem AfterUpdate-Ereignis:

Private Sub DeinFeld_AfterUpdate()
Do While DeinFeld Mod 3 <> 0
DeinFeld = Round(DeinFeld, 0) + 1
Loop
End Sub

HTH

piano
07.05.2004, 06:43
Hallo
Benütze die Excel-Funktionen:
in VBA-Umgebung den Verweis "Microsoft Excel x.0 Library" aktivieren (x.0 steht für Version: 11.0 = XP)
Public Sub ExcelFunktion()
Dim oExcel As Object
Dim Result
Set oExcel = CreateObject("Excel.Application")
Result = oExcel.Ceiling(34.7, 3)
MsgBox Result
oExcel.Quit
Set oExcel = Nothing
End Sub

Gruß piano

Es wäre nett, wenn Du ein Feedback abgeben könntest,
ob der Lösungsvorschlag Dein Problem gelöst hat.
- probieren geht über studieren -

Goki
08.05.2004, 13:10
Hallo Ihr beiden,

vielen Dank für eure Tips! :biggrinl:

Der Code vom Matthias eignet sich besser ... da die User bei uns im Betrieb unterschiedliche Excel-Versionen haben ... (einige 97, 2000, 2002) müßte ich jedesmal die Excel-Version ermitteln lassen und anhand derer dann die Bibliothek einbinden ... etwas tricky! :eek:

Der VBA-Code von Matthias ist auf allen Maschinen einsetzbar ... daher werde ich den verwenden ... funktioniert auch super :-)

Vielen Dank Euch beiden nochmal.

Grüßle
Goki

anfänger2
16.10.2005, 09:16
@ all

Hallo Zusammen,

ich stehe vor dem gleichen Problem wie Goki. Nun habe ich den Code von Matthias getestet. Aber irgendwie funzt das bei mir nicht. Dabei sieht das doch so einfach aus.
Ich nehme "MeinFeld" -> das Ereignis AfterUpdate und ersetze alle "DeinFeld" durch "MeinFeld". Oder was hab ich da jetzt falsch gemacht? Bei mir tut sich an der Zahl im Feld gar nichts.

anfänger2
16.10.2005, 09:51
Ok ich glaub ich hab das Problem gefunden. Das Feld das ich auf eine durch 5 teilbare zahl aufrunden möchte, wird berechnet. z.B. = Feld1/Feld2 - dieses Ergebnis möchte ich nun auf eine durch 5 teilbare Zahl aufrunden. Weiss jemand wie das geht? Oder muß ich das Ergebnis erst speichern. Das kann aber doch nicht sinnvoll sein oder?

kama
16.10.2005, 19:33
Clng(Feld1/Feld2/5)*5

Nouba
16.10.2005, 19:43
@ Klaus

das scheint aber nicht zu stimmen.

? CLng(17.4/5)
3
? CLng(17.5/5)
4

kama
16.10.2005, 20:43
@Norbert
Habe nicht gelesen das auf 5 aufgerundet werden soll
? CLng(17.4/5)*5
15
? CLng(17.5/5)
20
Was IMHO richitig ist

fürs Aufrunden wäre es
?fix((17.4+5)/5)*5
20

Nouba
16.10.2005, 20:55
@ Klaus,

bei exakt durch 5 teilbaren Zahlen liegst Du aber wieder daneben. :entsetzt:

kama
16.10.2005, 21:08
@ Norbert
Bei clng klapsts, aber auch hier könnte man einwenden das der Zahlenraum begrenzt ist.
wenn man statt 5 4.9 dazu addiert klapts auch.

Im übrigen ist das Runden von Zahlen in "Din 1333 Zahlenangaben" geregelt. Mit Rechenbeispielen.

Gruss klaus

anfänger2
17.10.2005, 06:09
@ All Danke für Eure Ideen!
Aber ich glaub ich hab mein Problem nicht rübergebracht.
Das Problem ist, dass ich kein Ereignis finde das auf ein berechnetes Feld reagiert.
Wenn ich die Formel von Matthias in ein Feld schreibe hier das Ereignis "Nach aktualisierung" wähle und manuell eine Zahl eingebe ist alles Wunderbar. Ich möchte aber das Ergebnis einer Berechnung weiterverarbeiten. Da reagiert der Code einfach nicht. Ich ahb schon alle möglichen Ereignisse versucht und auch Requery - hilft aber irgendwie nicht.

Dann habe ich Versucht das Ergebnis meiner ersten Berechnung zwischen zu speichern. Und dieses Feld dann mit Matthias Code behandelt. Das hat funktioniert.
Allerdings immer nur für den ersten Datensatz in meinem Endlosformular. Also ist das auch nicht wirklich erfolgreich.

Vielleicht habe ich aber auch wiedermal den völlig falschen Lösungsansatz.
PS: Die größten zahlen die entstehen werden wahrscheinlich unter 100 liegen.

Nouba
17.10.2005, 06:33
Die <a href="http://www.donkarl.com/FAQ/FAQ2Allgemein.htm#2.22">FAQ 2.22</a> scheint die Problematik zu behandeln.

anfänger2
17.10.2005, 07:21
Ja und nein!
FAQ 2.22 erklärt wie man eine Formel im Steuerelementinhalt auf eine Formel im Steuerelementinhalt anwendet.
Ich habe aber eine Formel im Steuerelementinhalt und dann VBA (Mir ist nichts eigefallen, wie ich den VBA Code "Matthias" in eine Formel bekomme)

Ich müsste ja nur wissen, welches Ereignis beim Berechnen einer Formel eintitt um den VBA Code zu aktivieren. Oder?

Und nehme ich meine Formel in VBA, wird immer nur der erste Datensatz in meinem Endlosformular berechnet. Aber nicht alle. Irgendwie dreh ich mich im Kreis.

anfänger2
17.10.2005, 12:40
Schade! Es hat wohl niemand eine Idee für mein Problem. Oder?

Nouba
17.10.2005, 12:49
Du kannst auch eine öffentliche Funktion (in globalem Modul anlegen) verwenden, die Du in einer Abfrage mit den notwendigen Argumenten aufrufst.

anfänger2
17.10.2005, 13:26
Hmm... Dann werd ich das mal versuchen.

AngeliN
17.10.2005, 14:26
Hi,
an die globale Funktion hatte ich auch gedacht:


Public Function test(zahl As Double, Faktor As Long) As Long
Dim interneZahl
interneZahl = zahl
interneZahl = Round(interneZahl)
'wurde auf- oder abgerundet? Es soll ja immer die nächstgrößere teilbare Zahl benutzt werden.
If interneZahl - zahl < 0 Then
interneZahl = interneZahl + 1
End If
While interneZahl Mod Faktor <> 0
interneZahl = interneZahl + 1
Wend
test = interneZahl
End Function

Es ist nur ein Vorschlag, bitte ausgiebig testen!
Viel Erfolg

Grüße
AngeliN

anfänger2
19.10.2005, 10:51
Hallo!
Ich habe mal den Vorschlag von AngeliN versucht, doch irgendwas mache ich wohl falsch.

Ich habe den Code einfach in ein neues Modul kopiert.
Und dann in einer Auswahlabfrage folgendes eingegeben: test1: test([tbl_Personen]![Liter_gesamt])

Jetzt kommt aber die fehlermeldung: Falsche Anzahl an Argumenten im Abfrageausdruck 'test1: test([tbl_Personen]![Liter_gesamt])'

Irgendwie funktioniert wohl der Aufruf eines Moduls aus einer Abfrage anders - oder?

Nouba
19.10.2005, 11:15
Hmm - AngelinNs Funktion erwartet ja auch zwei Argumente.

?test(15.000001,5)
20

AngeliN
19.10.2005, 11:28
Hi,
ist im Grundsatz schon richtig, aber der Teiler fehlt - die Angabe ist ja auch frei.
also test([tbl..],3)

Viele Grüße
AngeliN

anfänger2
19.10.2005, 11:38
OK! Ich glaub jetzt hab ich's. Allerdings musste ich test ([tbl...];5) eingeben.
Aber es scheint zu funktionieren.

Vielen Dank nochmal!