Zellen auslesen und in anderes Blatt einfügen

Hallo und Guten Morgen an alle Excelfachleute,

ich erstelle Rechnungen mit excel und möchte jetzt gerne die:
Zelle: B7, Rechnungsempfänger
Zelle: G7, Kundennummer
Zelle: G8, Rechnungsnummer
Zelle: G9, Rechnungsdatum
Zelle: G41, Rechnungsbetrag

mit Hilfe einer Schaltfläche in das Sheet „Ausgangsbuch“ (befindet sich in der gleichen Arbeitsmappe) kopieren (neue Rechnungen sollen im „Ausgangsbuch“ jeweils unter die letze Zeile angefügt werden).

Habe aber nicht die Ahnung wie das zu Bewerkstelligen ist, mit VBA.

Für kompetente Hilfe wäre ich euch sehr Dankbar.

Jürgen Hellweg

mit Hilfe einer Schaltfläche in das Sheet „Ausgangsbuch“
(befindet sich in der gleichen Arbeitsmappe) kopieren (neue
Rechnungen sollen im „Ausgangsbuch“ jeweils unter die letze
Zeile angefügt werden).
Habe aber nicht die Ahnung wie das zu Bewerkstelligen ist, mit
VBA.

Hallo Jürgen
Mit folgendem Makro könnte es gehen.
Ich gehe davon aus, dass Du in Deinem Ausgangsbuch die Daten einer Rechnung nebeneinander auf einer Zeile haben willst.
Grüsse Niclaus
Und falls Reinhard das sieht: Ich bin immer noch nicht weiter beim Definieren der Variablen!!!

Sub RechnDaten()

asn = ActiveSheet.Name
If asn = „Ausgangsbuch“ Then
MsgBox „Achtung: Ein Rechungsblatt auswählen!!“
Exit Sub
End If

pos_a = Range(„B7“)
pos_b = Range(„G7“)
pos_c = Range(„G8“)
pos_d = Range(„G9“)
pos_e = Range(„g41“)

'Zelle: B7 , Rechnungsempfänger
'Zelle: G7 , Kundennummer
'Zelle: G8 , Rechnungsnummer
'Zelle: G9 , Rechnungsdatum
'Zelle: G41, Rechnungsbetrag

Sheets(„Ausgangsbuch“).Select
Range(„A1“).Select
agb = Range(„A1“)
While agb „“
Selection.Range(„A2“).Select
agb = Selection.Range(„A1“)
Wend

Selection.Range(„A1“) = pos_a
Selection.Range(„B1“) = pos_b
Selection.Range(„C1“) = pos_c
Selection.Range(„D1“) = pos_d
Selection.Range(„E1“) = pos_e

End Sub

Hallo Niclaus,

danke für die schnelle Hilfe, aber beim starten der prozedur wird mir immer angzeigt Fehler beim Kompilieren: Variable nicht definiert.

Woran liegt es das ich immer diese Meldung bekommen?

Richtig ist auch das die ausgelesenen Daten in dem Sheet „Ausgangsbuch“ jeweils in einer Zeile eingetragen werden sollen, beginnend in "A2, „B2“, usw.Neue Rechnungen sollen dann jedesmal in die darunter liegende freie Zeile eingetragen werden.

Gruß

Jürgen

danke für die schnelle Hilfe, aber beim starten der prozedur
wird mir immer angzeigt Fehler beim Kompilieren: Variable
nicht definiert.
Woran liegt es das ich immer diese Meldung bekommen?

Jetzt steh ich wie der Ochs am Berg.
Ich habe das Makro in Excel 2003 geschrieben. Hast Du eine neuere Version?
Ich habe in meinem ersten Beitrag auf die Definition hingewiesen. Das ist meine Schwäche!
Füge mal unter das Sub RechnDaten() die Dim-Zeile ein, also:

Sub RechnDaten()
Dim asn, pos_a, pos_b, pos_c, pos_d, pos_e, agb
usw.

Ich hoffe sehr, dass Reinhard mein Makro bereinigt!! Damit ich wieder was lernen kann!
Niclaus

Hallo Niclaus,

jetzt funktioniert es, aber im „Ausgangsbuch“ werden mir immer nur 2 Rechnungen eingetragen, also die erste Rechnung in Zeile „A1“, „B1“, usw., die zweite Rechnunge in Zeile „A2“, „B2“, usw. Ab der dritten Rechnung wird jedesmal die Rechnung in Zeile „A2“ überschrieben.

Wie kann man dieses Problem lösen.

Jürgen

jetzt funktioniert es, aber im „Ausgangsbuch“ werden mir immer
nur 2 Rechnungen eingetragen, also die erste Rechnung in Zeile
„A1“, „B1“, usw., die zweite Rechnunge in Zeile „A2“, „B2“,
usw. Ab der dritten Rechnung wird jedesmal die Rechnung in
Zeile „A2“ überschrieben.

Seltsam. Wichtig: In der Spalte A im Ausgangsbuch muss bei den „belegten“ Zeilen unbedingt was enthalten sein, sonst gilt die ganze Zeile als leer.
Kannst Du mal die belegten Zeilen in der Spalte A ganz einfach mit ein paar Buchstaben überschreiben und dann noch einmal testen.
Ist der „Rechnungsempfänger“ in B7 in der Rechnungstabelle eine Formel? Allenfalls mit SVERWEIS?
Und: meine Ueberlegung war, dass jede Rechnungstabelle einzeln in das Ausgangsbuch übertragen wird.
Kannst Du Deine Datei allenfalls hochladen auf http://www.hostarea.de/
Ich muss allerdings sagen, mit Excel 2007 kenn ich mich überhaupt nicht aus.
Grüsse
Niclaus

Zelle: B7, Rechnungsempfänger
Zelle: G7, Kundennummer
Zelle: G8, Rechnungsnummer
Zelle: G9, Rechnungsdatum
Zelle: G41, Rechnungsbetrag
mit Hilfe einer Schaltfläche in das Sheet „Ausgangsbuch“
(befindet sich in der gleichen Arbeitsmappe) kopieren (neue
Rechnungen sollen im „Ausgangsbuch“ jeweils unter die letze
Zeile angefügt werden).

Hallo Jürgen,

Option Explicit
'
Sub Kopier()
Dim wksR As Worksheet, wksA As Worksheet, ZeiA As Long
Set wksR = Worksheets("Rechnungen")
Set wksA = Worksheets("Ausgangsbuch")
With wksR
 ZeiA = wksA.Range("A" & Rows.Count).End(xlUp).Row + 1
 If ZeiA \> Rows.Count Then GoTo Fehler
 wksA.Range("A" & ZeiA) = .Range("B7")
 wksA.Range("B" & ZeiA) = .Range("G7")
 wksA.Range("C" & ZeiA) = .Range("G8")
 wksA.Range("D" & ZeiA) = .Range("G9")
 wksA.Range("E" & ZeiA) = .Range("G41")
End With
Exit Sub
Fehler:
MsgBox "Wanne ist voll"
End Sub

Gruß
Reinhard

Das Sheet „Ausgangsbuch“ hat in der ersten Zeile die Überschriften:

A1 B1 C1 D1 E1
Rech.-Nr. Kund.-Nr. Rech.-Empfänger Rech.-Datum Rech.-Betrag

Hierunter sollen nun die einzelnen Rechnungen eingetragen werden.

Der Rechnungsempfänger (in B7) in der Rechnung wird mit SVerweis auf die Kundennummer aus dem Sheet Kunden gesucht.

Arbeite mit Excel 2003

Jürgen

Hallo Reinhard,

funktioniert nun einwandfrei. Danke

Vorgestern hast du mir mit diesem Code geholfen:

Sub Speicher()
Dim Datei As String
Const Pfad As String = „C:\Rechnungen“
Datei = Range(„A10“) & Range(„G11“) & „.xls“
ThisWorkbook.Worksheets(„Rechnungen“).Copy
ActiveWorkbook.SaveAs Pfad & Datei
ActiveWorkbook.Close
End Sub

Es wird aus der Arbeitsmappe nur das Sheet Rechnung gespeichert.
Meine Frage kann man diesen Code so modifizieren, das nur der Bereich „A1:G53“, gespeichert wird. So wie es jetzt ist, werden die Schaltflächen jedesmal mitgespeichert, wenn ich eine neue Rechnung speichere.

Jürgen

Zellenbereich in einer neuen Mappe speichern

Es wird aus der Arbeitsmappe nur das Sheet Rechnung
gespeichert.
Meine Frage kann man diesen Code so modifizieren, das nur der
Bereich „A1:G53“, gespeichert wird. So wie es jetzt ist,
werden die Schaltflächen jedesmal mitgespeichert, wenn ich
eine neue Rechnung speichere.

Hallo Jürgen,

Sub Speicher()
Dim Datei As String, Anz As Integer, wksR As Worksheet
Const Pfad As String = "C:\Rechnungen\"
Set wksR = ThisWorkbook.Worksheets("Rechnung")
Anz = Application.SheetsInNewWorkbook
Datei = wksR.Range("A10") & wksR.Range("G11") & ".xls"
Application.SheetsInNewWorkbook = 1
Workbooks.Add
With ActiveWorkbook
 .Worksheets(1).Name = "Rechnung"
 wksR.Range("A1:G53").Copy Destination:=.Worksheets(1).Range("A1")
 .SaveAs Pfad & Datei
 .Close
 Application.SheetsInNewWorkbook = Anz
End With
End Sub

Gruß
Reinhard

Hallo Reinhard,

ich bin begeistert, funktioniert alles einwandfrei.

vielen dank an dich und an niclaus für die tolle hilfe.

gruß an alle

jürgen

Artikel ist somit erledigt

Und falls Reinhard das sieht: Ich bin immer noch nicht weiter
beim Definieren der Variablen!!!

Grüezi Niclaus,

ja ich sehe da ist maches zuviel und manches zuwenig :smile:

Benutze bitte beim Code posten den pre-Tag, wird unterhalb des Eingabefeldes erläutert.

Hake in Extras–Optionen des VB-Editors das Feld „Variablendeklaration erforderlich“ an"

Select ist zu 99% überflüssig und schlecht zu lesen, raus mit allen Selects.

Wo genau hängst du fest bei der Variablendeklaration?

Dim asn as string
wenn es so benutzt wird:
asn = ActiveSheet.Name

Dim pos_a
oder
Dim pos_a as Variant
wenn es so benutzt wird:
pos_a = Range(„B7“)

Deine Schleife macht deinen Code sehr langsam.
Angenommen du hast 30000 Datenzeilen, stellst dich in A1 und klickst solange auf die Pfeil nach unten Taste bis du zur ersten freien Zelle in A kommst, das macht deine While-Schleife.

Nun gehe aber mal in eine beliebige freie Spalte, drücke Strg+Pfeil nach Unten Taste, dann Strg+Pfeil nach Rechts Taste.
Du bist nun in A65536 (bei Versionen vor 2007)
Dies erreichst du im Code mit
Range(„A“ & rows.count).select
(das Select ist nur zum Demonstrieren, fliegt gleich raus *gg*)
Cells(rows.count,1).select bzw. Cells(rows.count,„A“).select ist das Gleiche

Wenn man nun in A65536 steht und Strg+Pfeil nach Oben Taste drückt so ist man sofort in der untersten nicht leeren Zelle in A
Die Codeentsprechung dafür ist
Range(„A“ & rows.count).end(xlup).select

In meinem Code siehst du wie ich die Zeilennummer der untersten ersten freien Zelle in A durch einen Befehl ermittle:

Zei = Range(„A“ & rows.count).end(xlup).row + 1

Das ist natürlich zigfach schneller als eine Schleife.
Selbst wenn du die Bremse „Select“ wegläßt und nur eine Variable hochzählst:

Sub tt()
Dim Zei As Long
With Worksheets("Ausgangsbuch")
 While .Range("A1").Offset(Zei, 0) ""
 Zei = Zei + 1
 Wend
 .Range("A1").Offset(Zei, 0) = Range("B7")
 .Range("A1").Offset(Zei, 1) = Range("G7")
 .Range("A1").Offset(Zei, 2) = Range("G8")
End With
End Sub

Gruß
Reinhard