VBA Open, copy, paste, close

JazzmanWA

New Member
Joined
Apr 28, 2011
Messages
6
Hi All,

I've been getting great tips on this board for several months. This time I can't find what I need.

Here is what I want to do...

I am opening a new workbook and pasting information into that workbook so, it may be called "book1" or "book12" depending on how many workbooks I create that day. I need to run a macro that opens an existing workbook, copies a worksheet to this new workbook I have already open and then closes the workbook I got the info from.

Here is what I have that works so far but, only if my workbook is "book1". How do I get this to copy that info to whatever my current workbook is called?


' Get_mail Macro

Workbooks.Open Filename:= _
"C:\Documents and Settings\XXXXXX\Desktop\Vendor email list.xlsx"
Sheets("Mailinfo").Select
Sheets("Mailinfo").Copy Before:=Workbooks("Book1").Sheets(2)
Windows("Vendor email list.xlsx").Activate
ActiveWindow.Close
Sheets("Sheet1").Select

Any help would be much appreciated. This is the "last piece of the puzzle" to get my macro to do everything I want it to do. :biggrin:

Thanks!
 

Excel Facts

What do {} around a formula in the formula bar mean?
{Formula} means the formula was entered using Ctrl+Shift+Enter signifying an old-style array formula.
Try this.
Code:
Dim wbMailList As Workbook

    Set wbMailList = Workbooks.Open(Filename:= _
                                    "C:\Documents and Settings\XXXXXX\Desktop\Vendor email list.xlsx")

    wb.Sheets("Mailinfo").Copy Before:=ThisWorkbook.Sheets(2)
 
    wbMailList.Close
 
Upvote 0
That works for opening the other workbook, but when I add in the code for "ThisWorkbook" I get an error. I am using most of Ron DeBruin's code for emailing certain rows to certain people with some changes. The error is near the bottom. Cws.delete is what always comes up.

I tried it with all the code you had too. Same error

I'm sure my code is a giant mess. Sorry. I'm fairly new at this.

Rich (BB code):
Option Explicit

'Macro to send out report to each company individually

Sub Send_Reschedule_Report()
    Dim OutApp As Object
    Dim OutMail As Object
    Dim rng As Range
    Dim Ash As Worksheet
    Dim Cws As Worksheet
    Dim Rcount As Long
    Dim Rnum As Long
    Dim FilterRange As Range
    Dim FieldNum As Integer
    Dim mailAddress As String
    Dim NewWB As Workbook
    Dim TempFilePath As String
    Dim TempFileName As String
    Dim FileExtStr As String
    Dim FileFormatNum As Long
    Dim SigString As String
    Dim Signature As String
    Dim wbMailList As Workbook
    

    On Error GoTo cleanup
    Set OutApp = CreateObject("Outlook.Application")

    With Application
        .EnableEvents = False
        .ScreenUpdating = False
    End With
    
        Dim oWS As Worksheet

        For Each oWS In ActiveWorkbook.Sheets

        oWS.AutoFilterMode = False
        oWS.UsedRange.Rows.Hidden = False
        oWS.UsedRange.Columns.Hidden = False
        Next
    
    ' Get_mail Macro
    '

    '
        Set wbMailList = Workbooks.Open(Filename:= _
                                    "C:\Documents and Settings\xxxxxx\Desktop\Vendor email list.xlsx")
        Sheets("Mailinfo").Select
        Sheets("Mailinfo").Copy Before:=ThisWorkbook.Sheets(2)
        Windows("Vendor email list.xlsx").Activate
        ActiveWindow.Close
        Sheets("Sheet1").Select
        
        
    'Hide columns
            Range("I:I,K:P").Select
            Range("K1").Activate
            Selection.EntireColumn.Hidden = True
        
    'Set filter sheet, you can also use Sheets("MySheet")
    Set Ash = ActiveSheet

    'Set filter range and filter column (column with names)
    Set FilterRange = Ash.Range("A1:Q" & Ash.Rows.Count)
    FieldNum = 1    'Filter column = A because the filter range start in column A

    'Add a worksheet for the unique list and copy the unique list in A1
    Set Cws = Worksheets.Add
    FilterRange.Columns(FieldNum).AdvancedFilter _
            Action:=xlFilterCopy, _
            CopyToRange:=Cws.Range("A1"), _
            CriteriaRange:="", Unique:=True

    'Count of the unique values + the header cell
    Rcount = Application.WorksheetFunction.CountA(Cws.Columns(1))

    'If there are unique values start the loop
    If Rcount >= 2 Then
        For Rnum = 2 To Rcount

            'Look for the mail address in the MailInfo worksheet
            mailAddress = ""
            On Error Resume Next
            mailAddress = Application.WorksheetFunction. _
                          VLookup(Cws.Cells(Rnum, 1).Value, _
                            Worksheets("Mailinfo").Range("A1:B" & _
                               Worksheets("Mailinfo").Rows.Count), 2, False)
            On Error GoTo 0

            If mailAddress <> "" Then

                'Filter the FilterRange on the FieldNum column
                FilterRange.AutoFilter Field:=FieldNum, _
                                       Criteria1:=Cws.Cells(Rnum, 1).Value

                'Copy the visible data in a new workbook
                With Ash.AutoFilter.Range
                    On Error Resume Next
                    Set rng = .SpecialCells(xlCellTypeVisible)
                    On Error GoTo 0
                End With

                Set NewWB = Workbooks.Add(xlWBATWorksheet)

                rng.Copy
                With NewWB.Sheets(1)
                    .Cells(1).PasteSpecial Paste:=8
                    .Cells(1).PasteSpecial Paste:=xlPasteValues
                    .Cells(1).PasteSpecial Paste:=xlPasteFormats
                    .Cells(1).Select
                    Application.CutCopyMode = False
                End With

                'Create a file name
                TempFilePath = Environ$("temp") & "\"
                TempFileName = "reschedule " & Ash.Parent.Name _
                             & " " & Format(Now, "mm-dd-yy")

                If Val(Application.Version) < 12 Then
                    'You use Excel 2000-2003
                    FileExtStr = ".xls": FileFormatNum = -4143
                Else
                    'You use Excel 2007-2010
                    FileExtStr = ".xlsx": FileFormatNum = 51
                End If

                'Save, Mail, Close and Delete the file
                Set OutMail = OutApp.CreateItem(0)
                
                With NewWB
                    .SaveAs TempFilePath & TempFileName _
                          & FileExtStr, FileFormat:=FileFormatNum
                    On Error Resume Next
                    
                        SigString = "C:\Documents and Settings\xxxxx\Application Data\Microsoft\Signatures\Jason.htm"

                        If Dir(SigString) <> "" Then
                        Signature = Get_Signature(SigString)
                    Else
                        Signature = ""
                    End If

                    With OutMail
                        .To = mailAddress
                        .CC = "no one@xyzcorp.com"
                        .Subject = "Reschedules for " & Format(Now, "mm-dd-yy")
                        .Attachments.Add NewWB.FullName
                        .HTMLBody = "<html><body>Hi, <br><br>" & _
                                "Please review attached and get back to me with answers within the next 2 days.<br><br>" & _
                                "Thank you, <br><br></body></html>" & Signature
                        .Display   'Or use Send
                    End With
                    On Error GoTo 0
                    
                    .Close savechanges:=False
                End With

                Set OutMail = Nothing
                Kill TempFilePath & TempFileName & FileExtStr
                
            End If
            
            'Close AutoFilter
            Ash.AutoFilterMode = False

        Next Rnum
        
    End If

cleanup:
    Set OutApp = Nothing
    Application.DisplayAlerts = False
    [highlight]Cws.Delete[/highlight]
    Application.DisplayAlerts = True

    With Application
        .EnableEvents = True
        .ScreenUpdating = True
    End With
End Sub

 Function Get_Signature(ByVal sFile As String) As String
    Dim fso As Object
    Dim ts As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(sFile).OpenAsTextStream(1, -2)
    Get_Signature = ts.ReadAll
    ts.Close
End Function
 
Upvote 0
This was kind of a guess based on the assumption that you wanted to copy after the 2nd sheet (Sheets(2)) of the workbook the code is in.
Code:
ThisWorkbook.Sheets(2)
I've had another look at the original code and I can see it probably isn't that workbook you want to copy to.

I also had a look at the most recent code but I'm afraid it's still not clear what workbook it is you want to copy to.
 
Upvote 0
That was the correct assumption.

For some reason I keep getting an error in my cleanup on Cws.delete though.

What I'm doing is this...

I have an open workbook that I need my email addresses loaded into from another workbook. Rather than trying to reference the other workbook, I just copy the sheet into the workbook I'm working in. I just figured that was the easier way to go. Then I send emails to different people based on the worksheet I'm working in.

Is that clear as mud or what?! :biggrin:
 
Upvote 0
What error are you getting?

If you remove On Error... then you might get a better idea what the problem is.

By the way did you try the rest of the code I posted - it might actually help with this problem.
 
Upvote 0
Run-time error '91':
object variable or With block variable not set

I tried what you had too. I got the same error.
 
Upvote 0
I've had another go and added a few comments that might, hopefully, make it easier to follow/understand.
Rich (BB code):
Option Explicit
 
'Macro to send out report to each company individually
Sub Send_Reschedule_Report()
Dim OutApp As Object
Dim OutMail As Object
Dim rng As Range
Dim Ash As Worksheet
Dim Cws As Worksheet
Dim Rcount As Long
Dim Rnum As Long
Dim FilterRange As Range
Dim FieldNum As Integer
Dim mailAddress As String
Dim NewWB As Workbook
Dim TempFilePath As String
Dim TempFileName As String
Dim FileExtStr As String
Dim FileFormatNum As Long
Dim SigString As String
Dim Signature As String
Dim wbMailList As Workbook
Dim oWS As Worksheet
Dim wbThis As Workbook
 
    On Error GoTo cleanup

    Set OutApp = CreateObject("Outlook.Application")
 
    With Application
        .EnableEvents = False
        .ScreenUpdating = False
    End With

    ' create a reference, wbThis, to the workbook the code is in
    Set wbThis = ThisWorkbook
 
    ' loop through all the sheets in the workbook the code is in (wbThis)
    For Each oWS In wbThis.Sheets
        oWS.AutoFilterMode = False
        oWS.UsedRange.Rows.Hidden = False
        oWS.UsedRange.Columns.Hidden = False
    Next
    ' Get_mail Macro
    '
    '
    
    ' open Vendor email list.xls and create a reference to it - wbMailList
    Set wbMailList = Workbooks.Open(Filename:= _
                                    "C:\Documents and Settings\xxxxxx\Desktop\Vendor email list.xlsx")
                                    
    ' copy the 'MailInfo' worksheet from workbook just opened to the workbook the code is in
    wbMailList.Sheets("Mailinfo").Copy Before:=wbThis.Sheets(2)
 
    ' close the workbook opened earlier
    wbMailList.Close
 
    'Hide columns
    wbThis.Sheets("Sheet1").Range("I:I,K:P").EntireColumn.Hidden = True
 
    'Set filter sheet, you can also use Sheets("MySheet")
    Set Ash = wbThis.Sheets("Sheet1")
 
    'Set filter range and filter column (column with names)
    Set FilterRange = Ash.Range("A1:Q" & Ash.Rows.Count)

    FieldNum = 1    'Filter column = A because the filter range start in column A
 
    'Add a worksheet for the unique list and copy the unique list in A1
    Set Cws = wbThis.Worksheets.Add

    FilterRange.Columns(FieldNum).AdvancedFilter _
            Action:=xlFilterCopy, _
            CopyToRange:=Cws.Range("A1"), _
            CriteriaRange:="", Unique:=True
 
    'Count of the unique values + the header cell
    Rcount = Application.WorksheetFunction.CountA(Cws.Columns(1))
 
    'If there are unique values start the loop
    If Rcount >= 2 Then
        For Rnum = 2 To Rcount
            'Look for the mail address in the MailInfo worksheet
            mailAddress = ""
            On Error Resume Next
            mailAddress = Application.WorksheetFunction. _
                          VLookup(Cws.Cells(Rnum, 1).Value, _
                                  Worksheets("Mailinfo").Range("A1:B" & _
                                                               Worksheets("Mailinfo").Rows.Count), 2, False)
            On Error GoTo 0
 
            If mailAddress <> "" Then
                'Filter the FilterRange on the FieldNum column
                FilterRange.AutoFilter Field:=FieldNum, _
                                       Criteria1:=Cws.Cells(Rnum, 1).Value
 
                'Copy the visible data in a new workbook
                With Ash.AutoFilter.Range
                    On Error Resume Next
                    Set rng = .SpecialCells(xlCellTypeVisible)
                    On Error GoTo 0
                End With
 
                Set NewWB = Workbooks.Add(xlWBATWorksheet)
 
                rng.Copy
 
                With NewWB.Sheets(1)
                    .Cells(1).PasteSpecial Paste:=8
                    .Cells(1).PasteSpecial Paste:=xlPasteValues
                    .Cells(1).PasteSpecial Paste:=xlPasteFormats
                    .Cells(1).Select
                    Application.CutCopyMode = False
                End With
 
                'Create a file name
               TempFilePath = Environ$("temp") & "\"
               TempFileName = "reschedule " & Ash.Parent.Name _
                               & " " & Format(Now, "mm-dd-yy")
 
                If Val(Application.Version) < 12 Then
                    'You use Excel 2000-2003
                    FileExtStr = ".xls": FileFormatNum = -4143
                Else
                    'You use Excel 2007-2010
                    FileExtStr = ".xlsx": FileFormatNum = 51
                End If
 
                'Save, Mail, Close and Delete the file
                Set OutMail = OutApp.CreateItem(0)
 
                With NewWB
                    .SaveAs TempFilePath & TempFileName _
                            & FileExtStr, FileFormat:=FileFormatNum

                    On Error Resume Next
 
                    SigString = "C:\Documents and Settings\xxxxx\Application Data\Microsoft\Signatures\Jason.htm"
 
                    If Dir(SigString) <> "" Then
                        Signature = Get_Signature(SigString)
                    Else
                        Signature = ""
                    End If
 
                    With OutMail
                        .To = mailAddress
                        .CC = "no one@xyzcorp.com"
                        .Subject = "Reschedules for " & Format(Now, "mm-dd-yy")
                        .Attachments.Add NewWB.FullName
                        .HTMLBody = "Hi, " & _
                                    "Please review attached and get back to me with answers within the next 2 days." & _
                                    "Thank you, " & Signature
                        .Display   'Or use Send
                    End With
                    On Error GoTo 0
                    .Close savechanges:=False
                End With
                Set OutMail = Nothing
                Kill TempFilePath & TempFileName & FileExtStr
            End If
 
            'Close AutoFilter
            Ash.AutoFilterMode = False
        Next Rnum
 
    End If
 
cleanup:
    Set OutApp = Nothing

    Application.DisplayAlerts = False

    Cws.Delete

    Application.DisplayAlerts = True
 
    With Application
        .EnableEvents = True
        .ScreenUpdating = True
    End With

End Sub
 
 Function Get_Signature(ByVal sFile As String) As String
    Dim fso As Object
    Dim ts As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(sFile).OpenAsTextStream(1, -2)
    Get_Signature = ts.ReadAll
    ts.Close
End Function
 
Upvote 0
I pasted your code into another module and ran it. Same error. :(

I know its close though. It opens the other file.

I must be getting into the hard part of VBA stuff!

I do appreciate your time.
 
Upvote 0
Did you remove every occurence of On Error...?

Some of them might be needed in the final code but removing them for now might help you find the problem.

Once you've done that try stepping through the code with F8.

It'll probably error somewhere else than previously but tha might be where the problem really is.
 
Upvote 0

Forum statistics

Threads
1,224,598
Messages
6,179,822
Members
452,946
Latest member
JoseDavid

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top