EXCEL VBA Makro Erstellung Programmierung

Hallo Gemeinde,
soll folgendes realisieren.

Wenn in Tabelle-1 bei A1 ein X eingetragen wird, dann soll von Tabelle-2 eine oder mehrer Zeilen kopiert werden und diese dann in Tabelle-1 zusätzlich ab A20 eingetragen werden.

Wenn diese X Abfrage erfolgreich durchgeführt wurde soll die Tabelle-1 dann auch noch mit Ihren ganzen Zusätzen Informationen ausgedruckt werden.

Bekomme einfach diese Verknüpfung nicht hin und vielleicht kann ja einer von euch mir hierbei behilflich - DANKE.

mit Gruß, Wolle

Hallo Wolle,
wovon hängt’s denn ab, ob aus Tabelle2 eine oder mehrere Zeilen kopiert werden sollen? Und woher aus Tabelle2?

Und ich frag mich, ob das unbedingt eine VBA-Lösung sein soll, also eine echte Datenkopie, oder ob nicht eine simple =WENN(A1=„X“;Tabelle2!A20;"") in Tabelle1!A20 usw. genügt (Annahme: A20 aus Tabelle2 muss in A20 aus Tabelle1), und dann halt selber den Druck anstoßen?

lg
Katharina

Hallo Wolle,

ich fange mal von hinten an: für den Ausdruck würde ich erst mal ein Makro aufnehmen. Also Blatt händisch bearbeiten, und vor dem Ausdrucken Extra // Makro // Makro aufnehmen. Wenn Du fertig bist Aufnahme stoppen.

Mit Alt + F8 könntest Du dieses Makro starten. Vorher muss vor den Text Deine Abfrage erfolgen, ob A1 = X richtig ist, und wenn ja ein Bereich aus Tabelle 2 kopiert werden. Zum Ergänzen erreichst Du den Programmierbereich über Alt + F11.

Auf Tabelle 1 scheinen A1 und A20 fix zu sein, und können also so auch direkt adressiert werden (Cells.Activate).

Der Bereich auf Tabelle 2 scheint variabel zu sein. Hier müsste also der Bereich irgendwie abgefragt werden. Gibt es immer gleiche Kennzeichen für diesen Bereich (beginnt immer in Zelle sowieso, endet mit einer Leerzeile, oder ähnliches)?

LG MwieMichel

hallo Katharina,
Danke, ausprobiert und verstanden. Geht ganz einfach wenn man auf diese Idee kommt.
Gruß, Wolle

Hallo MwieMichel,
Das Makro habe ich hinbekommen.
Das mit „adressiert werden (Cells.Activate)“ habe ich nicht verstanden, habe mir erst jetzt ein Buch hierzu gekauft, nicht einfach zulesen.
Kannst Du mir ein Beispiel geben?
Tab.-1 A1 wenn hier x dann aus
Tab.2 A1 den Text „Sonne?“ in Tab.-1 B1 einfügen.
Und so geht die Abfage durch das ganze Blatt.
Wie ist dies zu lösen - gut ist es wenn ich die Makrozeichen auch erklärt bekomme.
Danke im Voraus.
Gruß, Wolle

Hallo Wolle,

sowas läst sich gut mit VBA lösen. Die zu kopierenden Zeilen der Tabelle 2 müssen aber vorher definiert sein, zB ein fester Bereich oder man macht eine Abfrage mit einer Schleife wo zum Beispiel die Spalte „A“ nach nicht leeren Zellen durchsucht wird oder ob die Zellen ein Datum enthält und diese Zeilen werden dann kopiert.

Muss in der Tabelle 1 ein X eingetragen werden oder wäre eine Lösung mit einem Button besser. Beides geht, mit einem Button ist es eleganter.

Code in Tabelle 1 Worksheet Change kopieren (sucht einzelen Zeilen und kopiert sie dann):

If Cells(1, 1) = „X“ Then ’ A1=X?
Application.ScreenUpdating = False 'macht das Makro schneller
Application.EnableEvents = False 'Makro für weiter Änderung in der Tabelle gesperrt.

Dim i As Integer
Dim Bereich As Range

Set Sh = Sheets(1)
i = 20 'zeilenzähler
For Each Bereich In Sheets(2).Rows(„1:500“) 'Bereich=Zeile 1 bis 500 Tabelle 2. Max. 65536, älter Excel Vers. bis 32768
If Not Bereich.Cells(1, 1) = Empty Then 'ist Zelle der Spalte A nicht leer dann
Bereich.Copy Sh.Cells(i, 1) 'kopiert ganze zeile in Tabelle 1 ab Zeile 20
i = i + 1
End If
Next
Sh.Cells(1, 1) = Empty ’ X in A1 löschen

Application.ScreenUpdating = True
Application.EnableEvents = True

Sh.PageSetup.PrintArea = „$A$1:blush:Spalte$“ & i - 1 ’ druckbereich festlegen (i-1=letzte kopierte Zeile; $Spalte= Spalten angeben zb. $F)
Sh.PrintOut 'drucken

End If

Code für einen zusammenhängenden Bereich (ohne Leerzeilen!!):

If Cells(1, 1) = „X“ Then ’ A1=X?
Application.ScreenUpdating = False 'macht das Makro schneller
Application.EnableEvents = False 'Makro für weiter Änderung in der Tabelle gesperrt.

Set Sh1 = Sheets(1)
Set Sh2 = Sheets(2)

Sh2.Range(„A1“).CurrentRegion.Copy Sh1.Cells(20, 1) 'Bereich kopieren
Sh1.Cells(1, 1) = Empty ’ X in A1 löschen

Application.ScreenUpdating = True
Application.EnableEvents = True

Set Bereich1 = Sh2.Range(„A1“).CurrentRegion
Set Bereich2 = Bereich1.Resize(Bereich1.Rows.Count + 19) 'Bereich erweitern
Sh1.PageSetup.PrintArea = Bereich2.Address ’ druckbereich festlegen
Sh1.PrintOut 'drucken
End If

Ein Programmierung mit einen Button ist der Code fast gleich, nur die If-Abfrage mit dem „X“ würde entfallen sowie das letzte End If. Hierzu müsstest du mit dem Formular-Symbolleiste ein Schaltfläche (Button) im Bereich der Zelle A1 erstellen. Bei der Makrozuweisung gehst du auf NEU und im erscheinen Makroifenster kopierst du einen der beiden Codes (ohne die erste IF … und das letzte End If auch die Code-Zeile „Sh1… X in A1 löschen“ kannst du löschen).

Gruß Andreas

Hallo,
Kann dir leider nicht helfen.

Hallo Wolle,
anbei Routine zum Abfragen und Kopieren. Habe selbst eine alte Excelversion. Bei dem einfachen Skript erwarte ich aber keine Probleme. Die Zahl der Zeilen habe ich hier mal auf 100 begrenzt. Lässt sich natürlich ändern. Habe versucht, sinnvoll zu kommentieren (das geht mit Hochkomma 'und Text):

’ Hier fängt das Makro an
Sub BedingtKopieren()
’ Einfache Schleife
’ Variablen deklarieren
Dim Zeile As Integer
Dim Spalte As Integer
Dim MaxZeile As Integer
Dim Abfrage As String
’ Variablen Initialisieren
Zeile = 1
Spalte = 1
MaxZeile = 100
’ Schleife für Bereich (Do While…Loop)
Do Until Zeile = MaxZeile
Sheets(„Tabelle1“).Activate
Cells(Zeile, Spalte).Activate
Abfrage = ActiveCell
’ Wenn die Zelle X enthält, soll kopiert werden
If Abfrage = „X“ Then
Sheets(„Tabelle2“).Select
Cells(Zeile, Spalte).Select
Selection.Copy
Sheets(„Tabelle1“).Select
’ Dabei soll die Spalte B sein
Spalte = Spalte + 1
Cells(Zeile, Spalte).Select
ActiveSheet.Paste
End If
’ Danach wird die Spalte wieder A und die Zeilennummer erhöht
Spalte = 1
Zeile = Zeile + 1
’ Hier endet die einfache Schleife
Loop
’ auf beiden Blättern zurück in Zelle A1
Sheets(„Tabelle2“).Select
Cells(1, 1).Activate
Sheets(„Tabelle1“).Select
Cells(1, 1).Activate
’ und hier endet das Makro
End Sub

Lass mich wissen, wenn es nicht funzt.
LG MwieMichel

Hallo Wolle,

hab gesehen, dass sich bereits mehrere Experten deinem Problem angenommen haben. Sorry, hab dein Email erst jetzt gelesen.

schönen Gruß
Stefan

Hallo Wolle,

was hast du denn bisher ?

Gruß
Marco

Hallo,

zu dem was ich verstanden habe:

_Private Sub Kopieren()
Dim Zeile_Quelle as Long, Zeile_Ziel as Long

Zeile_Quelle = 1 'Startzeile auf Tabelle2, bei Bedarf entsprechend anpassen
Zeile_Ziel = 20

If Sheets(„Tabelle1“).Range(„A1“).Value = „X“ Then

Do While Sheets(„Tabelle2“).Range(„A“ & Zeile_Quelle).Value „“ AND Zeile_Quelle

Einige Voraussetzungen sind hier zu beachten:

  • Es werden solange Daten aus dem zweiten Tabellenblatt kopiert (aus Spalte A), bis eine leere Zelle auftaucht
  • Die Daten müssen in Spalte A auf Blatt 2 stehen

Sofern eine andere Funktionsweise gemeint war, benötige ich weitere Informationen - ansonsten einfach selbständig den Code anpassen/erweitern nach eigenen Bedürfnissen

Grüße_

Hallo liebe Gemeinde,
DANKE zuerst - viele Antworten die ich zuerst mal jetzt realisieren muss.
Es kann etwas dauern bis ich dies jetzt anwenden / umsetzten kann.
Da ich neu bin, wusste ich nicht, dass man den Code auch hier eingeben darf.
Bitte um Geduld - habe jetzt eine Woche URL und kann dies in aller Ruhe ausprobieren, so dass ich dies vielleicht nächste Woche in der Firma zeigen kann.
Melde mich aber was daraus geworden ist.
Danke mit Gruß, Wolle

Hallo.

ich hoffe ich bin noch nicht zu spät… =)

Mit Tabelle 1 und 2 meinst du nehme ich an ein anderes Tabellenblatt in derselben Exceldatei und keine neue extra Exceldatei, richtig?

Also deine Tabellenblätter wählst du mit:

Sheets("*Dein Tabellenname*").Select

Ob in A1 ein X steht überprüfst du mit:

If Range(„A1“).Value = „x“ Then
End If

Und zwischen dein If und End If packst du die Aktionen die ausgeführt werden sollen. D.h. kopiere den Bereich x, öffne das andere Blatt und füge es ein.

Wegen deiner Druckersache, lass dir da am Besten ein Makro aufzeichnen und nutze anschließend diesen Code.
Da kannst du nämlich ohne großes Coding und Aufwand auch noch formatieren, einen Druckbereich festlegen usw.

Grüezi Wolle

Tut mir leid - im Moment fehlt mir die Kapazität diese Frage anzugehen.

Das Ganze ist aber mit VBA-Programmierung zu realisieren.

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Hallo Wolle!
Was hast Du bis jetzt denn versucht? Es gibt ja bei Excel die wunderbare Möglichkeit der Makro-Aufzeichnung, damit müßte das Problem eigentlicvh schon (fast) fertig gelöst sein.

Gruß
Wolfram

Ich würde das so machen (Code bitte bei Blatt „Tabelle-1“ einfügen):

Private Sub Worksheet\_Change(ByVal Target As Range)

 If Me.Range("a1").Value = "X" Then
 Me.Range("a1").Value = "" ' Zurücksetzen
 Sheets("Tabelle-2").Rows("3:5").Copy ' Zeilen bitte anpassen
 Sheets("Tabelle-1").Range("a20").Select
 ActiveSheet.Paste
 ActiveSheet.PrintOut
 End If

End Sub

Hallo und Danke Wolfram
Gruß, Wolle