Excel button problem

B

BeSmart

Hi All
I have a macro that copies a worksheet in the active workbook and puts it
into a new workbook - then formats it and deletes any buttons on the
worksheet.

On the first click on the button the macro works ok.
On the second click, it fails because the all assigned macros on all buttons
in the active workbook changed from "mba" to "book1!mba". Book 1 doesn't
exists (wasn't opened, wasn't saved, doesn't have the macros).

I've never experienced this problem before??
Can anyone help to solve this problem?
FYI
The macro to do this is called "mba".
It lives in the active workbook within "Module 1" as a "General" macro
The active workbook is currently called "Template.xls" - users save as from
this workbook
The macro is assigned to a button created from the Form toolbar (it's named
"creatembabutton")
 
J

joel

I think you know what the problem is already. Excel doesn't delete th
VBA project when a workbook is closed so the project is still activ
when you run the macro a 2nd time. You always want to run the macr
from the first workbook that was opened. You should always refere t
the main workbook using THISWORKBOOK.


Try to Avoid using Activeworkbook. When you open a workbook use

Set bk = workbooks.open(filename:="c:\temp\book1.xls")

Then use bk to reference the new workbook. for some reason if you ope
a text file as a workbook the statement above doesn't work. So
immediately after opening the workbook use a set statement to make
variable equal to the active workbook

Set bk = activeworkbook


A common problem with VBA is that the focus shifts from one object t
another without you knowing it is happening. for example when you ope
a workbook the focus changes to the workbook that you opened to one o
the sheet of the workbook (which ever sheet was the active sheet whe
the workbook was closed).

Without seeing your code I can't tell how to fix your problem. but i
is good practive to avoid usiong the following methods:

1) ActiveSheet
2) ActiveCell
3) select
4) Selection


With VBA it is inconsistenet and some commands only work with the abov
methods so that is why I say Avoid.
 
B

BeSmart

Hi Joel
Please forgive me (I'm a novice at this), and I don't totally understand
e.g. how do I avoid using "activeworkbook" when I don't know what the
filename of the workbook will be (users save as from the original workbook I
send to them)?

Here is my code that is assigned to the button.
The code gets data from the original workbook and the current worksheet
(which is already open and selected because the button is on that sheet)
It pastes the data into a section on a hidden worksheet within the same
workbook.
Then it makes a copy of the MBA worksheet and renames it
then the new worksheet is moves out of the original workbook and the formats
e.g. clear un-necessary defined names, paste all formulas as values etc,
re-hides the

There are situation where I use the following - what should I use instead?
1) ActiveSheet
2) ActiveCell
3) select
4) Selection

_____________________
Sub mba()
Dim nme As Name

Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Goto Reference:="MBAData" 'named range on current worksheet'
Selection.Copy
Sheets("MBA").Visible = True 'hidden template worksheet'
Sheets("MBA").Select
Range("A80").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Sheets("MBA").Copy After:=Sheets(Sheets.Count)
Sheets("MBA (2)").Name = "Client MBA"
Range("A1").Select
Application.CutCopyMode = False
Range("A1").Select 'from here on it is formatting'
Selection.Clear
Cells.Select
Selection.Copy 'replace all formulas with values
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Range("A1").Select
Application.Goto Reference:="MBApaste"
Selection.Clear 'clear data dump section

Sheets("MBA").Select 'clear the pasted data on the template & re-hide the
sheet
Application.Goto Reference:="MBApaste"
Selection.Clear
Sheets("MBA").Visible = False
Application.CutCopyMode = False

Sheets("Client MBA").Move
Range("A1").Select
For Each nme In ActiveWorkbook.Names 'delete named ranges not needed in new
workbook
If nme.Name Like "*_FilterDatabase" Or _
nme.Name Like "*Print_Area" Or _
nme.Name Like "*Print_Titles" Or _
nme.Name Like "*wvu.*" Or _
nme.Name Like "*wrn.*" Or _
nme.Name Like "*!Criteria" Then
Else
nme.Delete
End If
Next nme
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
 
J

joel

You are getting me confused!!!!! The code below is adding a new shee
to the workbook and not a new workbook. I've made my changes to th
code below to remove the methods that cause problems.

I think you have to explaoin to me what is happening beofre this cod
is run. How do you create a new workbook and How to you open the wor
book.


Usually when people create a new work book they will use the SAVEA
method or copy a file (template file) to a new filename and then ope
the the copied file and make appropriate changes. If yo uuse the SaveA
you have to be a little careful of how you reffernce the SAVEAS fil
since it closes the original workbook. The solution may be to use th
file copy method.





VBA Code:
--------------------


Sub mba()
Dim nme As Name

Application.ScreenUpdating = False
Application.EnableEvents = False

With Sheets("MBA")
Range("MBAData").Copy
Range("A80").PasteSpecial _
Paste:=xlValues
End With

Sheets("MBA").Copy After:=Sheets(Sheets.Count)
Set NewSht = Sheets(Sheets.Count)
With NewSht
.Name = "Client MBA"
.Range ("A1")
.Cells.Copy
.cellsPasteSpecial _
Paste:=xlValues
End With

Range("MBApaste").Clear
Sheets("MBA").Visible = False

Sheets("Client MBA").Move

For Each nme In ThisWorkbook.Names 'delete named ranges not needed in new
'Workbook
If nme.Name Like "*_FilterDatabase" Or _
nme.Name Like "*Print_Area" Or _
nme.Name Like "*Print_Titles" Or _
nme.Name Like "*wvu.*" Or _
nme.Name Like "*wrn.*" Or _
nme.Name Like "*!Criteria" Then
Else
nme.Delete
End If
Next nme
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub



--------------------
 
B

BeSmart

Hi Joel
Thank you for looking at the code for me.

I don't need to "open" an existing workbook - the workbook is already open
and the user is on the worksheet that has the MBAData named range that needs
to be copied into the hidden worksheet MBA.

i.e.
Range(MBAData).Copy (this happens on the current worksheet - not sheet("MBA")

I also don't need to open a new workbook
The code "moves" the "Client MBA" worksheet into a separate workbook (to do
this manually I would go right mouse, select Cooy/Move, select "new booK" &
hit OK.
i.e. Sheets("Client MBA").Move

I tried to test your code (after a few little changes - see below revised
code), but had these problems:

- it didn't select worksheet MBA to pasted MBAData values from A80 - it
pasted the values into the current worksheet from cell A80.
With Sheets("MBA")
Range("A80").PasteSpecial _
Paste:=xlValues
End With

- it didn't change the worksheet name "MBA(2)" to "Client MBA"?
With NewSht
..Name = "Client MBA"
..Cells.Copy
..Cells.PasteSpecial _
Paste:=xlValues

Thank you for your patience and help
BeSmart

Revised code:
____________
Sub mba()
Dim nme As Name

Application.ScreenUpdating = False
Application.EnableEvents = False

Range("MBAData").Copy

Sheets("MBA").Visible = True
With Sheets("MBA")
Range("A80").PasteSpecial _
Paste:=xlValues
End With

Sheets("MBA").Copy After:=Sheets(Sheets.Count)
Set NewSht = Sheets(Sheets.Count)
With NewSht
..Name = "Client MBA"
..Cells.Copy
..Cells.PasteSpecial _
Paste:=xlValues
End With
Range("A1").Clear
Range("MBApaste").Clear
Sheets("MBA").Visible = False

Sheets("Client MBA").Move

For Each nme In ThisWorkbook.Names 'delete named ranges not needed in new
'Workbook
If nme.Name Like "*_FilterDatabase" Or _
nme.Name Like "*Print_Area" Or _
nme.Name Like "*Print_Titles" Or _
nme.Name Like "*wvu.*" Or _
nme.Name Like "*wrn.*" Or _
nme.Name Like "*!Criteria" Then
Else
nme.Delete
End If
Next nme
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
 
J

joel

I left out two periods in the With Statement. I'm not sure why th
sheet name didn't get changed. I also missed the fact that the MOV
method was creating a new workbook.




VBA Code:
--------------------


Sub mba()
Dim nme As Name

Application.ScreenUpdating = False
Application.EnableEvents = False

With Sheets("MBA")
.Range("MBAData").Copy
.Range("A80").PasteSpecial _
Paste:=xlValues
End With

Sheets("MBA").Copy After:=Sheets(Sheets.Count)
Set NewSht = Sheets(Sheets.Count)
With NewSht
.Name = "Client MBA"
.Range ("A1")
.Cells.Copy
.cellsPasteSpecial _
Paste:=xlValues
End With

Range("MBApaste").Clear
Sheets("MBA").Visible = False

Sheets("Client MBA").Move
Set NewBk = Activeworkbook

For Each nme In NewBk.Names 'delete named ranges not needed in new
'Workbook
If nme.Name Like "*_FilterDatabase" Or _
nme.Name Like "*Print_Area" Or _
nme.Name Like "*Print_Titles" Or _
nme.Name Like "*wvu.*" Or _
nme.Name Like "*wrn.*" Or _
nme.Name Like "*!Criteria" Then
Else
nme.Delete
End If
Next nme
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

--------------------
 

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