VBA-copy all worksheets except three specific ones
Hi. I have a wb with 20 sheets. I need to copy the data ranges from the first 17, but not the last 3, "Create File", "Pull" and "Save as DIF". The data will be pasted on a new sheet named "Target" created by the code. The code below does everything I want it to EXCEPT it also copies and pastes the three sheets above. How can I modify the code to exclude these three sheets?
Thank you. Code:
Sub CombineSheets() |
VBA-copy all worksheets except three specific ones
If the three sheets plus Target sheet are at the end as you state, try
this............ For i = 1 To SheetCnt - 4 Gord |
VBA-copy all worksheets except three specific ones
I suggest a different approach...
a. Put the sheetnames that are NOT to be copied in a delimited string and store that in a constant in your procedu Const sSheetsNotToCopy$ = "Create File,Pull,Save as DIF,Target" b. Use a variable to ref the new target sheet: Dim wksTarget As Worksheet Set wksTarget = Sheets.Add After:=Sheets(ActiveWorkbook.Sheets.Count) wksTarget.Name = "Target" c. Iterate the worksheets and process them: Dim wks As Worksheet, rngDataToCopy As Range, rngTarget As Range Dim lLastRow&, lLastCol& Const lStartRow& = 7 '1st row containing data on source sheets For Each wks in ActiveWorkbook.Worksheets If Not InStr(sSheetsNotToCopy, wks.Name) 0 Then 'Here's where you copy the data to wksTarget 'I suggest you use a consistent method to find the last row of 'each sheet to be copied, so as not to hard-code the # of rows. 'Get the range of data lLastRow = wks.Cells(wks.Rows.Count, "A").End(xlUp).Row lLastCol = wks.Cells(5, wks.Columns.Count(.End(xlToLeft).Column 'The above assumes data starts same row on every source sheet. 'Copy the data to wksTarget on the next blank row '(Assumes first row only is blank, or has/will have headings) Set rngTarget = _ wksTarget.Range("A" & wksTarget.UsedRange.Rows.Count + 1) wks.Range("A" & lStartRow, wks.Cells(lLastRow, lLastCol).Copy _ Destination:=rngTarget End If Next 'wks d. After data is copied you can set your column widths. With wksTarget: .Columns.AutoFit: .Cells(1, 1).Select: End With Note that wksTarget became the active sheet when it was added, and remaines the active sheet throughout the process. This means the only UI setting you need to toggle is ScreenUpdating since there's no selecting going on during the procedure. -- Garry Free usenet access at http://www.eternal-september.org ClassicVB Users Regroup! comp.lang.basic.visual.misc microsoft.public.vb.general.discussion |
VBA-copy all worksheets except three specific ones
I was originally intending to write the loop as follows for better
clarit... Dim wks As Worksheet, rngDataToCopy As Range, rngTarget As Range Dim lLastRow&, lLastCol& Const lStartRow& = 7 '1st row containing data on source sheets For Each wks in ActiveWorkbook.Worksheets If Not InStr(sSheetsNotToCopy, wks.Name) 0 Then 'Here's where you copy the data to wksTarget 'I suggest you use a consistent method to find the last row of 'each sheet to be copied, so as not to hard-code the # of rows. 'Get the range of data lLastRow = wks.Cells(wks.Rows.Count, "A").End(xlUp).Row lLastCol = wks.Cells(5, wks.Columns.Count(.End(xlToLeft).Column 'The above assumes data starts same row on every source sheet. 'Copy the data to wksTarget on the next blank row '(Assumes first row only is blank, or has/will have headings) Set rngTarget = _ wksTarget.Range("A" & wksTarget.UsedRange.Rows.Count + 1) Set rngDataToCopy = _ wks.Range("A" & lStartRow, wks.Cells(lLastRow, lLastCol) rngDataToCopy.Copy Destination:=rngTarget End If Next 'wks -- Garry Free usenet access at http://www.eternal-september.org ClassicVB Users Regroup! comp.lang.basic.visual.misc microsoft.public.vb.general.discussion |
VBA-copy all worksheets except three specific ones
After serious thinking I realize I'm missing a closing parenthesis
Dim wks As Worksheet, rngDataToCopy As Range, rngTarget As Range Dim lLastRow&, lLastCol& Const lStartRow& = 7 '1st row containing data on source sheets For Each wks in ActiveWorkbook.Worksheets If Not InStr(sSheetsNotToCopy, wks.Name) 0 Then 'Here's where you copy the data to wksTarget 'I suggest you use a consistent method to find the last row of 'each sheet to be copied, so as not to hard-code the # of rows. 'Get the range of data lLastRow = wks.Cells(wks.Rows.Count, "A").End(xlUp).Row lLastCol = wks.Cells(5, wks.Columns.Count(.End(xlToLeft).Column 'The above assumes data starts same row on every source sheet. 'Copy the data to wksTarget on the next blank row '(Assumes first row only is blank, or has/will have headings) Set rngTarget = _ wksTarget.Range("A" & wksTarget.UsedRange.Rows.Count + 1) Set rngDataToCopy = _ wks.Range("A" & lStartRow, wks.Cells(lLastRow, lLastCol)) rngDataToCopy.Copy Destination:=rngTarget End If Next 'wks -- Garry Free usenet access at http://www.eternal-september.org ClassicVB Users Regroup! comp.lang.basic.visual.misc microsoft.public.vb.general.discussion |
Quote:
Gord, your code worked perfectly. I had miscounted the number of sheets, but when I changed the -4 to -3 it did exactly what I wanted it to do. I added: Code:
For i = 1 To(SheetCnt -3) Code:
If ws1.Name < "Pull" Then |
All times are GMT +1. The time now is 08:53 PM. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
ExcelBanter.com