Results 1 to 18 of 18

Speed up a macro

Threaded View

  1. #1
    Valued Forum Contributor
    Join Date
    12-02-2009
    Location
    Austin, Tx
    MS-Off Ver
    Office 365 64-Bit, 2108, build 14326.21018
    Posts
    4,065

    Speed up a macro

    I've got a rather involved macro that's running kind of slowly, and I would appreciate any help I can get speeding it up. It's in two parts; the first is to create and email a report, the second is to format so it's pretty for printing. The full codes for both routines is pasted below.

    The email part I developed first and it runs pretty quickly. Afterwards, I added the second macro, which is called halfway through the first.

    Stepping through the code in the second macro, the problem I see is in this section, the setup for setting the heighth of merged cells in the report:
    'Create an array of merged cell addresses that have wrapped text
    For Each c In ActiveSheet.UsedRange
    If c.MergeCells Then
        With c.MergeArea
        If .Rows.Count = 1 And .WrapText = True Then
            If MergeRng Is Nothing Then
                Set MergeRng = c.MergeArea
                ReDim a(0)
                a(0) = c.MergeArea.Address
            Else
            Set isect = Intersect(c, MergeRng)
                If isect Is Nothing Then
                    Set MergeRng = Union(MergeRng, c.MergeArea)
                    ReDim Preserve a(UBound(a) + 1)
                    a(UBound(a)) = c.MergeArea.Address
                End If
            End If
        End If
        End With
    End If
    Next c
    Stepping through it, it seems to repeat hundreds of times, and seems to really bog down the response time.

    Here are the two macros. The problem (what I see as the problem) is presented first, the overall email macro presented second. I appreciate any help you can provide on this.

    Sub AutoFitMergedCellRowHeight()
        Dim CurrentRowHeight As Single, MergedCellRgWidth As Single
        Dim CurrCell As Range
        Dim ActiveCellWidth As Single, PossNewRowHeight As Single
        Dim StartCell As Range, c As Range, MergeRng As Range, Cell As Range
        Dim a() As String, isect As Range, i
    
         
    'Take a note of current active cell
    Set StartCell = ActiveCell
    
    'Create an array of merged cell addresses that have wrapped text
    For Each c In ActiveSheet.UsedRange
    If c.MergeCells Then
        With c.MergeArea
        If .Rows.Count = 1 And .WrapText = True Then
            If MergeRng Is Nothing Then
                Set MergeRng = c.MergeArea
                ReDim a(0)
                a(0) = c.MergeArea.Address
            Else
            Set isect = Intersect(c, MergeRng)
                If isect Is Nothing Then
                    Set MergeRng = Union(MergeRng, c.MergeArea)
                    ReDim Preserve a(UBound(a) + 1)
                    a(UBound(a)) = c.MergeArea.Address
                End If
            End If
        End If
        End With
    End If
    Next c
    
    
    Application.ScreenUpdating = False
    
    'Loop thru merged cells
    For i = 0 To UBound(a)
    Range(a(i)).Select
          With ActiveCell.MergeArea
                If .Rows.Count = 1 And .WrapText = True Then
                    'Application.ScreenUpdating = False
                    CurrentRowHeight = .RowHeight
                    ActiveCellWidth = ActiveCell.ColumnWidth
                    For Each CurrCell In Selection
        MergedCellRgWidth = CurrCell.ColumnWidth + MergedCellRgWidth
           
          If MergedCellRgWidth > 255 Then
                MergedCellRgWidth = 255
          End If
                Next
                    .MergeCells = False
                    .Cells(1).ColumnWidth = MergedCellRgWidth
                    .EntireRow.AutoFit
                    PossNewRowHeight = .RowHeight
                    .Cells(1).ColumnWidth = ActiveCellWidth
                    .MergeCells = True
                    .RowHeight = IIf(CurrentRowHeight > PossNewRowHeight, _
                      CurrentRowHeight, PossNewRowHeight)
                End If
            End With
    MergedCellRgWidth = 0
    Next i
    
    StartCell.Select
    
    'Autofit the columns for printing
    Cells.EntireColumn.AutoFit
    Columns("A:A").ColumnWidth = 9
    Application.ScreenUpdating = True
    
    'Clean up
    Set CurrCell = Nothing
    Set StartCell = Nothing
    Set c = Nothing
    Set MergeRng = Nothing
    Set Cell = Nothing
    
    End Sub
    Here's the Mail routine:
    Sub Newtry()
    'Working in 2000-2007
        Dim FileExtStr As String
        Dim FileFormatNum As Long
        Dim Sourcewb As Workbook
        Dim Destwb As Workbook
        Dim TempFilePath As String
        Dim TempFileName As String
        Dim OutApp As Object
        Dim OutMail As Object
        Dim sh As Worksheet
        Dim TheActiveWindow As Window
        Dim TempWindow As Window
        Dim olInBox As Object
        Dim olSent As Object
       
    
    
        With Application
            .ScreenUpdating = False
            .EnableEvents = False
        End With
    
        Set Sourcewb = ActiveWorkbook
    
        'Copy the "Results" formated worksheet to a new workbook
        'We add a temporary Window to avoid the Copy problem
        'if there is a List or Table in one of the sheets and
        'if the sheets are grouped
          
        With Sourcewb
            Set TheActiveWindow = ActiveWindow
            Set TempWindow = .NewWindow
            .Sheets(Array("Results")).copy
            
        End With
            
        'Close temporary Window
        TempWindow.Close
    
        Set Destwb = ActiveWorkbook
    
        'Determine the Excel version and file extension/format
        With Destwb
            If Val(Application.Version) < 12 Then
                'You use Excel 97-2003
                FileExtStr = ".xls": FileFormatNum = -4143
            Else
                'You use Excel 2007, we exit the sub when your answer is
                'NO in the security dialog that you only see when you copy
                'an sheet from a xlsm file with macro's disabled.
                If Sourcewb.Name = .Name Then
                    With Application
                        .ScreenUpdating = True
                        .EnableEvents = True
                    End With
                    MsgBox "Your answer is NO in the security dialog"
                    Exit Sub
                Else
                    Select Case Sourcewb.FileFormat
                    Case 51: FileExtStr = ".xlsx": FileFormatNum = 51
                    Case 52:
                        If .HasVBProject Then
                            FileExtStr = ".xlsm": FileFormatNum = 52
                        Else
                            FileExtStr = ".xlsx": FileFormatNum = 51
                        End If
                    Case 56: FileExtStr = ".xls": FileFormatNum = 56
                    Case Else: FileExtStr = ".xlsb": FileFormatNum = 50
                    End Select
                End If
            End If
        End With
    
        'Copy the "Reports" page to the "Results" page (new copy)
        
        Sourcewb.Worksheets("Report").Range("A1:W15000").copy Destination:=Destwb.Worksheets("Results").Range("A1:W15000")
         
        'Autofit the merged cells
                 Run "AutoFitMergedCellRowHeight"
                            
        '    'Change all cells in the worksheets to values if you want
        '    For Each sh In Destwb.Worksheets
        '        sh.Select
        '        With sh.UsedRange
        '            .Cells.Copy
        '            .Cells.PasteSpecial xlPasteValues
        '            .Cells(1).Select
        '        End With
        '        Application.CutCopyMode = False
        '        Destwb.Worksheets(1).Select
        '    Next sh
    
    
        'Save the new workbook/Mail it/Delete it
        TempFilePath = Environ$("temp") & "\"
        TempFileName = "Items of Interest in " & Sourcewb.Name & " " _
                     & Format(Now, "dd-mmm-yy h-mm-ss")
    
        Set OutApp = CreateObject("Outlook.Application")
        OutApp.Session.Logon
        Set olSent = OutApp.Session.GetDefaultFolder(5)
        Set olInBox = OutApp.Session.GetDefaultFolder(6)
        Set OutMail = OutApp.CreateItem(0)
    
        With Destwb
            .SaveAs TempFilePath & TempFileName & FileExtStr, _
                    FileFormat:=FileFormatNum
            On Error Resume Next
            With OutMail
                .To = "Jomili@sumdurnaddress.com"
                .CC = ""
                .BCC = ""
                .Subject = "Items Needing Review "
                .Body = "The attached spreadsheet contains items noted on the current" & vbCrLf & "Report as needing attention. Please review this" & vbCrLf & "checklist and handle all items in a timely manner.  This checklist" & vbCrLf & "will be reviewed when the next Report is posted." & vbCrLf & vbCrLf & "Thanks" & vbCrLf & "Jomili" & vbCrLf & "Hard Working Guy" & vbCrLf & "555-555-5556"
                .Attachments.Add Destwb.FullName
                'You can add other files also like this
                '.Attachments.Add ("C:\test.txt")
                .Send   'or use .Display
                AppActivate Application.Caption
    
            End With
            
            Application.Wait Now + TimeSerial(0, 0, 2)
            olSent.Items(olSent.Items.Count).copy.Move olInBox
        
            
            On Error GoTo 0
            .Close SaveChanges:=False
        End With
    
        'Delete the file you have sent
        Kill TempFilePath & TempFileName & FileExtStr
    
        Set OutApp = Nothing
        Set olSent = Nothing
        Set olInBox = Nothing
        Set OutMail = Nothing
    
        With Application
            .ScreenUpdating = True
            .EnableEvents = True
        End With
        
       Application.Windows(1).Activate
    
    End Sub
    Last edited by Andy Pope; 02-21-2010 at 08:08 AM.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts

Search Engine Friendly URLs by vBSEO 3.6.0 RC 1