So könnte es gehen …
Hallo Kristian,
das liegt vielleicht daran, dass ich nicht genug bzw. kaum
Ahnung von der VBA-Programmierung habe.
Aus dem Code geht ja sicherlich heraus, dass diese Funktion im
Blatt „Aufträge“ ausgeführt wird und auch funktioniert.
Sheets(„Aufträge“).Activate
Jetzt gibt es aber in diesem Exceldokument noch ein Blatt,
nämlich das Blatt „Angebote“ das genau so aufgebaut ist wie
„Aufträge“. Dort soll diese Funktion auch verfügbar sein. Wie
erreiche ich das? Einfach den kompletten Code kopieren und
einfügen und die Zeile „Aufträge“ auf „Angebote“ ändern kann
es ja nicht sein (denke ich mir so).
Achso, das ist schon genauer.
Es gibt drei Möglichkeiten (mindestens), das zu realisieren. Eine hattest Du selbst schon genannt. Warum sollte das nicht sein können? Weil man den Code auf diese Weise doppelt hat? Das ist natürlich unschön, weil man eventuelle Änderungen in beiden Code-Segmenten vornehmen muß.
Die Varianten 2 und drei schaffen da Abhilfe:
Du kannst in den betroffenen Tabellenblättern je eine Prozedur einbauen, die folgendermaßen aussieht:
Sub Aufruf()
Call Zeile\_einfuegen\_Formeln\_kopieren( **"Aufträge"** )
End Sub 'Aufruf
Diese ruft dann die Prozedur Zeile_einfuegen_Formeln_kopieren auf und übergibt dabei als Parameter den Namen der zu bearbeitenden Tabelle. Der wird dann dort statt des festen Wertes „Aufträge“ verwendet:
Sub Zeile\_einfuegen\_Formeln\_kopieren( **Tabelle** As String)
Dim izeile 'hier war ´n Fehler bei Dir, glaube ich
Sheets( **Tabelle** ).Activate
izeile = ActiveCell.Row 'erst _nach_ dem Aktivieren abfragen
Range("A" & izeile).Select
Selection.EntireRow.Insert
Range("A" & izeile - 1).Select
Selection.Copy
Range("A" & izeile).PasteSpecial
Range("B" & izeile).Select
ActiveCell.FormulaR1C1 = "=R[-1]C"
Range("L" & izeile - 1).Select
Selection.Copy
Range("L" & izeile).PasteSpecial
Range("N" & izeile - 1).Select
Selection.Copy
Range("N" & izeile).PasteSpecial
Range("C" & izeile).Select
End Sub 'Zeile\_einfuegen\_Formeln\_kopieren
Diese Prozedur solltest Du in ein globales Modul schreiben (Projekt-Explorer: rechte Maustaste, Einfügen, Modul). Die jeweilige Prozedur „Aufruf()“ rufst Du dann wie üblich vom jeweiligen Tabellenblatt aus auf.
Variante drei ist ähnlich, funktioniert aber ohne die lokalen „Aufruf“-Prozeduren. Voraussetzung ist, daß das richtige Tabellenblatt aktiviert ist:
Sub Zeile\_einfuegen\_Formeln\_kopieren()
Dim izeile
izeile = **ActiveCell**.Row
Range("A" & izeile).Select
Selection.EntireRow.Insert
Range("A" & izeile - 1).Select
Selection.Copy
Range("A" & izeile).PasteSpecial
Range("B" & izeile).Select
ActiveCell.FormulaR1C1 = "=R[-1]C"
Range("L" & izeile - 1).Select
Selection.Copy
Range("L" & izeile).PasteSpecial
Range("N" & izeile - 1).Select
Selection.Copy
Range("N" & izeile).PasteSpecial
Range("C" & izeile).Select
End Sub 'Zeile\_einfuegen\_Formeln\_kopieren
Das „Sheets(Tabelle).Activate“ wird einfach weggelassen. Somit bezieht sich alles auf das derzeit aktive Blatt.
Eine Sache noch, die hier vielleicht nicht so sinnvoll ist, manchmal aber ganz nützlich: Man kann auch auf einem Blatt arbeiten, ohne es zu aktivieren. Dabei kann also ein anderes Blatt aktiv bleiben, und die Aktion auf dem bearbeiteten Blatt findet im Hintergrund statt. Dazu muß man das Blatt und die Zellen überall explizit angeben. Hier sieht das dann so aus:
Sub Zeile\_einfuegen\_Formeln\_kopieren2( **Tabelle** As String, **iZeile** As Integer)
**With** Sheets( **Tabelle** )
'izeile = ActiveCell.Row Das geht hier nicht mehr. Da das Blatt nicht
' unbedingt aktiv ist, gibt es auch keine aktive
' Zelle. Die Zeilennummer muß hier also explizit
' anggeben werden - z.B. durch Paramterübergabe.
**.** Range("A" & iZeile).EntireRow.Insert
**.** Range("A" & iZeile - 1).Copy
**.** Range("A" & iZeile).PasteSpecial
**.** Range("B" & iZeile).FormulaR1C1 = "=R[-1]C"
**.** Range("L" & iZeile - 1).Copy
**.** Range("L" & iZeile).PasteSpecial
**.** Range("N" & iZeile - 1).Copy
**.** Range("N" & iZeile).PasteSpecial
**End With**'Sheets(Tabelle)End Sub 'Zeile\_einfuegen\_Formeln\_kopieren2
Sub Aufruf()
Call Zeile\_einfuegen\_Formeln\_kopieren2("Sheet1", 5)
End Sub 'Aufruf
Nachteil ist natürlich, daß die Zeile beim AUfruf bekannt oder eben fest sein muß. Aber bei bestimmten Anwendungen ist das der Fall, z.B., wenn man aus einem Blatt etwas immer an gleicher Stelle rauskopieren und in das aktuelle Blatt einfügen möchte, ohne das andere Blatt dazu immer aktivieren zu müssen. Sieht ja doof aus das geflippe auf dem Monitor.
Achso, zur With-Geschichte einfach mal in der Hilfe nachlesen. Cursor drauf und [Strg]+[F1] drücken.
Kristian