Excel 2010 - Funktion nur einmalig ausführen

Tschan

Cadet 2nd Year
Registriert
Jan. 2011
Beiträge
27
Guten Tag zusammen,

ich habe folgende Frage/ Problem:

ich habe eine Tabelle entworfen, Spalte A steht eine laufende Nummer 1 bis 100. In Spalte B,C,D,E,F sollen aus einem anderen Dokument Werte/Inhalte (Auftragsnummern, Datum, Bestellwert etc.) automatisch übertragen werden!
Ich habe eine WENN-Funktion verwendet, die die laufende Nummer in meiner Tabelle mit der laufenden Nummer auf meinem Dokument abgleicht! Stimmen die Zahlen überein, dann wird in Spalte B,C,D,E,F die entsprechenden Inhalte autom. eingefügt.

Das Problem ist nun, dass wenn jetzt in das Dokument die nächste lfd. Nummer eingetragen wird, in meiner Tabelle folglich die Zeile vorher gelöscht bzw. mit 0 in jeder Zelle angezeigt wird. Ich denke es gibt viele Wege dies zu verhindern z.B. Funktion nur einmalig ausführen, Inhalte der Zellen speichern etc.....

Kann mir jemand bitte helfen? Wie setze ich dies am besten um?

Bin dankbar für jede Hilfe!

Grüße
 
Sverweis(...) ?
 
=istfehler
 
Hallo zusammen,

jetzt nochmal mit Bilder hoffe mein Problem wird dadurch verständlicher...

Bestellung.PNG

das ist mein Bestellformular in dem jedes Formular eine laufende Nummer erhält.
Nun habe ich eine Übersicht erstellt in der wie zu sehen ebenfalls eine laufende Nummer enthalten ist. Wenn ich nun mein Bestellformular ausfülle und die laufende Nummer des Bestellformulars mit der Zeile der Übersicht übereinstimmt (mit wenn-Funktion gelöst) sollen die anderen Inhalte des Bestellformulars wie Auftragsnummer, Datum, Bestellwert etc in meine Übersicht automatisch eingetragen werden. Das funktioniert auch soweit. Jetzt ist das Problem, dass wenn ich in das selbe Bestellformular für meine nächste Bestellung verwende und folglich sich der Inhalt und natürlich auch die laufende Nummer ändert, sich in meiner Übersicht zwar die Inhalte der neuen laufenden Nummer aktualisieren (wie oben beschrieben) nur die Inhalte der vorherigen wieder weg sind. Wie kann ich das Problem lösen?

Übersicht.PNG

Übersicht 2.PNG

Vielen Dank!!!
 
Um es etwas drastisch zu formulieren: du möchtest von uns, dass wir dir erklären wie man mit einer Gabel Suppe ist.
Für die Lösung deines Problems ist aber eine Datenbank (Löffel) zuständig.

All das mit VBA nachzubauen geht. Aber man erfindet quasi das Rad neu. (Allein) Der Formelmechanismus von Excel ist dynamisch innerhalb eines statischen Korsetts - was du willst ist Statik innerhalb eines dynamischen Flusses. Das widerspricht sich nun mal. Alte Eingaben in Excel einzufrieren um mit neuen eine neue Zeile zu erzeugen, und zwar automatisch, hat nie in seiner Geburtsurkunde gestanden.

CN8
 
Hallo,

gibt es nicht eine Mögichkeit eine Funktion nur einmal auszuführen, dann wäre das Problem gelöst oder alternativ die Zeile vorher zu speichern. Das muss doch iwie gehen.

Vll weiss sonst noch jemand bescheid, wäre sehr danbar dafür.

Grüße
 
cumulonimbus8 hat es schon gesagt (auch wenn es hoffnungslos klang): per vba makro.

Code:
Sub bestellen()

Sheets("Liste").Select

If Range("A1").Offset(1, 0).Value <> "" Then
    Range("A1").End(xlDown).Offset(1, 0).Select
    Else: Range("A1").Offset(1, 0).Select
    End If
'geht von Zelle A1 nach unten in die nächste freie Zeile'

Selection.Offset(0, 0).Value = Sheets("Formular").Range("B1").Value
Selection.Offset(0, 1).Value = Sheets("Formular").Range("B2").Value
Selection.Offset(0, 2).Value = Sheets("Formular").Range("B3").Value
Selection.Offset(0, 3).Value = Sheets("Formular").Range("B4").Value
Selection.Offset(0, 4).Value = Sheets("Formular").Range("B5").Value
'kopiert die Werte von Formular in die entsprechende Zeile der Liste'

End Sub
Das kannst du zum Beispiel über einen Button im Formular einbinden.

---

Über ein anderes Dokument:
Code:
Sub bestellen()
Dim daten(4)

daten(0) = Range("B1").Value
daten(1) = Range("B2").Value
daten(2) = Range("B3").Value
daten(3) = Range("B4").Value
daten(4) = Range("B5").Value

Application.ScreenUpdating = False

Workbooks.Open "C:\Users\999\Desktop\Liste.xlsx"
Workbooks("Liste.xlsx").Worksheets("Tabelle1").Activate

If Range("A1").Offset(1, 0).Value <> "" Then
    Range("A1").End(xlDown).Offset(1, 0).Select
    Else: Range("A1").Offset(1, 0).Select
    End If

Selection.Offset(0, 0).Value = daten(0)
Selection.Offset(0, 1).Value = daten(1)
Selection.Offset(0, 2).Value = daten(2)
Selection.Offset(0, 3).Value = daten(3)
Selection.Offset(0, 4).Value = daten(4)

Workbooks("Liste.xlsx").Close savechanges = yes

Application.ScreenUpdating = True

MsgBox "Bestellung Nr. " & daten(0) & " eingetragen."

End Sub
 
Zuletzt bearbeitet:
hey jedi3,

vielen Dank schonmal für deine Antwort! VBA ist ja auch ne Möglichkeit, welche ich nicht ausgeschlossen habe, habe allerdings nur keine Ahnung davon ^^
Kannst du mir noch was zu deinen codes sagen? ich kann damit leider nicht viel anfangen...welche änderungen muss ich vornehmen und was macht der obere/ untere code.

Danke!
 
Naja, ich kann es mal versuchen.
Der obere Code ist für eine Excel Datei mit Blättern für das Formular und die Liste. Das ist wahrscheinlich nicht der Fall, deswegen erkläre ich das andere. (eine Datei für das Formular und eine Datei für die Liste)

- Blende dir die Entwicklertools ein. (Frag die Hilfe-Funktion, falls du die Option nicht findest.)
- Öffne die Formulardatei, gehe auf "Code anzeigen", füge den Code ein.
- Passe den Code für dich an:
Code:
    Sub bestellen() 'Prozedurname'

    Dim daten(4) 'definiert eine Feldvariable'
     
    daten(0) = Range("B1").Value
    daten(1) = Range("B2").Value
    daten(2) = Range("B3").Value
    daten(3) = Range("B4").Value
    daten(4) = Range("B5").Value 'Feldvariable nimmt die Werte der Zellen B1 bis B5 auf'
'Die Zellen musst du entsprechend deinem Formular ändern.'
     
    Application.ScreenUpdating = False 'schaltet die Bildschirmaktualisierung aus'
'Damit läuft das Script schneller und der Bildschirm flackert nicht. Kannst es auch ohne die Funktion ausprobieren.'
     
    Workbooks.Open "C:\Users\999\Desktop\Liste.xlsx" 'Öffnet die Datei mit der Liste: Pfad anpassen!'
    Workbooks("Liste.xlsx").Worksheets("Tabelle1").Activate 'Wählt das richtige Tabellenblatt aus: anpassen!'
     
    If Range("A1").Offset(1, 0).Value <> "" Then
        Range("A1").End(xlDown).Offset(1, 0).Select
        Else: Range("A1").Offset(1, 0).Select
        End If 'geht von Zelle A1 aus nach unten in die nächste freie Zeile'
'Annahme dabei ist, dass nach A1 keine freien Zwischenzeilen kommen: ggf. anderen Startpunkt eintragen!'     

    Selection.Offset(0, 0).Value = daten(0)
    Selection.Offset(0, 1).Value = daten(1)
    Selection.Offset(0, 2).Value = daten(2)
    Selection.Offset(0, 3).Value = daten(3)
    Selection.Offset(0, 4).Value = daten(4) 'setzt die Werte aus der Feldvariable in die ausgewählte Zeile ein'
     
    Workbooks("Liste.xlsx").Close savechanges = yes
'Speichert und schließt die Datei'
     
    Application.ScreenUpdating = True
'schaltet die Bildschirmaktualisierung wieder ein'
     
    MsgBox "Bestellung Nr. " & daten(0) & " eingetragen."
'kleines Feedback zur Bestätigung'    
 
    End Sub
Das Offset eine relative Angabe zur ausgewählten Zelle. Wenn z.B. A6 aus erste freie Zeile bestimmt wurde, dann ist Offset(0, 0) -> A6, Offset(0, 1) -> A7, Selection.Offset(0, 2) -> A8, usw.

Bei den Entwicklertools kannst du dann einen Button einfügen und mit dem Makro verknüpfen. (einfügen -> Formularsteuerelemente
 
Zuletzt bearbeitet:
Hey Jedi3,

echt einsame Spitze! Bin dir super dankbar für deine Mühe. Ich werde dies direkt heute Abend ausprobieren.

Ich hoffe ich muss dich nicht mehr stören ;)

Grüße
Ergänzung ()

Hey Jedi3,

muss doch nochmal stören. Also habe deinen code entsprechend angepasst. Beim Ausführen bekomme ich nun eine Fehlermeldung: Laufzeitfehler1004 Anwendungs- oder objektdefinierter Fehler. :( Gehe ich über Makros dann Makro ausführen zeigt er mit den Fehler "400" an :(

Hier mein geänderter Code:
VBA-Code.PNG

Ich habe noch eine Frage:
Ich habe unter range... "Bestellaufforderung" und dann die entsprechende Zelle aus der der Inhalt in meine Tabelle kopiert werden soll reingeschrieben. Ist das richtig, bzw. gebe ich hierdurch die Zuweisung das aus dem Tabellenblatt "Bestellaufforderung" Zelle XY der Inhalt kopiert/übertragen werden soll?

Danke!

Gruß
 
Bei Range kannst du nicht einfach auf andere Tabellenblätter springen, wie bei Formeln.
Da darf nur eine Zelle (oder ein Zellbereich) stehen.
Wenn nötig vorher Worksheets("Bestellaufforderung").Activate schreiben.

Ich bin einfach davon ausgegangen, dass die richtige Tabelle bereits ausgewählt ist, wenn das Makro ausgeführt wird.

Bei der Fehlersuche kann es auch hilfreich sein, den Code nur stückweise auszuführen. Dann lässt sich besser sehen, an welcher Stelle ein Fehler auftritt.
Mit ' kannst du Passagen als Kommentar markieren, die werden dann nicht ausgeführt.
 
Zuletzt bearbeitet:
Zurück
Oben