Creating New Workbook from Sheet

  • Thread starter Ozzie via OfficeKB.com
  • Start date
O

Ozzie via OfficeKB.com

Hi, any help with the following would be really appreciated,

I have some VB Code, which works well, that for each change in a value in
column A creates a new sheet. However what I now need to do is to either;

a) create a new workbook for each of the newly created workshets, or
b) instead of creating a new sheet to directly create a workbook,

the ultimate end goal is to automatically email these workbooks or sheets.

my code for creating a new worksheet is

Sub create_new_sheets()
Dim CalcMode As Long
Dim ws1 As Worksheet
Dim WSNew As Worksheet
Dim rng As Range
Dim cell As Range
Dim lrow As Long

Set ws1 = Sheets("Sheet1")
Set rng = ws1.Range("A1:z10000").CurrentRegion

With Application
CalcMode = .Calculation
.Calculation = xlCalculationAutomatic
.ScreenUpdating = False
End With

With ws1
rng.Columns(1).AdvancedFilter _
Action:=xlFilterCopy, _
CopyToRange:=.Range("IV1"), Unique:=True
lrow = .Cells(Rows.Count, "IV").End(xlUp).Row
.Range("IU1").Value = .Range("IV1").Value

For Each cell In .Range("IV2:IV" & lrow)
.Range("IU2").Value = cell.Value
Set WSNew = Sheets.Add
On Error Resume Next
WSNew.Name = cell.Value
If Err.Number > 0 Then
MsgBox "Change the name of : " & WSNew.Name & " manually"
Err.Clear
End If
On Error GoTo 0
rng.AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=.Range("IU1:IU2"), _
CopyToRange:=WSNew.Range("A1"), _
Unique:=False

Cells.Select
With Selection
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Range("A1").Select

WSNew.Columns.AutoFit
WSNew.Range("A1:A6").EntireRow.Insert
WSNew.Range("A7:C8").Copy WSNew.Range("D3")
WSNew.Columns("A:C").Delete
WSNew.Columns("A").AutoFit

End Sub

Many thanks
 
G

Gord Dibben

Since you have already created the sheets you can run this macro to save
each sheet as its own workbook.

Sub Make_New_Books()
Dim w As Worksheet
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For Each w In ActiveWorkbook.Worksheets
w.Copy
With ActiveWorkbook
.SaveAs FileName:=ThisWorkbook.Path _
& "\" & w.Name & ".xlsx"
.Close
End With
Next w
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Or see Ron de Bruin's site for code to create new workbooks directly from
unique values.

http://www.rondebruin.nl/copy5.htm


Gord Dibben MS Excel MVP
 
O

Ozzie via OfficeKB.com

Ron said:
Try this example
http://www.rondebruin.nl/copy5_3.htm
Hi, any help with the following would be really appreciated,
[quoted text clipped - 68 lines]
Many thanks

Many thanks for all responses,

Ron,

Many thanks for your speedy response, the example spreadsheet with the code
that saves the workbooks into a folder and then creates a hyperlink is really
'spot on' and is something I hadn't considered. This is really efficient and
gets me around any company email limits!,

Thanks alot
 
R

Ron de Bruin

Gord look out with your code example
This will not work correct if the default save format in 2007 is not xlsx
 
R

Ron de Bruin

Hi Ozzie

You are welcome
See also the links to the mail examples if you want to do it in one step

--

Regards Ron de Bruin
http://www.rondebruin.nl/tips.htm


Ozzie via OfficeKB.com said:
Ron said:
Try this example
http://www.rondebruin.nl/copy5_3.htm
Hi, any help with the following would be really appreciated,
[quoted text clipped - 68 lines]
Many thanks

Many thanks for all responses,

Ron,

Many thanks for your speedy response, the example spreadsheet with the code
that saves the workbooks into a folder and then creates a hyperlink is really
'spot on' and is something I hadn't considered. This is really efficient and
gets me around any company email limits!,

Thanks alot
 
O

Ozzie via OfficeKB.com

Ron said:
Gord look out with your code example
This will not work correct if the default save format in 2007 is not xlsx
Since you have already created the sheets you can run this macro to save
each sheet as its own workbook.
[quoted text clipped - 94 lines]

Ron,

Its OK as I am using XL2003. One quick question though, another step, and
final step, would be to add two sheets to the new workbook instead of one.

The first sheet would have the new copied data (already done by you earlier),
the second sheet would need to have a pivot table created that linked to
sheet 1.

I don't suppose you could help with this also could you?,

many thanks
 
R

Ron de Bruin

When the code create the workbook you can add another sheet and create the pivot also with code
before you save the file.

Bedtime for me now but I will help tomorrow with the code


--

Regards Ron de Bruin
http://www.rondebruin.nl/tips.htm


Ozzie via OfficeKB.com said:
Ron said:
Gord look out with your code example
This will not work correct if the default save format in 2007 is not xlsx
Since you have already created the sheets you can run this macro to save
each sheet as its own workbook.
[quoted text clipped - 94 lines]
Many thanks

Ron,

Its OK as I am using XL2003. One quick question though, another step, and
final step, would be to add two sheets to the new workbook instead of one.

The first sheet would have the new copied data (already done by you earlier),
the second sheet would need to have a pivot table created that linked to
sheet 1.

I don't suppose you could help with this also could you?,

many thanks
 
O

Ozzie via OfficeKB.com

Ron said:
Ok try this changed macro from the example workbook that add a extra sheet

Where it say

'Do stuff on the second sheet
SecondSh.Range("A1").Value = "place code here to do what you want"

Add code to do what you want on that sheet

The best thing is to record a macro when you do the steps manual.
Then you have the basic code that you can add to the macro

Sub Copy_To_Workbooks()
'Note: This macro use the function LastRow
Dim My_Range As Range
Dim FieldNum As Long
Dim FileExtStr As String
Dim FileFormatNum As Long
Dim CalcMode As Long
Dim ViewMode As Long
Dim ws2 As Worksheet
Dim MyPath As String
Dim foldername As String
Dim Lrow As Long
Dim cell As Range
Dim CCount As Long
Dim WSNew As Worksheet
Dim ErrNum As Long
Dim SecondSh As Worksheet

'Set filter range on ActiveSheet: A11 is the top left cell of your filter range
'and the header of the first column, D is the last column in the filter range.
'You can also add the sheet name to the code like this :
'Worksheets("Sheet1").Range("A11:D" & LastRow(Worksheets("Sheet1")))
'No need that the sheet is active then when you run the macro when you use this.
Set My_Range = Range("A11:D" & LastRow(ActiveSheet))
My_Range.Parent.Select

If ActiveWorkbook.ProtectStructure = True Or _
My_Range.Parent.ProtectContents = True Then
MsgBox "Sorry, not working when the workbook or worksheet is protected", _
vbOKOnly, "Copy to new workbook"
Exit Sub
End If

'This example filters on the first column in the range(change the field if needed)
'In this case the range starts in A so Field:=1 is column A, 2 = column B, ......
FieldNum = 1

'Turn off AutoFilter
My_Range.Parent.AutoFilterMode = False

'Set the file extension/format
If Val(Application.Version) < 12 Then
'You use Excel 97-2003
FileExtStr = ".xls": FileFormatNum = -4143
Else
'You use Excel 2007
If ActiveWorkbook.FileFormat = 56 Then
FileExtStr = ".xls": FileFormatNum = 56
Else
FileExtStr = ".xlsx": FileFormatNum = 51
End If
End If

'Change ScreenUpdating, Calculation, EnableEvents, ....
With Application
CalcMode = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
.EnableEvents = False
End With
ViewMode = ActiveWindow.View
ActiveWindow.View = xlNormalView
ActiveSheet.DisplayPageBreaks = False

'Delete the sheet RDBLogSheet if it exists
On Error Resume Next
Application.DisplayAlerts = False
Sheets("RDBLogSheet").Delete
Application.DisplayAlerts = True
On Error GoTo 0

' Add worksheet to copy/Paste the unique list
Set ws2 = Worksheets.Add(After:=Sheets(Sheets.Count))
ws2.Name = "RDBLogSheet"

'Fill in the path\folder where you want the new folder with the files
'you can use also this "C:\Users\Ron\test"
MyPath = Application.DefaultFilePath

'Add a slash at the end if the user forget it
If Right(MyPath, 1) <> "\" Then
MyPath = MyPath & "\"
End If

'Create folder for the new files
foldername = MyPath & Format(Now, "yyyy-mm-dd hh-mm-ss") & "\"
MkDir foldername

With ws2
'first we copy the Unique data from the filter field to ws2
My_Range.Columns(FieldNum).AdvancedFilter _
Action:=xlFilterCopy, _
CopyToRange:=.Range("A3"), Unique:=True

'loop through the unique list in ws2 and filter/copy to a new sheet
Lrow = .Cells(Rows.Count, "A").End(xlUp).Row
For Each cell In .Range("A4:A" & Lrow)

'Filter the range
My_Range.AutoFilter Field:=FieldNum, Criteria1:="=" & _
Replace(Replace(Replace(cell.Value, "~", "~~"), "*", "~*"), "?", "~?")

'Check if there are no more then 8192 areas(limit of areas)
CCount = 0
On Error Resume Next
CCount = My_Range.Columns(1).SpecialCells(xlCellTypeVisible) _
.Areas(1).Cells.Count
On Error GoTo 0
If CCount = 0 Then
MsgBox "There are more than 8192 areas for the value : " & cell.Value _
& vbNewLine & "It is not possible to copy the visible data." _
& vbNewLine & "Tip: Sort your data before you use this macro.", _
vbOKOnly, "Split in worksheets"
Else
'Add new workbook with one sheet
Set WSNew = Workbooks.Add(xlWBATWorksheet).Worksheets(1)
Set SecondSh = Worksheets.Add
SecondSh.Name = "MySecondSheet"
WSNew.Activate

'Do stuff on the second sheet
SecondSh.Range("A1").Value = "place code here to do what you want"

'Copy/paste the visible data to the new workbook
My_Range.SpecialCells(xlCellTypeVisible).Copy
With WSNew.Range("A1")
' Paste:=8 will copy the columnwidth in Excel 2000 and higher
' Remove this line if you use Excel 97
.PasteSpecial Paste:=8
.PasteSpecial xlPasteValues
.PasteSpecial xlPasteFormats
Application.CutCopyMode = False
.Select
End With

'Save the file in the new folder and close it
On Error Resume Next
WSNew.Parent.SaveAs foldername & _
cell.Value & FileExtStr, FileFormatNum
If Err.Number > 0 Then
Err.Clear
ErrNum = ErrNum + 1

WSNew.Parent.SaveAs foldername & _
"Error_" & Format(ErrNum, "0000") & FileExtStr, FileFormatNum

.Cells(cell.Row, "B").Formula = "=Hyperlink(""" & foldername & _
"Error_" & Format(ErrNum, "0000") & FileExtStr & """)"

.Cells(cell.Row, "A").Interior.Color = vbRed
Else
.Cells(cell.Row, "B").Formula = _
"=Hyperlink(""" & foldername & cell.Value & FileExtStr & """)"
End If

WSNew.Parent.Close False
On Error GoTo 0
End If

'Show all the data in the range
My_Range.AutoFilter Field:=FieldNum

Next cell
.Cells(1, "A").Value = "Red cell: can't use the Unique name as file name"
.Cells(1, "B").Value = "Created Files (Click on the link to open a file)"
.Cells(3, "A").Value = "Unique Values"
.Cells(3, "B").Value = "Full Path and File name"
.Cells(3, "A").Font.Bold = True
.Cells(3, "B").Font.Bold = True
.Columns("A:B").AutoFit

End With

'Turn off AutoFilter
My_Range.Parent.AutoFilterMode = False

If ErrNum > 0 Then
MsgBox "Rename every WorkSheet name that start with ""Error_"" manually" _
& vbNewLine & "There are characters in the name that are not allowed" _
& vbNewLine & "in a sheet name or the worksheet already exist."
End If

'Restore ScreenUpdating, Calculation, EnableEvents, ....
My_Range.Parent.Select
ActiveWindow.View = ViewMode
ws2.Select
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = CalcMode
End With

End Sub
[quoted text clipped - 17 lines]


Ron,

Many thanks for taking the time to help with my code, its works great,

thanks again
 
O

Ozzie via OfficeKB.com

Ron said:
Ok try this changed macro from the example workbook that add a extra sheet

Where it say

'Do stuff on the second sheet
SecondSh.Range("A1").Value = "place code here to do what you want"

Add code to do what you want on that sheet

The best thing is to record a macro when you do the steps manual.
Then you have the basic code that you can add to the macro

Sub Copy_To_Workbooks()


Ron,

I have created the additional code to place on the 'second sheet' however it
keeps failing and I can't see why, any ideas?

'Do stuff on the second sheet
'SecondSh.Range("A1").Value
Sheets("MySecondSheet").Select
Range("A1").Select
ActiveSheet.PivotCaches.Add(SourceType:=xlDatabase,
SourceData:= _
"sheet1!R1C1:R405C8").CreatePivotTable TableDestination:= _
"'[Cleaning - Repair.xls]MySecondSheet'!R6C2", TableName:
="PivotTable3", _
DefaultVersion:=xlPivotTableVersion10
ActiveSheet.PivotTables("PivotTable3").AddFields RowFields:
="Material", _
ColumnFields:="Scanner Move"
With ActiveSheet.PivotTables("PivotTable3").PivotFields("PUK")
.Orientation = xlDataField
.Caption = "Count of PUK"
.Function = xlCount
.NumberFormat = "#,##0"
End With
Range("B2").Select
ActiveCell.FormulaR1C1 = "Report Heading"
Range("A6").Select
ActiveWindow.FreezePanes = True

'Note: This macro use the function LastRow
Dim My_Range As Range
Dim FieldNum As Long
Dim FileExtStr As String
Dim FileFormatNum As Long
Dim CalcMode As Long
Dim ViewMode As Long
Dim ws2 As Worksheet
Dim MyPath As String
Dim foldername As String
Dim Lrow As Long
Dim cell As Range
Dim CCount As Long
Dim WSNew As Worksheet
Dim ErrNum As Long
Dim SecondSh As Worksheet

'Set filter range on ActiveSheet: A11 is the top left cell of your filter range
'and the header of the first column, D is the last column in the filter range.
'You can also add the sheet name to the code like this :
'Worksheets("Sheet1").Range("A11:D" & LastRow(Worksheets("Sheet1")))
'No need that the sheet is active then when you run the macro when you use this.
Set My_Range = Range("A11:D" & LastRow(ActiveSheet))
My_Range.Parent.Select

If ActiveWorkbook.ProtectStructure = True Or _
My_Range.Parent.ProtectContents = True Then
MsgBox "Sorry, not working when the workbook or worksheet is protected", _
vbOKOnly, "Copy to new workbook"
Exit Sub
End If

'This example filters on the first column in the range(change the field if needed)
'In this case the range starts in A so Field:=1 is column A, 2 = column B, ......
FieldNum = 1

'Turn off AutoFilter
My_Range.Parent.AutoFilterMode = False

'Set the file extension/format
If Val(Application.Version) < 12 Then
'You use Excel 97-2003
FileExtStr = ".xls": FileFormatNum = -4143
Else
'You use Excel 2007
If ActiveWorkbook.FileFormat = 56 Then
FileExtStr = ".xls": FileFormatNum = 56
Else
FileExtStr = ".xlsx": FileFormatNum = 51
End If
End If

'Change ScreenUpdating, Calculation, EnableEvents, ....
With Application
CalcMode = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
.EnableEvents = False
End With
ViewMode = ActiveWindow.View
ActiveWindow.View = xlNormalView
ActiveSheet.DisplayPageBreaks = False

'Delete the sheet RDBLogSheet if it exists
On Error Resume Next
Application.DisplayAlerts = False
Sheets("RDBLogSheet").Delete
Application.DisplayAlerts = True
On Error GoTo 0

' Add worksheet to copy/Paste the unique list
Set ws2 = Worksheets.Add(After:=Sheets(Sheets.Count))
ws2.Name = "RDBLogSheet"

'Fill in the path\folder where you want the new folder with the files
'you can use also this "C:\Users\Ron\test"
MyPath = Application.DefaultFilePath

'Add a slash at the end if the user forget it
If Right(MyPath, 1) <> "\" Then
MyPath = MyPath & "\"
End If

'Create folder for the new files
foldername = MyPath & Format(Now, "yyyy-mm-dd hh-mm-ss") & "\"
MkDir foldername

With ws2
'first we copy the Unique data from the filter field to ws2
My_Range.Columns(FieldNum).AdvancedFilter _
Action:=xlFilterCopy, _
CopyToRange:=.Range("A3"), Unique:=True

'loop through the unique list in ws2 and filter/copy to a new sheet
Lrow = .Cells(Rows.Count, "A").End(xlUp).Row
For Each cell In .Range("A4:A" & Lrow)

'Filter the range
My_Range.AutoFilter Field:=FieldNum, Criteria1:="=" & _
Replace(Replace(Replace(cell.Value, "~", "~~"), "*", "~*"), "?", "~?")

'Check if there are no more then 8192 areas(limit of areas)
CCount = 0
On Error Resume Next
CCount = My_Range.Columns(1).SpecialCells(xlCellTypeVisible) _
.Areas(1).Cells.Count
On Error GoTo 0
If CCount = 0 Then
MsgBox "There are more than 8192 areas for the value : " & cell.Value _
& vbNewLine & "It is not possible to copy the visible data." _
& vbNewLine & "Tip: Sort your data before you use this macro.", _
vbOKOnly, "Split in worksheets"
Else
'Add new workbook with one sheet
Set WSNew = Workbooks.Add(xlWBATWorksheet).Worksheets(1)
Set SecondSh = Worksheets.Add
SecondSh.Name = "MySecondSheet"
WSNew.Activate

'Do stuff on the second sheet
SecondSh.Range("A1").Value = "place code here to do what you want"

'Copy/paste the visible data to the new workbook
My_Range.SpecialCells(xlCellTypeVisible).Copy
With WSNew.Range("A1")
' Paste:=8 will copy the columnwidth in Excel 2000 and higher
' Remove this line if you use Excel 97
.PasteSpecial Paste:=8
.PasteSpecial xlPasteValues
.PasteSpecial xlPasteFormats
Application.CutCopyMode = False
.Select
End With

'Save the file in the new folder and close it
On Error Resume Next
WSNew.Parent.SaveAs foldername & _
cell.Value & FileExtStr, FileFormatNum
If Err.Number > 0 Then
Err.Clear
ErrNum = ErrNum + 1

WSNew.Parent.SaveAs foldername & _
"Error_" & Format(ErrNum, "0000") & FileExtStr, FileFormatNum

.Cells(cell.Row, "B").Formula = "=Hyperlink(""" & foldername & _
"Error_" & Format(ErrNum, "0000") & FileExtStr & """)"

.Cells(cell.Row, "A").Interior.Color = vbRed
Else
.Cells(cell.Row, "B").Formula = _
"=Hyperlink(""" & foldername & cell.Value & FileExtStr & """)"
End If

WSNew.Parent.Close False
On Error GoTo 0
End If

'Show all the data in the range
My_Range.AutoFilter Field:=FieldNum

Next cell
.Cells(1, "A").Value = "Red cell: can't use the Unique name as file name"
.Cells(1, "B").Value = "Created Files (Click on the link to open a file)"
.Cells(3, "A").Value = "Unique Values"
.Cells(3, "B").Value = "Full Path and File name"
.Cells(3, "A").Font.Bold = True
.Cells(3, "B").Font.Bold = True
.Columns("A:B").AutoFit

End With

'Turn off AutoFilter
My_Range.Parent.AutoFilterMode = False

If ErrNum > 0 Then
MsgBox "Rename every WorkSheet name that start with ""Error_"" manually" _
& vbNewLine & "There are characters in the name that are not allowed" _
& vbNewLine & "in a sheet name or the worksheet already exist."
End If

'Restore ScreenUpdating, Calculation, EnableEvents, ....
My_Range.Parent.Select
ActiveWindow.View = ViewMode
ws2.Select
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = CalcMode
End With

End Sub
[quoted text clipped - 17 lines]
 
R

Ron de Bruin

Hi Ozzie

Delete the two lines in the macro i posted

'Do stuff on the second sheet
SecondSh.Range("A1").Value = "place code here to do what you want"

Then after the do the paste part I add my code (the pivot must use that data so we must paste the data first)
I not add all your code, but test this first to see if it is working
See that I not hardcode the ranges in this example

'Copy/paste the visible data to the new workbook
My_Range.SpecialCells(xlCellTypeVisible).Copy
With WSNew.Range("A1")
' Paste:=8 will copy the columnwidth in Excel 2000 and higher
' Remove this line if you use Excel 97
.PasteSpecial Paste:=8
.PasteSpecial xlPasteValues
.PasteSpecial xlPasteFormats
Application.CutCopyMode = False
.Select
End With

'Do stuff on the second sheet
SecondSh.Select
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
WSNew.UsedRange, Version:=xlPivotTableVersion10).CreatePivotTable _
TableDestination:=SecondSh.Range("A1"), TableName:="PivotTable3", DefaultVersion _
:=xlPivotTableVersion10



--

Regards Ron de Bruin
http://www.rondebruin.nl/tips.htm


Ozzie via OfficeKB.com said:
Ron said:
Ok try this changed macro from the example workbook that add a extra sheet

Where it say

'Do stuff on the second sheet
SecondSh.Range("A1").Value = "place code here to do what you want"

Add code to do what you want on that sheet

The best thing is to record a macro when you do the steps manual.
Then you have the basic code that you can add to the macro

Sub Copy_To_Workbooks()


Ron,

I have created the additional code to place on the 'second sheet' however it
keeps failing and I can't see why, any ideas?

'Do stuff on the second sheet
'SecondSh.Range("A1").Value
Sheets("MySecondSheet").Select
Range("A1").Select
ActiveSheet.PivotCaches.Add(SourceType:=xlDatabase,
SourceData:= _
"sheet1!R1C1:R405C8").CreatePivotTable TableDestination:= _
"'[Cleaning - Repair.xls]MySecondSheet'!R6C2", TableName:
="PivotTable3", _
DefaultVersion:=xlPivotTableVersion10
ActiveSheet.PivotTables("PivotTable3").AddFields RowFields:
="Material", _
ColumnFields:="Scanner Move"
With ActiveSheet.PivotTables("PivotTable3").PivotFields("PUK")
.Orientation = xlDataField
.Caption = "Count of PUK"
.Function = xlCount
.NumberFormat = "#,##0"
End With
Range("B2").Select
ActiveCell.FormulaR1C1 = "Report Heading"
Range("A6").Select
ActiveWindow.FreezePanes = True

'Note: This macro use the function LastRow
Dim My_Range As Range
Dim FieldNum As Long
Dim FileExtStr As String
Dim FileFormatNum As Long
Dim CalcMode As Long
Dim ViewMode As Long
Dim ws2 As Worksheet
Dim MyPath As String
Dim foldername As String
Dim Lrow As Long
Dim cell As Range
Dim CCount As Long
Dim WSNew As Worksheet
Dim ErrNum As Long
Dim SecondSh As Worksheet

'Set filter range on ActiveSheet: A11 is the top left cell of your filter range
'and the header of the first column, D is the last column in the filter range.
'You can also add the sheet name to the code like this :
'Worksheets("Sheet1").Range("A11:D" & LastRow(Worksheets("Sheet1")))
'No need that the sheet is active then when you run the macro when you use this.
Set My_Range = Range("A11:D" & LastRow(ActiveSheet))
My_Range.Parent.Select

If ActiveWorkbook.ProtectStructure = True Or _
My_Range.Parent.ProtectContents = True Then
MsgBox "Sorry, not working when the workbook or worksheet is protected", _
vbOKOnly, "Copy to new workbook"
Exit Sub
End If

'This example filters on the first column in the range(change the field if needed)
'In this case the range starts in A so Field:=1 is column A, 2 = column B, ......
FieldNum = 1

'Turn off AutoFilter
My_Range.Parent.AutoFilterMode = False

'Set the file extension/format
If Val(Application.Version) < 12 Then
'You use Excel 97-2003
FileExtStr = ".xls": FileFormatNum = -4143
Else
'You use Excel 2007
If ActiveWorkbook.FileFormat = 56 Then
FileExtStr = ".xls": FileFormatNum = 56
Else
FileExtStr = ".xlsx": FileFormatNum = 51
End If
End If

'Change ScreenUpdating, Calculation, EnableEvents, ....
With Application
CalcMode = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
.EnableEvents = False
End With
ViewMode = ActiveWindow.View
ActiveWindow.View = xlNormalView
ActiveSheet.DisplayPageBreaks = False

'Delete the sheet RDBLogSheet if it exists
On Error Resume Next
Application.DisplayAlerts = False
Sheets("RDBLogSheet").Delete
Application.DisplayAlerts = True
On Error GoTo 0

' Add worksheet to copy/Paste the unique list
Set ws2 = Worksheets.Add(After:=Sheets(Sheets.Count))
ws2.Name = "RDBLogSheet"

'Fill in the path\folder where you want the new folder with the files
'you can use also this "C:\Users\Ron\test"
MyPath = Application.DefaultFilePath

'Add a slash at the end if the user forget it
If Right(MyPath, 1) <> "\" Then
MyPath = MyPath & "\"
End If

'Create folder for the new files
foldername = MyPath & Format(Now, "yyyy-mm-dd hh-mm-ss") & "\"
MkDir foldername

With ws2
'first we copy the Unique data from the filter field to ws2
My_Range.Columns(FieldNum).AdvancedFilter _
Action:=xlFilterCopy, _
CopyToRange:=.Range("A3"), Unique:=True

'loop through the unique list in ws2 and filter/copy to a new sheet
Lrow = .Cells(Rows.Count, "A").End(xlUp).Row
For Each cell In .Range("A4:A" & Lrow)

'Filter the range
My_Range.AutoFilter Field:=FieldNum, Criteria1:="=" & _
Replace(Replace(Replace(cell.Value, "~", "~~"), "*", "~*"), "?", "~?")

'Check if there are no more then 8192 areas(limit of areas)
CCount = 0
On Error Resume Next
CCount = My_Range.Columns(1).SpecialCells(xlCellTypeVisible) _
.Areas(1).Cells.Count
On Error GoTo 0
If CCount = 0 Then
MsgBox "There are more than 8192 areas for the value : " & cell.Value _
& vbNewLine & "It is not possible to copy the visible data." _
& vbNewLine & "Tip: Sort your data before you use this macro.", _
vbOKOnly, "Split in worksheets"
Else
'Add new workbook with one sheet
Set WSNew = Workbooks.Add(xlWBATWorksheet).Worksheets(1)
Set SecondSh = Worksheets.Add
SecondSh.Name = "MySecondSheet"
WSNew.Activate

'Do stuff on the second sheet
SecondSh.Range("A1").Value = "place code here to do what you want"

'Copy/paste the visible data to the new workbook
My_Range.SpecialCells(xlCellTypeVisible).Copy
With WSNew.Range("A1")
' Paste:=8 will copy the columnwidth in Excel 2000 and higher
' Remove this line if you use Excel 97
.PasteSpecial Paste:=8
.PasteSpecial xlPasteValues
.PasteSpecial xlPasteFormats
Application.CutCopyMode = False
.Select
End With

'Save the file in the new folder and close it
On Error Resume Next
WSNew.Parent.SaveAs foldername & _
cell.Value & FileExtStr, FileFormatNum
If Err.Number > 0 Then
Err.Clear
ErrNum = ErrNum + 1

WSNew.Parent.SaveAs foldername & _
"Error_" & Format(ErrNum, "0000") & FileExtStr, FileFormatNum

.Cells(cell.Row, "B").Formula = "=Hyperlink(""" & foldername & _
"Error_" & Format(ErrNum, "0000") & FileExtStr & """)"

.Cells(cell.Row, "A").Interior.Color = vbRed
Else
.Cells(cell.Row, "B").Formula = _
"=Hyperlink(""" & foldername & cell.Value & FileExtStr & """)"
End If

WSNew.Parent.Close False
On Error GoTo 0
End If

'Show all the data in the range
My_Range.AutoFilter Field:=FieldNum

Next cell
.Cells(1, "A").Value = "Red cell: can't use the Unique name as file name"
.Cells(1, "B").Value = "Created Files (Click on the link to open a file)"
.Cells(3, "A").Value = "Unique Values"
.Cells(3, "B").Value = "Full Path and File name"
.Cells(3, "A").Font.Bold = True
.Cells(3, "B").Font.Bold = True
.Columns("A:B").AutoFit

End With

'Turn off AutoFilter
My_Range.Parent.AutoFilterMode = False

If ErrNum > 0 Then
MsgBox "Rename every WorkSheet name that start with ""Error_"" manually" _
& vbNewLine & "There are characters in the name that are not allowed" _
& vbNewLine & "in a sheet name or the worksheet already exist."
End If

'Restore ScreenUpdating, Calculation, EnableEvents, ....
My_Range.Parent.Select
ActiveWindow.View = ViewMode
ws2.Select
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = CalcMode
End With

End Sub
[quoted text clipped - 17 lines]
Many thanks
 
O

Ozzie via OfficeKB.com

Ron said:
Hi Ozzie

Delete the two lines in the macro i posted

'Do stuff on the second sheet
SecondSh.Range("A1").Value = "place code here to do what you want"

Then after the do the paste part I add my code (the pivot must use that data so we must paste the data first)
I not add all your code, but test this first to see if it is working
See that I not hardcode the ranges in this example

'Copy/paste the visible data to the new workbook
My_Range.SpecialCells(xlCellTypeVisible).Copy
With WSNew.Range("A1")
' Paste:=8 will copy the columnwidth in Excel 2000 and higher
' Remove this line if you use Excel 97
.PasteSpecial Paste:=8
.PasteSpecial xlPasteValues
.PasteSpecial xlPasteFormats
Application.CutCopyMode = False
.Select
End With

'Do stuff on the second sheet
SecondSh.Select
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
WSNew.UsedRange, Version:=xlPivotTableVersion10).CreatePivotTable _
TableDestination:=SecondSh.Range("A1"), TableName:="PivotTable3", DefaultVersion _
:=xlPivotTableVersion10
Ok try this changed macro from the example workbook that add a extra sheet
[quoted text clipped - 237 lines]

Many thanks

Ron,

Yes the code, copy, works fine but fails when it gets to the following;

ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase,
SourceData:= _
WSNew.UsedRange, Version:=xlPivotTableVersion10).
CreatePivotTable _
TableDestination:=SecondSh.Range("A1"), TableName:
="PivotTable3", DefaultVersion _
:=xlPivotTableVersion10

it just doesn't like the creating of the pivot
 
R

Ron de Bruin

This is working in 2003

ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
WSNew.UsedRange).CreatePivotTable TableDestination:= _
SecondSh.Range("A1"), TableName:="PivotTable2", DefaultVersion:= _
xlPivotTableVersion10


--

Regards Ron de Bruin
http://www.rondebruin.nl/tips.htm


Ozzie via OfficeKB.com said:
Ron said:
Hi Ozzie

Delete the two lines in the macro i posted

'Do stuff on the second sheet
SecondSh.Range("A1").Value = "place code here to do what you want"

Then after the do the paste part I add my code (the pivot must use that data so we must paste the data first)
I not add all your code, but test this first to see if it is working
See that I not hardcode the ranges in this example

'Copy/paste the visible data to the new workbook
My_Range.SpecialCells(xlCellTypeVisible).Copy
With WSNew.Range("A1")
' Paste:=8 will copy the columnwidth in Excel 2000 and higher
' Remove this line if you use Excel 97
.PasteSpecial Paste:=8
.PasteSpecial xlPasteValues
.PasteSpecial xlPasteFormats
Application.CutCopyMode = False
.Select
End With

'Do stuff on the second sheet
SecondSh.Select
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
WSNew.UsedRange, Version:=xlPivotTableVersion10).CreatePivotTable _
TableDestination:=SecondSh.Range("A1"), TableName:="PivotTable3", DefaultVersion
_

:=xlPivotTableVersion10
Ok try this changed macro from the example workbook that add a extra sheet
[quoted text clipped - 237 lines]
Many thanks

Ron,

Yes the code, copy, works fine but fails when it gets to the following;

ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase,
SourceData:= _
WSNew.UsedRange, Version:=xlPivotTableVersion10).
CreatePivotTable _
TableDestination:=SecondSh.Range("A1"), TableName:
="PivotTable3", DefaultVersion _
:=xlPivotTableVersion10

it just doesn't like the creating of the pivot
 
O

Ozzie via OfficeKB.com

Ron said:
This is working in 2003

ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
WSNew.UsedRange).CreatePivotTable TableDestination:= _
SecondSh.Range("A1"), TableName:="PivotTable2", DefaultVersion:= _
xlPivotTableVersion10
[quoted text clipped - 47 lines]
it just doesn't like the creating of the pivot


Ron, Thank you very much, it all works very, very well, really appreciated
 
R

Ron de Bruin

You are welcome

Seems the recorder in 2007 is not working correct
Time that I play more with this stuff (if I have time)



--

Regards Ron de Bruin
http://www.rondebruin.nl/tips.htm


Ozzie via OfficeKB.com said:
Ron said:
This is working in 2003

ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
WSNew.UsedRange).CreatePivotTable TableDestination:= _
SecondSh.Range("A1"), TableName:="PivotTable2", DefaultVersion:= _
xlPivotTableVersion10
[quoted text clipped - 47 lines]
it just doesn't like the creating of the pivot


Ron, Thank you very much, it all works very, very well, really appreciated
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top