PDA

Vollständige Version anzeigen : nur Inhalte einfügen, aber wie?


flo-joe86
15.09.2011, 11:57
Hallo, ich habe ein Makro gebastelt, welches die Zwischenablage (Clipboard) an die Stelle der makierten Zelle einfügt, und zwar nur die Werte.

Anschließend habe ich noch ein Zwischenschritt eingefügt, welcher mir eine Sicherungskopie des aktuellen Tabellenblatts erstellt.

Danach wird erst die Zwischenablage eingefügt.
Dummerweise werden jtz sogar Formate miteingefügt.

Verstehe absolut nicht warum. Kann mir wer helfen?

Code:

Sub GetClipBoardText()
Dim MyData As New DataObject
Dim sClipText As String
Dim Sheetname, blattname As String
Dim i As Integer


MyData.GetFromClipboard


Sheetname = ActiveSheet.Name
' Zunächst wird die alte Sicherungskopie gelöscht '
blattname = "Sicherungskopie"
Application.DisplayAlerts = False
For i = 1 To Sheets.Count
If blattname = Sheets(i).Name Then
Sheets("Sicherungskopie").Delete
Exit For
End If
Next i
Application.DisplayAlerts = True



' Hier wird eine neue Sicherungskopie angelegt '

Worksheets(Sheetname).Select
ActiveWorkbook.Sheets(Sheetname).Copy _
before:=ActiveWorkbook.Sheets(Sheetname)
Sheets(Sheetname & " (2)").Name = "Sicherungskopie"


Worksheets(Sheetname).Select
ActiveCell.Select

On Error GoTo ErrorHandler

Application.CutCopyMode = False
MyData.PutInClipboard
MyData.Clear
MyData.GetFromClipboard
sClipText = MyData.GetText
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
MyData.Clear
Exit Sub

ErrorHandler:
MsgBox "Der Zwischenspeicher ist möglicherweise leer!"

only Coding
15.09.2011, 12:34
Hallo, flo-joe86,

bei mir wird vermeldet, dass sich kein Inhalt in der Zwischenablage befindet (liegt wahrscheinlich an meiner verwendete "Steinzeit"-version von Excel).

Warum wandelst Du den Wert nicht analog zu

With Range("D2")
.Value = .Text
End With
Ansonsten könntest Du einen Teil Deines Makros wie folgt versuchsweise ändern:

Dim MyData As New DataObject
Dim sClipText As String
Dim Sheetname As String, Blattname As String
Dim i As Integer


Sheetname = ActiveSheet.Name
' Zunächst wird die alte Sicherungskopie gelöscht '
Blattname = "Sicherungskopie"
Application.DisplayAlerts = False
On Error Resume Next
Sheets("Sicherungskopie").Delete
On Error GoTo 0
Application.DisplayAlerts = True

' Hier wird eine neue Sicherungskopie angelegt '

Worksheets(Sheetname).Copy before:=ActiveWorkbook.Sheets(Sheetname)
ActiveSheet.Name = "Sicherungskopie"
HTH
only Coding

flo-joe86
15.09.2011, 12:44
Nunja, ich möchte das Makro dynamisch halten.
Es dient eigentlich dem Zweck, einen vorher makierten Bereich (können auch mehrere Zellen sein), welche mit STRG + C in die Zwischenablage gespeichert wurden, an einen neue, dynamische Position einzufügen. Deshalb verwende ich "ActiveCell.Select"

Wenn du vorher nichts kopierst, also nicht STRG+C machst, ist dein Zwischenspeicher leer und die bekommst diese Meldung, wie du sie beschrieben hast.

Das Lustige an dem Makro ist:
Wenn ich den ganzen Kram in der Mitte weglasse (Sicherungskopie), dann fügt es mir wirklich nur die Werte ein.
Momentan wird alles eingefügt.

only Coding
15.09.2011, 14:46
Hallo, flo-joe86,

wie wäre es mit der Beschreibung dessen, wofür die Prozedur benötigt wird? Hier ein Beispiel, welches ohne die Zwischenablage auskommt (Bereich der Tabelle muss vor der Ausführung markiert sein, ansonsten kann Vorghehen analog zu Auswahl des Zielbereiches verwendet wird). Zellinhalte werden bei meiner Testmappe aus Formeln in Text umgewandelt:

Sub foo()

Dim wsAktiv As Worksheet
Dim strAuswahl As String
Dim rngZelle As Range
Dim rngZiel As Range

Const cstrSAVE_COPY As String = "Sicherungskopie"

Set wsAktiv = ActiveSheet
strAuswahl = Selection.Address

Application.DisplayAlerts = False
On Error Resume Next
Sheets(cstrSAVE_COPY).Delete
On Error GoTo 0
Application.DisplayAlerts = True

wsAktiv.Copy before:=Worksheets(1)
ActiveSheet.Name = cstrSAVE_COPY

wsAktiv.Select

Set rngZiel = Application.InputBox("Geben Sie die linke obere Zielzelle an", , , , , , , 8)

If Not rngZiel Is Nothing Then
rngZiel.Resize(Selection.Rows.Count, Selection.Columns.Count).Value = Range(strAuswahl).Value
End If

Set rngZiel = Nothing
Set wsAktiv = Nothing

End Sub
Gruß
only Coding

flo-joe86
16.09.2011, 09:41
Vielen Dank schon mal für deine Hilfe.

Hier noch ein paar Infos, wofür ich das Makro haben möchte.
Du kennst es sicher selbst: Du kopierst einen Bereich und möchtest ihn wo anders einfügen, allerdings nur die werte, sprich:
Du makierst, drückst STRG+C, gehst zur Ziel-Zelle und machst Rechtsklick --> Inhalte einfügen --> Werte.
Diesen letzten Schritt möchte ich umgehen, indem ich mir ein Makro schreibe, welches dann auf STRG+W gebindet wird:

--> Makieren -> STRG+C -> ZielZelle: STRG+W, fertig!

Spart bei Massenkopieren viel Klickerei. Dummerweise kann man bei Makros die Schritte nicht rückgängig machen, was einem die komplette Arbeite ruinieren könnte. Deshalb möchte ich diese Sicherungskopie einfügen, damit ich mit einem anderen Makro (welches ich schon geschrieben habe), den Schritt "rückgängig" machen kann.

Wenn ich allerdings - wie in deinem Vorschlag - noch die Zielzelle eingeben muss, etc.. - hab ich den Nachteil der vielen Klickerei erneut.

only Coding
16.09.2011, 10:57
Hallo, flo-joe86,

...Du kopierst einen Bereich und möchtest ihn wo anders einfügen, allerdings nur die werte...
Und das geht durch die Verwendung von ActiveCell.Select? Wenn Du vorher einen Bereich ausgewählt hast, gibt es dort eine (und nur eine einzige) aktive Zelle. Aber weder Excel97 noch Excel2010 fügen auf einem kopierten Bereich nur die Werte ein, die Formatierungen bleiben erhalten und müssten gesondert entfernt werden.

Wenn also an einem anderen Bereich (was immer Du unter dynamisch verstehst) eingefügt werden muss, muss entweder die Angabe des zu kopierenden Bereiches nicht per Selection erfolgen, sondern z.B. fest durch Range("A1:B4") oder bei einem zusammenhängenden und miteinander verbundenen Bereich durch Range("A1").CurrentRegion. Dann kann die in der Tabelle aktive Zelle für den Zielbereich wie folgt verwendet werden:

Sub foo()

Dim wsAktiv As Worksheet
Dim strAuswahl As String

Const cstrSAVE_COPY As String = "Sicherungskopie"

Set wsAktiv = ActiveSheet
strAuswahl = Range("B4").CurrentRegion.Address

Application.DisplayAlerts = False
On Error Resume Next
Sheets(cstrSAVE_COPY).Delete
On Error GoTo 0
Application.DisplayAlerts = True

wsAktiv.Copy before:=Worksheets(1)
ActiveSheet.Name = cstrSAVE_COPY

wsAktiv.Select

With Range(strAuswahl)
ActiveCell.Resize(.Rows.Count, .Columns.Count).Value = .Value
End With

Set wsAktiv = Nothing

End Sub
Tja, ich mache mir nicht die Mühe der individuellen Auszeichnung von Zellen (Fett, Schriftfarbe, Font), sondern setze dafür Formatvorlagen ein - das spart mir eine Menge Arbeit (manchmal ist es nützlich, sich bei Word umzusehen ;)).

Gruß
only Coding