Archiv verlassen und diese Seite im Standarddesign anzeigen : Excel-VBA-Frage zur Programmierung einer Zelle
Amarok
2007-06-20, 17:48:25
Ich beschäftige mich nun seit kurzem mit VBA um diverse Abläufe vereinfachen zu können. Dazu habe ich mir auch ein nettes Buch gekauft und stehe trotzdem irgendwie an.
Ich schreibe nun im Überwachungsfenster meine kleinen netten Makros und habe aber dabei folgendes Problem (eines von vielen, aber ein übergeordnetes..;)
Ich möchte z.B. in der Zelle D5 mit Hilfe einer Formel einen Wert errechnen. Die Formel verwende ich schon länger und es klappt perfekt.
Min Problem: Ich muss öfters den Wert manuell ändern und möchte die Zelle so programmieren, dass bei einer Änderung von über 5% eine Meldung aufscheint, die nachfragt ob man wirklich über 5 % ändern will.
Die Programmierung ist mir im Überwachungsfenster klar, nur wie schaffe ich es, dass dies automatisch geschieht, ohne dass ich wieder ins Visuel Basic switchen muss bzw. ohne dass ich ein Kürzel verwenden (z.B. Strg + ü).
Oder um es allgemein zu sagen: Wie automatisiere ich Makros? (ohne immer die Kürzel verwenden zu müssen
Wahrscheinlich bin ich blind und übersehe die Lösung jedes mal...^^^
Ich hoffe, ich habe mein Problem verständlich geschildert...
Danke im Voraus
Amarok
Mit
schau mal hier unter event handler
http://www.microsoft.com/germany/msdn/library/office/EreignisseInDerOfficeProgrammierung.mspx?mfr=true
meine eigene excel-vba erfahrung liegt zu lange zurück als das ich dir ausm ff ne befriedigende antwort geben könnte ^^
Amarok
2007-06-20, 18:32:34
Danke mal für den Link...
werde mal mich da mal durchkämpfen^^
Amarok
2007-06-20, 22:10:04
Noch eine Frage:
Ich brüte immer wieder über anscheinend "einfache" Begriffe, die mir als kompletter Neuling nicht viel sagen.
Kann mir jemand von euch ein Buch für den echten Anfänger empfehlen?
Das Ereignis Worksheet_Change scheint hier das richtige zu sein. Allerdings bekommst du hier die alten Werte nicht mitgeliefert, die musst du irgendwoanders sichern.
Meine VBA-Erfahrungen sind leider auch sehr gering.
Option Explicit
Dim save(10) As Integer
Dim in_bearbeitung As Boolean
Private Sub Worksheet_Activate()
save(0) = ActiveSheet.Range("A1")
in_bearbeitung = False
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If in_bearbeitung = False Then
If (ActiveSheet.Range("A1") > save(0) * 1.05) Then
If MsgBox("Wert in A1 wirklich ändern?", vbYesNo) = 7 Then
'ggf jetzt den Wert zurücksetzen
in_bearbeitung = True
ActiveSheet.Range("A1") = save(0)
in_bearbeitung = False
Else
save(0) = ActiveSheet.Range("A1") ' neuen Wert sichern
End If
Else
save(0) = ActiveSheet.Range("A1") ' neuen Wert sichern
End If
End If
End Sub
so funzt es...kann aber bestimmt noch verbessert werden
Juerg
2007-06-21, 09:23:31
Die alten Werte sicherst Du indem Du eine Modul-Level Variable deklarierst:(Allgemein) (Deklarationen)
Private m_OldValue As Double
und dann sowas in der Art von:
(Worksheet) (SelectionChange)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Debug.Print m_OldValue; Target.Value; Target.Address
' bla bla...
' Deine Methode
' usw...
' Wenn Ja gesagt zur Änderung > 5%
m_OldValue = Target.Value
' Wenn Nein gesagt zur Änderung
'Target.Value = m_OldValue
End Sub
Amarok
2007-06-21, 20:39:14
Vielen Dank für eure Tipps, ich bin der Lösung schon deutlich näher gekommen (obwohl mir manche Ausdrücke die ihr hier verwendet habt "noch"vollkommen fremd sind^^)
Was aber nicht passt:
Ich habe zum testen in der Zelle "A1" die Formel "=E1 + E2" eingeben. Wenn ich nun in E1 einen Wert schreibe wird sofort nachgefragt (was ja logisch ist, da ja zunächst der Wer "0" in A1 steht), ebenso wenn ich in E2 was eingebe.
Mir schon klar warum es erscheint, weil sich ja der Wert in A1 um mehr als 5% geändert hat.
Nur: Bei Eingaben in E1 und E2 soll nciht nachgefragt werden, sondern nur wenn ich manuell etwas in A1 (also den richtig berechneten Wert) ändern will
Also: Eingabe in E1, dann in E2, A1 wird berechnet. Ich möchte per Hand A1 ändern und erst dann wird nachgefragt.....
Hm, werd mich mal über die Formeln schmeißen.....
puh...du könntest die werte aus E1 und E2 auch sichern und dann beim worksheet_change überprüfen ob diese werte geändert wurden und wenn ja die überprüfung von A1 nicht durchführen sondern A1 nur überprüfen wenn E1_neu = E1_alt und E2_neu = E2_alt
allerdings versteh ich nicht wieso du da erst ne formel einträgst und diese dann durch manuelle eingabe überschreibst
Amarok
2007-06-22, 15:05:24
Ich dachte mir, dass diese Frage kommen würden...;)
Um es etwas praktischer zu beschreiben...
Es geht um die Berechnung einer Flüssigkeitsmenge, die anhand 2er Parameter bestimmt wird. (E1 + E2 -- in Wirklichkeit natürlich etwas komplizierter^^)
Nur gibt es da noch 2 Probleme:
1) Je nach Zustand einer 3. Variablen muss ich die Flüssigkeitsmenge ändern. Nur kann ich eben diese Variable in keine Formel einbinden.
2) Die Flüssigkeitsmenge gibt es jeweils nur in verschiedenen abgepackten Mengen.
z.B. brauche ich 190ml, habe aber nur die Flüssigkeit ursprünglich in 50ml Flaschen abgepackt --> geht sich als nicht direkt aus und ich müsste 10 ml verwerfen. Ich habe aber einen gewissen Spielraum (eben die z.B. 5%) die noch tolerabel sind. (zuviel wäre gefährlich, zuwenig vielleicht nutzlos).
Es gibt nun immer wieder verschiedene Flüssigkeiten (die 1 ist in 40 und 70 abgepackt, die andere in 250 + 500, andere wiederum in 500 und 200...)
Außerdem werden E1 + E2 praktisch nie verändert (höchstens ein wenig), aber die BErechnung von A1 kann sehr wohl immer anders sein....
Ich weiß, kompliziert...;)
Amarok, bist du sicher, daß du als Arzt ein Script programmieren und dich darauf dann in der Praxis verlassen möchtest, welches relativ autonom Entscheidungen zur Medikation treffen soll? Eine Variable falsch deklariert oder irgend ein anderer Fehler im Sys kann schwerwiegende Folgen haben! Wer übernimmt dann die Verantwortung? 3dcenter? Du? Nichts für ungut, sicherlich sind deine Beweggründe positiver Art, aber denk da besser nochmal drüber nach. Zumindest über den Grad der Automation.
Amarok
2007-06-23, 17:20:55
Ich habe mir sehr wohl darüber Gedanken gemacht, alles andere wäre mehr als fahrlässig, und ich mir der Problematik durchaus bewusst.
Es soll auch nicht komplett automatisch ablaufen, dafür ist das Risiko natürlich viel zu hoch, dafür war es nie gedacht.
Ich habe das derzeitige Programm auch an die 6 Monate parallel laufen lassen, immer zusätzlich mit der Hand die Berechnung durchgeführt. Zusätzlich durchlief es auch mehrere Stufen in der Qualitätssicherung, jeweils durch andere Personen kontrolliert.
Übrigens, die Wahrscheinlichkeit, dass man sich bei der händischen Berechnung vertippt ist deutlich höher, somit gab es jetzt sogar eine Verbesserung der Situation.
Solange nur irgendwie eine Fehlermöglichkeit besteht wird das Programm selbstverständlich nicht verwendet.
BTW: Wenn du etwas genaueres wissen willst, gerne per PN.
Ich habe mir sehr wohl darüber Gedanken gemacht, alles andere wäre mehr als fahrlässig, und ich mir der Problematik durchaus bewusst.
Es soll auch nicht komplett automatisch ablaufen, dafür ist das Risiko natürlich viel zu hoch, dafür war es nie gedacht.
Ich habe das derzeitige Programm auch an die 6 Monate parallel laufen lassen, immer zusätzlich mit der Hand die Berechnung durchgeführt. Zusätzlich durchlief es auch mehrere Stufen in der Qualitätssicherung, jeweils durch andere Personen kontrolliert.
Übrigens, die Wahrscheinlichkeit, dass man sich bei der händischen Berechnung vertippt ist deutlich höher, somit gab es jetzt sogar eine Verbesserung der Situation.
Solange nur irgendwie eine Fehlermöglichkeit besteht wird das Programm selbstverständlich nicht verwendet.
BTW: Wenn du etwas genaueres wissen willst, gerne per PN.
Wieso PN? Weil ich das eigentliche Problem beschrieben habe? Ich verstehe nicht so wirklich...
Es ist halt so, daß gerade Frischlinge im Bereich programmieren sehr enthusiastisch ans Werk gehen und denen muss bewusst sein, bzw. gemacht werden, daß die Tücken (wie so oft) im Detail liegen. Es sind Sachen, von denen sie nichts wissen (können).
Amarok
2007-06-24, 19:41:47
PN weil es Off-Topic ist.
Du kannst aber gerne im OT-Bereich einen Thread eröffnen wo du dieses Problem ansprechen kannst. Ich bin jederezeit bereit mit dir auch öffentlich darüber zu diskutieren.
Wie schon gesagt: Ich bin mir sehr wohl dieses Problem bewusst. Wie ich damit umgehe habe ich dir oben erläutert.
vBulletin®, Copyright ©2000-2025, Jelsoft Enterprises Ltd.