Rechnen mit VBA

Hallo VBA Freunde,
Habe als Anfänger ein Makro hinbekommen das richtig rechnet, so wie geplant. Oder sagen wir mal fast wie geplant.
Wie kann ich dem Makro sagen es soll nur dort rechnen wo eine Eingabe
(Zahl) gemacht wird, und nicht immer den ganzen Range??? Die Prozedur
wird mit einem Button ausgelöst. (Excel 2000)
Danke für jede Hilfe im voraus.
Gruß Skaletti!

Sub Rechnen()
Dim zeile As Variant
Dim i As Variant

i = zeile
Range("F2:F11").End(xlUp).Offset(1, 0).Select
zeile = ActiveCell.Row - 1
Range("H2").Activate
For i = 2 To 11
Cells(i, 8).Value = Cells(i, 6).Value - Cells(i, 7).Value
Next i

i = zeile
Range("H2:H11").End(xlUp).Offset(1, 0).Select
zeile = ActiveCell.Row - 1
Range("H2").Activate
For i = 2 To 11
Cells(i, 8).Value = Cells(i, 8).Value - Cells(i, 10).Value
Next i

i = zeile
Range("G2:G11").End(xlUp).Offset(1, 0).Select
zeile = ActiveCell.Row - 1
Range("G2").Activate
For i = 2 To 11
Cells(i, 7).Value = Cells(i, 7).Value + Cells(i, 10).Value
Next i

i = zeile
Range("F2:F11").End(xlUp).Offset(1, 0).Select
zeile = ActiveCell.Row - 1
Range("F2").Activate
For i = 2 To 11
Cells(i, 6).Value = Cells(i, 8).Value + Cells(i, 9).Value
Next i
End Sub

Wie kann ich dem Makro sagen es soll nur dort rechnen wo eine
Eingabe
(Zahl) gemacht wird, und nicht immer den ganzen Range??? Die
Prozedur wird mit einem Button ausgelöst. (Excel 2000)

Hallo Skaletti,

ich zerfleische jetzt mal deinen Code. Ich bin da nicht sehr zartfühlend.

Es wäre sehr schön für dich du würdest nicht in Abblockverhalten geraten, iihh böser Reinhard kritisiert mich volle Kanne, sondern es als das sehen was es ist.
Hilfreiche Ratschläge die dir weiterhelfen können.

i = zeile

Sinnlose Zeile, du hast ja grad Dim gemacht, danach hat sowohl i als auch zeile den Wert 0, „“, False, Ansichtssache.

Range(„F2:F11“).End(xlUp).Offset(1, 0).Select

Zu 99% braucht man in Vba kein Select, Activate. Weglassen.
Die unterste belegte Zeilennummer einer Zelle in einer Spalte ermittelt mna so:
Zei=Range(„F“ & Rows.count).end(xlup).row
oder so
Zei=cells(Rows.count,6).end(xlup).row
Das klappt auch in 2007 deshalb benutzt man nicht 65536.

zeile = ActiveCell.Row - 1

Was sollen das? Erst benutzt du Offset um eine Zeile tiefer zu gelangen, nun ziehst du wieder 1 ab?

Range(„H2“).Activate

Für was?

For i = 2 To 11
Cells(i, 8).Value = Cells(i, 6).Value - Cells(i, 7).Value
Next i

Vorher sagst du i wäre zeile, jetzt sagst du For i =2 To 11 usw.
D.h. i=zeile kannste dir sparen.

Jetzt zu deiner Anfrage, ins Modul des Tabellenblattes:

Private Sub Worksheet\_Change(ByVal Target As Range)
Dim Zelle As Range
Set Target = Intersect(Target, Range("F2:F11, H2:H11"))
If Target Is Nothing Then Exit Sub
For Each Zelle In Target
 'mach irgendwas
Next Zelle
End Sub

Gruß
Reinhard

Hallo Reinhard,

ich zerfleische jetzt mal deinen Code. Ich bin da nicht sehr
zartfühlend.

Es wäre sehr schön für dich du würdest nicht in
Abblockverhalten geraten, iihh böser Reinhard kritisiert mich
volle Kanne, sondern es als das sehen was es ist.
Hilfreiche Ratschläge die dir weiterhelfen können.

danke für die hilfreichen Ratschläge. Abblockverhalten kenn ich
nicht. Da ich bisher nur einen kleinen Teil bei VBA raffe, probier ich
schon mal aus, und dann kommt so was bei raus. Bin schon etwas älter,
da geht das Lernen etwas langsamer.

Werde mal versuchen deine Ratschläge umzusetzen. Sitze schon fast
8 Std. am Rechner. Geht jetzt nichts mehr. Melde mich morgen Nachmittag, ob ich es auf die Reihe gekriegt habe. Müsste aber
mit deinen Erläuterungen, für die ich mich bedanke, klappen.

Gruß Skaletti!

Hallo Reinhard,
nochmal vielen Dank für deine genauen und ausführlichen Erklärungen.
Habe wieder sehr viel gelernt.
Ich hoffe ich habe jetzt alle nach deinen Anweisungen geändert.
Hier der Code mit erstmal einem Rechnenvorgang.
Sollte noch was zu verbessern sein,keine Hemmungen.
Gruß Skaletti!

Sub Rechnen()
Dim zeile As Range
Dim Zei As Variant
Dim i As Variant
Zei = Range("F" & Rows.Count).End(xlUp).Row
For i = 2 To 11
Cells(i, 8).Value = Cells(i, 6).Value - Cells(i, 7).Value
Next i
End Sub

Private Sub Worksheet\_Change(ByVal Target As Range)
Dim Zelle As Range
Set Target = Intersect(Target, Range("F2:F11; H2:H11"))
If Target Is Nothing Then Exit Sub
For Each Zelle In Target
Next Zelle
End Sub

Hier der Code mit erstmal einem Rechnenvorgang.
Sollte noch was zu verbessern sein,keine Hemmungen.

Hallo Skaletti,

in Excel ist das Trennzeichen bei parametern das „;“, in Vba das „,“.

„Change“ ist ein Ereigniscode. Der wird automatisch aufgerufen wenn er vorhanden ist und im Blatt eine Zelle oder mehrere gleichzeitig geändert wurden.

Target beinhaltet dann bzw. entspricht den geänderten zellen.
Mit
Set Target = intersect…
minimiere ich Target auf die zellen die überwacht werden sollen, also hier F2:f11,H2:H11
hast du Zelle D5 geändert wird in der Codezeile danach die Sub verlassen, da target Nothing ist.

Die nachstehenden Codes machen also nur dann was wenn die Änderung in F2:F11,h2:H11 geschah.

Die Code zeile
Zelle.Offset(0, 1).Value = Zelle.Offset(0, 2).Value - Zelle.Offset(0, 3).Value
bedeutet, bei Target=F2
G2=H2-I2
bedeutet, bei Target=H2
I2=J2-K2

das wird durch Offset festgelegt, durch den zweiten Parameter dort.
Dieses Offset kannst du ja verändern, sodaß es passt.
Wenn es keine allgemeine Regel für Spalte F und Spalte H gibt, mußt du die zweite Variante nehmen. Da kannst du das Offset für F bzw. H einzeln steuern.

Private Sub Worksheet\_Change(ByVal Target As Range)
Dim Zelle As Range
Set Target = Intersect(Target, Range("F2:F11, H2:H11"))
If Target Is Nothing Then Exit Sub
For Each Zelle In Target
 Zelle.Offset(0, 1).Value = Zelle.Offset(0, 2).Value - Zelle.Offset(0, 3).Value
Next Zelle
End Sub
'
Private Sub Worksheet\_Change(ByVal Target As Range)
Dim Zelle As Range
Set Target = Intersect(Target, Range("F2:F11, H2:H11"))
If Target Is Nothing Then Exit Sub
For Each Zelle In Target
 Select Case Zelle.Column
 Case 6 'F
 Zelle.Offset(0, 1).Value = Zelle.Offset(0, 2).Value - Zelle.Offset(0, 3).Value
 Case 8 'H
 Zelle.Offset(0, 2).Value = Zelle.Offset(0, 3).Value - Zelle.Offset(0, 4).Value
 Case Else
 MsgBox "Hä? Kann nicht sein \*gg\*"
 End Select
Next Zelle
End Sub

Gruß
reinhard

Hallo Reinhard,
Danke für deine Mühe und Hilfe.
Ich glaub ich bin zu blöd dafür.

Die Code zeile
Zelle.Offset(0, 1).Value = Zelle.Offset(0, 2).Value -
Zelle.Offset(0, 3).Value
bedeutet, bei Target=F2
G2=H2-I2
bedeutet, bei Target=H2
I2=J2-K2

Ich weiss, ich nerv bestimmt.
Ich muss folgendes rechnen:
F = H-G
F = F+J
G = G-J
H = H+I

Gruß Skaletti!

F = H-G
F = F+J
G = G-J
H = H+I

hallo Skaletti,

zum Einen, es kann nur eines gelten

F = H-G

0der

F = F+J

Ich weiß jetzt nicht genau wodran es hakt.

Das „Change“-Ereignis reagiert nur auf „manuelle“ Zellwertänderung.
Also mußt du abwägen welche Zellbereiche du damit überwachst.
Bei z.B.
G = G-J
könntest du nur J überwachen.
Wenn du in G Werte eingibst dann auch G, allerdings mußt du dann im Change-code am Anfang und Ende ein
Application.EnableEvents=True/False einbauen, sonst ruft sich der Change-Code selbst nochmals auf.

Gruß
Reinhard

Hallo Reinhard,

zum Einen, es kann nur eines gelten

F = H-G

0der

F = F+J

Das „Change“-Ereignis reagiert nur auf „manuelle“
Zellwertänderung.
Also mußt du abwägen welche Zellbereiche du damit überwachst.
Bei z.B.
G = G-J
könntest du nur J überwachen.
Wenn du in G Werte eingibst dann auch G, allerdings mußt du
dann im Change-code am Anfang und Ende ein
Application.EnableEvents=True/False einbauen, sonst ruft sich
der Change-Code selbst nochmals auf.

Vielen Dank
Ich glaube jetzt habe ich es Verstanden.
Wünsch dir noch einen schönen Sonntag.

Gruß Skaletti!