Ganzzahl und Excel VBA (III.Versuch)

27/03/2008 - 20:51 von Jörg Klein | Report spam
Hallo Peter, Burkhard und der Rest der Excel Gemeinde

Erst einmal zur allgemeinen Erklàrung. Peter und Burkhard haben mich in
bezug auf mein in Excel zu progarmmierendes Problem schon ein ganzes Stück
vorangebracht.
Peter, solltest Du diese News von mir lesen, so möchte ich dich bitten sich
einmal bei mir zu melden. Bei mir brennt die Hütte und ich komme nicht
weiter. Ich denke, mehr als eine Arbeitsstunde ist das für dich nicht. Ich
würde diese dann auch gern bezahlen.

1. Jetzt einmal einige Fragen zur Variablendeklaration. Es funktioniert
nicht so. Was mache ich falsch.
2. Wie bringe ich das im Code unter:
GANZZAHL(B16/C10) und GANZZAHL(C16/C10)
weil ich jetzt ja nicht mehr runden muss. Wahrscheinlich muß jetzt der
komplette Code überarbeitet werden.


Vielen Dank für die Hilfe Jörg



Private Sub Worksheet_Change(ByVal Target As Range)
Dim EINGANGSWERT as Range

If Target.Address(False, False) <> "EINGANGSWERT" Then Exit Sub

On Error GoTo ende
Application.EnableEvents = False

If WorksheetFunction.RoundDown(Range("EINGANGSWERT")/[C10], 0) = _
WorksheetFunction.RoundDown([C16]/[C10], 0) Then
[B21] = 0
[C21] = 0
Else
If Not Range("F25:F49").Find(What:=Replace( _
WorksheetFunction.Round([B16],1)+[C10]-[D10],",","."), _
LookIn:=xlValues, LookAt:=xlWhole) Is Nothing Then
[B21] = ""
[C21] = 0
Else
[B21] = WorksheetFunction.Round(Range("EINGANGSWERT"), 1) + [C10] -
[D10]
[C21] = [E10]
End If
End If

ende:
[C16] = Range("EINGANGSWERT")

Application.EnableEvents = True
End Sub




Du hast es verstanden. Jetzt braucht auch nicht mehr gerundet zu werden. Ich
glaube, dann wird es auch funktionieren. Jetzt kommt die nàchste Hürde als
Excel Anfànger. Alles was ich jetzt gelernt habe zusammen zufügen.
Vielleicht bist Du so nett und könntest mir beim Code helfen.

"Peter Schleif" <peter.schleif.spam@gmx.de> schrieb im Newsbeitrag
news:47e5f94e$0$631$9b4e6d93@newsspool1.arcor-online.net...


Hallo Jörg.

Die Zahlenbereiche, die sich durch die Schrittweite (z.B. 0,20)
ergeben, nenne ich Intervalle. Um festzustellen, ob ein neuer Wert in
B16 eine Intervallgrenze über- oder unterschritten hat und damit eine
Aktion auslöst, muss man diesen Wert mit seinem Vorgàngerwert
vergleichen. Diesen Vorgàngerwert muss man also zwangslàufig irgendwo
speichern, da er ja in B16 durch den neuen Wert überschrieben wird.
Ich benutze für den Vorgàngerwert die Zelle rechts daneben: C16.

Dann ist es ganz einfach festzustellen, ob eine Intervallgrenze über-
oder unterschritten wurde. Man vergleicht einfach die folgenden Werte:

GANZZAHL(B16/C10) und GANZZAHL(C16/C10)

Sind beide Werte gleich, sind der neue und der alte Wert noch im
gleichen Intervall. Dann werden B21 und C21 auf 0 gesetzt. Sind die
Werte hingegen ungleich, wurde ein neues Intervall angebrochen und es
folgt die Suche im Bereich F25:F49.

Zwischenfrage

Willst Du immer noch nach (gerundetB16 + C10 - D10) suchen?

Ich hatte den Eindruck, dass sich dieser Ausdruck bei dir eher aus dem
Versuch ergeben hat, das Durchbrechen der Intervallgrenze
festzustellen. Diese Prüfung wird aber ja jetzt ganz anders erledigt,
so dass für den Ausdruck eigentlich keine Notwendigkeit mehr besteht.


Es folgt also nun die Suche im Bereich F25:F49.

Wird der Wert gefunden gilt:
[B21] = ""
[C21] = 0

Wird er Wert nicht gefunden gilt:
[B21] = (gerundetB16 + C10 - D10)
[C21] = [E10]

Auch hier nochmal die Frage: Soll wirklich (gerundetB16 + C10 - D10)
in B21 eingetragen werden?


Ganz am Ende der Prozedur wird der neue Wert B16 in den alten Wert C16
kopiert und steht so für eine Prüfung im nàchsten Durchlauf zur Verfügung.

Wenn dich die Sichtbarkeit des alten Werts in C16 stört, setzt das
Format einfach auf ;;; oder verstecke den Wert in einer Zelle, die nur
zur Beschriftung dient. Statt C16 kannst Du natürlich auch jede andere
Zelle benutzen. Dann musst Du den Code anpassen. Ich empfehle dir
ohnehin, den wichtigen Zellen B16,C10,D10,etc Namen zu geben und diese
Namen im Code zu verwenden. Sonst musst Du den Code jedesmal anpassen,
wenn sich was verschiebt. Zum Beispiel

B16: EINGANGSWERT
C16: EINGANGSWERT_ALT
C10: SCHRITTWEITE

Im Code nimmst Du dann die folgenden Ersetzungen vor:

[B16] -> Range("EINGANGSWERT")
[C16] -> Range("EINGANGSWERT_ALT")
[C10] -> Range("SCHRITTWEITE") ... usw.


Peter


Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address(False, False) <> "B16" Then Exit Sub

On Error GoTo ende
Application.EnableEvents = False

If WorksheetFunction.RoundDown([B16]/[C10], 0) = _
WorksheetFunction.RoundDown([C16]/[C10], 0) Then
[B21] = 0
[C21] = 0
Else
If Not Range("F25:F49").Find(What:=Replace( _
WorksheetFunction.Round([B16],1)+[C10]-[D10],",","."), _
LookIn:=xlValues, LookAt:=xlWhole) Is Nothing Then
[B21] = ""
[C21] = 0
Else
[B21] = WorksheetFunction.Round([B16], 1) + [C10] - [D10]
[C21] = [E10]
End If
End If

ende:
[C16] = [B16]
Application.EnableEvents = True
End Sub

 

Lesen sie die antworten

#1 Peter Schleif
27/03/2008 - 21:13 | Warnen spam
Jörg Klein schrieb am 27.03.2008 20:51:

1. Jetzt einmal einige Fragen zur Variablendeklaration. Es funktioniert
nicht so. Was mache ich falsch.



EINGANGSWERT ist keine Variable sonderm ein benannter Bereich in
deiner Tabelle. Dort musst Du ihn auch setzen:

Änderunge in der Tabelle:
- Klicke auf B16
- links oben in der Bearbeitungzeile steht B16
- klicke dort hinein
- mache das B16 weg
- schreibe stattdessen EINGANGSWERT
- <ENTER> drücken


Änderung im Code:

1. Die Zeile muss weg: Dim EINGANGSWERT as Range

2. Diese Zeile àndern (siehe unten): If Target.Address( ...



Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address <> Range("EINGANGSWERT").Address Then Exit Sub

On Error GoTo ende
'Ab hier weiter wie bisher
'Ein [B16] wurde noch nicht ersetzt



2. Wie bringe ich das im Code unter:
GANZZAHL(B16/C10) und GANZZAHL(C16/C10)



Gar nicht! Das sollte nur zur Veranschaulichung dienen, wie die
Über/-Unterschreitung der Intervallgrenzen in der Formel-Sprache des
Tabellen-Blatts festgestellt werden /könnte/. Im Code erldigt das aber
ohnehin die If-Abfrage.


Wahrscheinlich muß jetzt der
komplette Code überarbeitet werden.



Nein. Du hasst nur immer noch nicht mitgeteilt, ob der Wert

(gerundetB16 + C10 - D10)

gesucht und eingetragen werden soll oder vielleicht

[B16]
oder [B16] gerundet
oder [B16] gerundet + [C10]
oder [B16] gerundet + [C10] - [D10]
oder die überschrittene Intervallgrenze
oder ...


Peter

Ähnliche fragen