2016-07-29 11 views
1

Ich versuche, meinen Code zu beschleunigen, indem Sie ihn nicht mit Select schreiben.Kopieren und Einfügen Arbeitsblatt-Name zu einem anderen Arbeitsblatt, das nicht aktiv ist, ohne zu verwenden/aktivieren

Ich habe drei Registerkarten, und ich möchte den Tabnamen neben den Daten, die in der jeweiligen Registerkarte angezeigt wird, einfügen, ohne die Registerkarte auszuwählen.

Ich finde jedoch, dass, wenn ich den Code z. B. auf Blatt 1 ausführen, es für Blatt 1 funktioniert, aber wenn es für Blatt 2 das gleiche tut, schlägt es mit Fehler "Laufzeitfehler" 1004 fehl ': Anwendungsdefinierter oder objektdefinierter Fehler. "

Bitte siehe unten meinen Code.

Sub Create_Reports_NEWWWW() 
Application.ScreenUpdating = False 

Dim wb As Workbook 
Dim LastRow As Integer 
Dim LastColumn As Integer 

Set wb = ActiveWorkbook 

'copy sheet name to right of raw data on each sheet 
LastRow = wb.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row 
LastColumn = wb.Sheets(1).Cells(4, Columns.Count).End(xlToLeft).Column 
wb.Sheets(1).Range(Cells(4, LastColumn + 1), Cells(LastRow, LastColumn + 1)) = wb.Sheets(1).Name 

LastRow = wb.Sheets(2).Cells(Rows.Count, 1).End(xlUp).Row 
LastColumn = wb.Sheets(2).Cells(4, Columns.Count).End(xlToLeft).Column 
wb.Sheets(2).Range(Cells(4, LastColumn + 1), Cells(LastRow, LastColumn + 1)) = wb.Sheets(2).Name 

LastRow = wb.Sheets(3).Cells(Rows.Count, 1).End(xlUp).Row 
LastColumn = wb.Sheets(3).Cells(4, Columns.Count).End(xlToLeft).Column 
wb.Sheets(3).Range(Cells(4, LastColumn + 1), Cells(LastRow, LastColumn + 1)) = wb.Sheets(3).Name 

Antwort

2

Hier ist sie:

Sub Create_Reports_NEWWWW() 
Application.ScreenUpdating = False 

Dim wb As Workbook 
Dim lastRow As Integer 
Dim lastColumn As Integer 

Set wb = ActiveWorkbook 

With wb.Sheets(1) 
'copy sheet name to right of raw data on each sheet 
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row 
lastColumn = .Cells(4, .Columns.Count).End(xlToLeft).Column 
.Range(.Cells(4, lastColumn + 1), .Cells(lastRow, lastColumn + 1)) = .Name 
End With 

With wb.Sheets(2) 
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row 
lastColumn = .Cells(4, .Columns.Count).End(xlToLeft).Column 
.Range(.Cells(4, lastColumn + 1), .Cells(lastRow, lastColumn + 1)) = .Name 
End With 

With wb.Sheets(3) 
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row 
lastColumn = .Cells(4, .Columns.Count).End(xlToLeft).Column 
.Range(.Cells(4, lastColumn + 1), .Cells(lastRow, lastColumn + 1)) = .Name 
End With 

End Sub 

Sie nicht Cells auf nicht-aktiven Arbeitsblätter verwenden können. Sie müssen wb.Sheets(2).Cells(x,y) verwenden

Die With-Blöcke in diesem Code sind nur da für platzsparend. Jede .Range oder .Cells bezieht sich auf die z.B. wb.Sheets(1) und könnte als wb.Sheets(1).Cells(x,y)..

Und btw zu sehen: es ist sehr gut, mit Select und Activate zu stoppen, sollten Sie auch ActiveWorkbook oder ActiveWorksheet vermeiden. Es ist sehr unzuverlässig und Sie werden nie wissen, was Benutzer tun werden. ;)

HTH

+1

++ Sie haben Recht. Ich würde auch empfehlen, die DOTS vor Zeilen und Spalten hinzuzufügen. –

+0

Richtig, danke. Bearbeitete sie in. –

+0

Weil ich weiß. : P Willst du, dass ich es erkläre? ;) –

Verwandte Themen