Excel Formular mit Eingabemaske und Zuweisung der Zahlen

herman48

Stammgast
Guten Tag liebes Forum
Ich habe eine Excel Tabelle, in welcher ab Zelle A10 nach unten Preise stehen (Ganzzahlen), z.B. 1, 2, 3, usw. In Spalte B daneben ist die Anzahl und in C das Produkt aus Anzahl und Preis. Ich möchte jetzt z.B. in Zelle B6 als Eingabemaske die Preise eingeben, die dann automatisch in der Spalte B (Anzahl) im richtigen Feld hochgezählt werden (Es sollte möglichst eine Fehlermeldung auftauchen, wenn eine in Spalte A nicht vorhandene Zahl eingegeben wird). Ich habe bisher noch keine Funktion oder Kombination mehrere Funktionen gefunden die das tut.
Meine Fragen: Ist sowas mit Excel überhaupt möglich? Brauchts dazu Makros (bin kein Hirsch in Makros)? Oder ist ein anderes Programm geeigneter?
Ich danke herzlich für Ideen und Denkanstösse. Hermann48
 

weer

Stammgast
Ich habe eine Excel Tabelle, in welcher ab Zelle A10 nach unten Preise stehen (Ganzzahlen), z.B. 1, 2, 3, usw. In Spalte B daneben ist die Anzahl und in C das Produkt aus Anzahl und Preis. Ich möchte jetzt z.B. in Zelle B6 als Eingabemaske die Preise eingeben, die dann automatisch in der Spalte B (Anzahl) im richtigen Feld hochgezählt werden

Salü Herman

Ich versteh das nicht ganz. Du gibst in B6 einen Preis ein. Im unteren Teil soll dann parallel zum Preis in Spalte B hochgezählt werden? - Wie viel denn? Immer 1 dazu? - Wenn ja, dann muss man mit einem VBA-Makro arbeiten. Und dann müsste man genauere Angaben haben.

Wäre es als Variante z. B. auch möglich, wenn man auf A10 oder A11 usw. doppelklickt, dass dann die Anzahl in B10 oder B11 hochgezählt wird? - Das müsste auch mit Makros erledigt werden. - Es wäre dann keine Prüfung notwendig.

(Es sollte möglichst eine Fehlermeldung auftauchen, wenn eine in Spalte A nicht vorhandene Zahl eingegeben wird). Ich habe bisher noch keine Funktion oder Kombination mehrere Funktionen gefunden die das tut.
Meine Fragen: Ist sowas mit Excel überhaupt möglich? Brauchts dazu Makros (bin kein Hirsch in Makros)?

Ein Musterbeispiel für die Gültigkeitsprüfung! In Excel 2010 im Menü Daten / Datentools

Viele Grüsse
Niclaus
 

herman48

Stammgast
Salü Niclaus
Vielen Dank für Deine Rückmeldung. Ja, von 0 weg immer eins hochzählen. Das Formular (die Formulare) ist gedacht zur einfachen Auflistung von Warenein- oder ausgängen mit Kontrolle der Beträge. Die Lösung mit Doppeöklick auf den Preis die Du vorschlägst wäre ein Wegan den ich nicht gedacht habe, der Vorteil ist das Wegfallen der Prüfung, der Nachteil das Zielen mit dem Cursor. Sollte aber zu Schaffen sein wenn das andere zu kompliziert wird. Wie müsste dann das Makro aussehen?
Vielen Dank und Gruss
Hermann
 

weer

Stammgast
VBA-Lösung

Salü Hermann


Salü Hermann

Ich habe folgendes gemacht (Excel 2010):

Vorbemerkung: Der "Preis-Bereich" umfasst die Werte in A10:A100. Dieser Bereich kann in den Makros ohne Probleme vergrössert oder verkleinert werden.

Ein erstes Makro:

Code:
Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("B6")) Is Nothing Then Exit Sub
Application.EnableEvents = False

kontr = 0
preis = Target.Value
If preis = 0 Then GoTo finisi

For i = 10 To 100   ' <<<<  Bereich A10:A100

liste = Cells(i, 1)
If liste = preis Then
    anzahl = Cells(i, 2)
    Cells(i, 2) = anzahl + 1
    kontr = 1
    GoTo finisi
End If
Next i

finisi:
Target.Offset(0, 0).Select
If kontr = 0 Then
    MsgBox "Das ist ein ungültiger Preis!", , "Fehlermeldung"
End If

Application.EnableEvents = True
End Sub

In B6 gibst Du einen Preis ein. Parallel zu diesem Preis (Spalte A) erhöht sich die Anzahl um 1 (Spalte B). In B6 können nur Preise eingegeben werden, die in A10:A100 aufgeführt sind. Bei nicht "definierten" Preisen gibt es eine Fehlermeldung. – Mein erster Gedanke war, die Eingabe mit der Gültigkeitsprüfung zu prüfen; das führt aber in diesem Makro zu Problemen.


Dann ein zweites Makro:

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    
If Intersect(Target, Range("A10:A100")) Is Nothing Then Exit Sub
' Bereich der Preise
Application.EnableEvents = False

preis = Target.Value
Cancel = True
If preis = "" Then
    MsgBox "Das ist kein Preis!", , "Fehlermeldung"
    Exit Sub
End If

anzahl = Selection.Offset(0, 1)
Selection.Offset(0, 1) = anzahl + 1

Application.EnableEvents = True
End Sub


Bei einem Doppelklick auf einen Preis in A10:A100 erhöht sich die entsprechende Anzahl um 1.
Doppelklick auf eine leere Zelle führt zu einer Fehlermeldung.

Wichtig ist folgendes: Die beiden Makros müssen im VBA-Bereich des Arbeitsblattes eingefügt werden, nicht in einem Modul! Gaby Salvisberg hat es hier im PCTipp irgendwo so beschrieben:

Öffnen Sie den VisualBasic Editor, indem Sie Alt+F11 drücken. Klappen Sie in der linken Fensterhälfte allenfalls «Microsoft Excel Objekte» auf und doppelklicken Sie den Namen der betroffenen Tabelle (z.B. «Tabelle1»). Damit wendet sich das Makro ausdrücklich in jener Tabelle an. - Kopieren Sie den Makro-Code hinein.
Du kannst die zwei Makros in zwei verschiedene Arbeitsblätter eingeben. Du kannst aber auch beide in ein Arbeitsblatt eingeben. Dann sind in der gleichen Tabelle beide Varianten möglich: Eingabe in B6 und Doppelklick auf Preis.

Ich habe eine Exceldatei hochgeladen:

https://drive.google.com/file/d/0B0pOZasARSo2YzFDUzdjTWd0TXM/view?usp=sharing

Tabelle1: Variante 1 mit Eingabe in B6 –Tabelle2 mit Variante 2: Doppelklick auf Preis.

Ich hoffe, das eine oder andere hilft Dir. Freundliche Grüsse Niclaus
 
Zuletzt bearbeitet:

herman48

Stammgast
Lieber Niclaus

Vielen herzlichen Dank für Deine Hilfe. Obwohl ich Excel 2007 verwende gehen beide Makros. Ich persönlich ziehe das erste vor. Wie es so ist, alle erfüllten Wünsche bekommen Junge. Wenn ich das Makro besser durchschaue, werde ich versuchen es so zu erweitern dass zusätzlich in D6 "Ausgang" in Spalte D gezählt wird .

Liebe Grüsse und schönes Wochenende
Hermann
 

weer

Stammgast
Junge!

Grüezi Hermann

Es freut mich, dass Dir meine Bastelei hilft. Und dass es Junge gibt: Jetzt mit Frühlingsbeginn ist ja auch die richtige Zeit dazu!

Wenn ich das Makro besser durchschaue, werde ich versuchen es so zu erweitern dass zusätzlich in D6 "Ausgang" in Spalte D gezählt wird .

Das schaffst Du sicher. Es ist ja alles so logisch in Excel und VBA ;-) Wir können ja schauen, ob wir zum gleichen Ergebnis kommen!?

In D6 gibst Du einen Preis ein. In D10 : D100 soll parallel zum Preis wieder aufsummiert werden? Hab ich Dich richtig verstanden?

Schau Dir mal das folgende Makro an. Kommst Du zum gleichen Ergebnis?

Code:
Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("B6", "D6")) Is Nothing Then Exit Sub
'Application.EnableEvents = False
'Cancel = True
Target.Offset(0, 0).Select
tcol = Target.Column
preis = Target.Value
kontr = 0

If preis = 0 Then GoTo finisi
For i = 10 To 100   ' <<<<  Bereich A10:A100
    If Cells(i, 1) = preis Then
        If tcol = 2 Then einaus = 1 Else einaus = -1
        Cells(i, tcol) = Cells(i, tcol) + einaus
        kontr = 1
        GoTo finisi
    End If
Next i

finisi:
If kontr = 0 Then
    MsgBox "Das ist ein ungültiger Preis!", , "Fehlermeldung"
End If

Application.EnableEvents = True
End Sub
Etwa in der Mitte des Makros heisst es:
If tcol = 2 Then einaus = 1 Else einaus = -1

Das bewirkt, dass in D10 : D100 negative Zahlen ausgegeben werden. Wenn Du da auch positive Zahlen haben willst, dann ersetze diese Zeile durch folgende:
einaus = 1

Was ich in diesem Makro nicht begreife ist folgendes: Ich habe irgendwann einmal gelernt, in "Target"-Makros sollte immer folgende Zeile aufscheinen:
Application.EnableEvents = False

Komischerweise führt diese Zeile in dieser Version des Makros zu Fehlern. Ich habe sie deshalb auskommentiert. Wenn jemand dazu Bescheid weiss, wäre ich sehr froh und dankbar, wenn man mich aufklären könnte!

Viele Grüsse Niclaus
 

herman48

Stammgast
Hallo Niclaus
Merci vielmal! Genau was ich gesucht hatte. Sorry für die verspätete Antwort, liege eben mit Grippe flach.
Hast schon recht, Excel und VBA sind sehr logisch. Schade sind es meine grauen Zellen nicht immer. Im Ernst: Es ist so einfach, aber ich hatte es komplizierter und ohne Resultat angegangen. Bin nun happy und habe wieder etwas gelernt.
Vielen Dank nochmals und liebe Grüsse
Hermann
 
Oben