+ Reply to Thread
Results 1 to 4 of 4

Routine running slow (memory leak?)

  1. #1
    ExcelMonkey
    Guest

    Routine running slow (memory leak?)

    I have a very large add-in that I build which is running very slow. In fact
    it crashes excel if I run too many times. I am questioning the structure I
    have used. I am wondering if the speed has something to do with either:
    1) "Public Variables" or
    2) the use of "Set" statement

    I have been reading about memory leak in the new book by Bullen/Bovey/Green
    (page 184) and their comments on memory reclaim. Not sure if it applies here
    or not.

    The routine effectively:
    1) sets up 19 paste ranges, declares a public variable "Cell" and then loops
    through every cell in the UsedRange of every sheet in the spreadsheet
    (ListAuditResults Sub)
    2) tests for 19 attributes (MainAudit Sub) - 1 at a time.
    3) If the attribute is found (TRUE) then the routine pastes the cell address
    of the variable "Cell" to a named paste range (CellAddressPass Sub) set up
    earlier in the routine. This paste range increments on each successive
    round. So effectively the routine checks every cell for attribute 1 and then
    does it all over again for 2,3,4,5-19.

    With regards to the memory leak issue, do I need to do something with the 19
    paste range variables to reduce memory leak?

    The code below is a rough representation of the routine. I have left out
    many details as the does code works - its just slow. Note that I have only
    provided details for Case 19 in the MainAudit Sub. All 19 have a Set
    statement which increments the paste range for the attribute associated with
    each Case.

    Thanks in advance!
    EM

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'Define Public Variables

    Public Cell As Range

    'Set 19 Past Range Variables
    Public Comrng As Range
    Public Hardrng As Range
    Public Errrng As Range
    Public Colrnge As Range
    Public Validrng As Range
    Public ValidErrrng As Range
    Public ExtLinkrng As Range
    Public Inputrng As Range
    Public CirCellrng As Range
    Public CondFormrng As Range
    Public FormTyperng As Range
    Public FontSizerng As Range
    Public FontTyperng As Range
    Public NumFormatrng As Range
    Public NamedCellrng As Range
    Public SpecSearchrng As Range
    Public FontIntColrng As Range
    Public ProtectedCellrng As Range
    Public ColouredFontCellrng As Range
    Public HiddenRowColrng As Range

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'Main Loop Structure
    Dim ObjFind As String
    Dim PasteStartCell As String

    With Workbook

    PasteStartCell = Range("B2").Address

    'Set Statements for 19 paste targets let routine know where to print results
    Set Comrng = .Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,0)
    Set Hardrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,1)
    Set Errrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,2)
    Set Validrng=.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,3)
    Set ValidErrrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,4)
    Set ExtLinkrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,5)
    Set Inputrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,6)
    Set CirCellrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,7)
    Set CondFormrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,8)
    Set FormTyperng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,9)
    Set FontSizerng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,10)
    Set FontTyperng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,11)
    Set NumFormatrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,12)
    Set NamedCellrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,13)
    Set SpecSearchrng
    =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,14)
    Set FontIntColrng
    =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,15)
    Set ProtectedCellrng
    =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,16)
    Set ColouredFontCellrng
    =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,17)
    Set HiddenRowColrng
    =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,18)

    For Each sh In ActiveWorkbook.Worksheets
    For AuditTypes = 1 To 19
    For Each Cell In sh.UsedRange
    Call MainAudit(ChkbxCtrlFind)
    Next
    End Select
    Next
    Next
    End With
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Sub MainAudit(X As Integer)
    Select Case X
    Case Is = 1
    Case Is = 2
    Case Is = 3
    Case Is = 4
    Case Is = 5
    Case Is = 6
    Case Is = 7
    Case Is = 8
    Case Is = 9
    Case Is = 10
    Case Is = 11
    Case Is = 12
    Case Is = 13
    Case Is = 14
    Case Is = 15
    Case Is = 16
    Case Is = 17
    Case Is = 18
    Case Is = 19
    IF Cell............................Then
    Call CellAddressPass(HiddenRowColrng)
    AdjustedIncrement = Increment(PasteRowIncrement)
    Set HiddenRowColrng = HiddenRowColrng.Offset(AdjustedIncrement, 0)
    End if
    End Select
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Sub CellAddressPass(rng As Range)
    Dim a As String
    Dim b As String

    a = Cell.Parent.Name & "!" & Cell.Address(0, 0)
    b = "'" & Workbooks(OriginalWorkbook).Path & "\[" &
    Workbooks(OriginalWorkbook).Name & "]" & _
    Cell.Parent.Name & "'!" &
    Cell.Address(0, 0)


    rng.Parent.Hyperlinks.Add Anchor:=rng, Address:="", _
    SubAddress:=b, _
    TextToDisplay:=a

    End Sub

  2. #2
    Gary L Brown
    Guest

    RE: Routine running slow (memory leak?)

    1) Always re-set your 'Set's.
    What I do is to put the re-set's just before the end of the program along
    with an on error stmt so the re-set's don't get hung up. For example...

    Sub Test
    Set Comrng = .Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,0)
    Set Hardrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,1)
    ''''other code''''
    On Error Resume Next
    Set Comrng = Nothing
    Set Hardrng = Nothing
    End Sub

    Or, since the ranges may be used throughout the module, put the Set
    ....=Nothing in the procedure that is run when you no longer need the ranges
    defined.

    2) If your coding is all within one module, why not use 'Dim' or 'Private'
    before the first procedure in the module so that the variable will be known
    throughout the module but not carried in memory like 'Public' does.
    The 'Public' declaration gives the variable scope in ALL modules.

    HTH,
    --
    Gary Brown
    gary_brown@ge_NOSPAM.com
    If this post was helpful, please click the ''Yes'' button next to ''Was this
    Post Helpfull to you?''.


    "ExcelMonkey" wrote:

    > I have a very large add-in that I build which is running very slow. In fact
    > it crashes excel if I run too many times. I am questioning the structure I
    > have used. I am wondering if the speed has something to do with either:
    > 1) "Public Variables" or
    > 2) the use of "Set" statement
    >
    > I have been reading about memory leak in the new book by Bullen/Bovey/Green
    > (page 184) and their comments on memory reclaim. Not sure if it applies here
    > or not.
    >
    > The routine effectively:
    > 1) sets up 19 paste ranges, declares a public variable "Cell" and then loops
    > through every cell in the UsedRange of every sheet in the spreadsheet
    > (ListAuditResults Sub)
    > 2) tests for 19 attributes (MainAudit Sub) - 1 at a time.
    > 3) If the attribute is found (TRUE) then the routine pastes the cell address
    > of the variable "Cell" to a named paste range (CellAddressPass Sub) set up
    > earlier in the routine. This paste range increments on each successive
    > round. So effectively the routine checks every cell for attribute 1 and then
    > does it all over again for 2,3,4,5-19.
    >
    > With regards to the memory leak issue, do I need to do something with the 19
    > paste range variables to reduce memory leak?
    >
    > The code below is a rough representation of the routine. I have left out
    > many details as the does code works - its just slow. Note that I have only
    > provided details for Case 19 in the MainAudit Sub. All 19 have a Set
    > statement which increments the paste range for the attribute associated with
    > each Case.
    >
    > Thanks in advance!
    > EM
    >
    > ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    > 'Define Public Variables
    >
    > Public Cell As Range
    >
    > 'Set 19 Past Range Variables
    > Public Comrng As Range
    > Public Hardrng As Range
    > Public Errrng As Range
    > Public Colrnge As Range
    > Public Validrng As Range
    > Public ValidErrrng As Range
    > Public ExtLinkrng As Range
    > Public Inputrng As Range
    > Public CirCellrng As Range
    > Public CondFormrng As Range
    > Public FormTyperng As Range
    > Public FontSizerng As Range
    > Public FontTyperng As Range
    > Public NumFormatrng As Range
    > Public NamedCellrng As Range
    > Public SpecSearchrng As Range
    > Public FontIntColrng As Range
    > Public ProtectedCellrng As Range
    > Public ColouredFontCellrng As Range
    > Public HiddenRowColrng As Range
    >
    > '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    > 'Main Loop Structure
    > Dim ObjFind As String
    > Dim PasteStartCell As String
    >
    > With Workbook
    >
    > PasteStartCell = Range("B2").Address
    >
    > 'Set Statements for 19 paste targets let routine know where to print results
    > Set Comrng = .Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,0)
    > Set Hardrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,1)
    > Set Errrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,2)
    > Set Validrng=.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,3)
    > Set ValidErrrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,4)
    > Set ExtLinkrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,5)
    > Set Inputrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,6)
    > Set CirCellrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,7)
    > Set CondFormrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,8)
    > Set FormTyperng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,9)
    > Set FontSizerng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,10)
    > Set FontTyperng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,11)
    > Set NumFormatrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,12)
    > Set NamedCellrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,13)
    > Set SpecSearchrng
    > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,14)
    > Set FontIntColrng
    > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,15)
    > Set ProtectedCellrng
    > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,16)
    > Set ColouredFontCellrng
    > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,17)
    > Set HiddenRowColrng
    > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,18)
    >
    > For Each sh In ActiveWorkbook.Worksheets
    > For AuditTypes = 1 To 19
    > For Each Cell In sh.UsedRange
    > Call MainAudit(ChkbxCtrlFind)
    > Next
    > End Select
    > Next
    > Next
    > End With
    > ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    > Private Sub MainAudit(X As Integer)
    > Select Case X
    > Case Is = 1
    > Case Is = 2
    > Case Is = 3
    > Case Is = 4
    > Case Is = 5
    > Case Is = 6
    > Case Is = 7
    > Case Is = 8
    > Case Is = 9
    > Case Is = 10
    > Case Is = 11
    > Case Is = 12
    > Case Is = 13
    > Case Is = 14
    > Case Is = 15
    > Case Is = 16
    > Case Is = 17
    > Case Is = 18
    > Case Is = 19
    > IF Cell............................Then
    > Call CellAddressPass(HiddenRowColrng)
    > AdjustedIncrement = Increment(PasteRowIncrement)
    > Set HiddenRowColrng = HiddenRowColrng.Offset(AdjustedIncrement, 0)
    > End if
    > End Select
    > '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    > Private Sub CellAddressPass(rng As Range)
    > Dim a As String
    > Dim b As String
    >
    > a = Cell.Parent.Name & "!" & Cell.Address(0, 0)
    > b = "'" & Workbooks(OriginalWorkbook).Path & "\[" &
    > Workbooks(OriginalWorkbook).Name & "]" & _
    > Cell.Parent.Name & "'!" &
    > Cell.Address(0, 0)
    >
    >
    > rng.Parent.Hyperlinks.Add Anchor:=rng, Address:="", _
    > SubAddress:=b, _
    > TextToDisplay:=a
    >
    > End Sub


  3. #3
    RB Smissaert
    Guest

    Re: Routine running slow (memory leak?)

    Just one little thing.

    Better to do this:

    'Set Statements for 19 paste targets let routine know where to print
    results
    With .Worksheets(AuditShtName).Range(PasteStartCell)
    Set Comrng = .Offset(0, 0)
    Set Hardrng = .Offset(0, 1)
    Set Errrng = .Offset(0, 2)
    Set Validrng = .Offset(0, 3)
    Set ValidErrrng = .Offset(0, 4)
    Set ExtLinkrng = .Offset(0, 5)
    Set Inputrng = .Offset(0, 6)
    Set CirCellrng = .Offset(0, 7)
    Set CondFormrng = .Offset(0, 8)
    Set FormTyperng = .Offset(0, 9)
    Set FontSizerng = .Offset(0, 10)
    Set FontTyperng = .Offset(0, 11)
    Set NumFormatrng = .Offset(0, 12)
    Set NamedCellrng = .Offset(0, 13)
    Set SpecSearchrng = .Offset(0, 14)
    Set FontIntColrng = .Offset(0, 15)
    Set ProtectedCellrng = .Offset(0, 16)
    Set ColouredFontCellrng = .Offset(0, 17)
    Set HiddenRowColrng = .Offset(0, 18)
    End With

    In general the less dots the better.

    Or maybe you can do away with all those ranges and just work with an array
    or arrays.

    RBS

    "ExcelMonkey" <[email protected]> wrote in message
    news:[email protected]...
    >I have a very large add-in that I build which is running very slow. In
    >fact
    > it crashes excel if I run too many times. I am questioning the structure
    > I
    > have used. I am wondering if the speed has something to do with either:
    > 1) "Public Variables" or
    > 2) the use of "Set" statement
    >
    > I have been reading about memory leak in the new book by
    > Bullen/Bovey/Green
    > (page 184) and their comments on memory reclaim. Not sure if it applies
    > here
    > or not.
    >
    > The routine effectively:
    > 1) sets up 19 paste ranges, declares a public variable "Cell" and then
    > loops
    > through every cell in the UsedRange of every sheet in the spreadsheet
    > (ListAuditResults Sub)
    > 2) tests for 19 attributes (MainAudit Sub) - 1 at a time.
    > 3) If the attribute is found (TRUE) then the routine pastes the cell
    > address
    > of the variable "Cell" to a named paste range (CellAddressPass Sub) set up
    > earlier in the routine. This paste range increments on each successive
    > round. So effectively the routine checks every cell for attribute 1 and
    > then
    > does it all over again for 2,3,4,5-19.
    >
    > With regards to the memory leak issue, do I need to do something with the
    > 19
    > paste range variables to reduce memory leak?
    >
    > The code below is a rough representation of the routine. I have left out
    > many details as the does code works - its just slow. Note that I have
    > only
    > provided details for Case 19 in the MainAudit Sub. All 19 have a Set
    > statement which increments the paste range for the attribute associated
    > with
    > each Case.
    >
    > Thanks in advance!
    > EM
    >
    > ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    > 'Define Public Variables
    >
    > Public Cell As Range
    >
    > 'Set 19 Past Range Variables
    > Public Comrng As Range
    > Public Hardrng As Range
    > Public Errrng As Range
    > Public Colrnge As Range
    > Public Validrng As Range
    > Public ValidErrrng As Range
    > Public ExtLinkrng As Range
    > Public Inputrng As Range
    > Public CirCellrng As Range
    > Public CondFormrng As Range
    > Public FormTyperng As Range
    > Public FontSizerng As Range
    > Public FontTyperng As Range
    > Public NumFormatrng As Range
    > Public NamedCellrng As Range
    > Public SpecSearchrng As Range
    > Public FontIntColrng As Range
    > Public ProtectedCellrng As Range
    > Public ColouredFontCellrng As Range
    > Public HiddenRowColrng As Range
    >
    > '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    > 'Main Loop Structure
    > Dim ObjFind As String
    > Dim PasteStartCell As String
    >
    > With Workbook
    >
    > PasteStartCell = Range("B2").Address
    >
    > 'Set Statements for 19 paste targets let routine know where to print
    > results
    > Set Comrng = .Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,0)
    > Set Hardrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,1)
    > Set Errrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,2)
    > Set Validrng=.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,3)
    > Set ValidErrrng
    > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,4)
    > Set ExtLinkrng
    > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,5)
    > Set Inputrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,6)
    > Set CirCellrng
    > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,7)
    > Set CondFormrng
    > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,8)
    > Set FormTyperng
    > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,9)
    > Set FontSizerng
    > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,10)
    > Set FontTyperng
    > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,11)
    > Set NumFormatrng
    > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,12)
    > Set NamedCellrng
    > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,13)
    > Set SpecSearchrng
    > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,14)
    > Set FontIntColrng
    > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,15)
    > Set ProtectedCellrng
    > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,16)
    > Set ColouredFontCellrng
    > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,17)
    > Set HiddenRowColrng
    > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,18)
    >
    > For Each sh In ActiveWorkbook.Worksheets
    > For AuditTypes = 1 To 19
    > For Each Cell In sh.UsedRange
    > Call MainAudit(ChkbxCtrlFind)
    > Next
    > End Select
    > Next
    > Next
    > End With
    > ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    > Private Sub MainAudit(X As Integer)
    > Select Case X
    > Case Is = 1
    > Case Is = 2
    > Case Is = 3
    > Case Is = 4
    > Case Is = 5
    > Case Is = 6
    > Case Is = 7
    > Case Is = 8
    > Case Is = 9
    > Case Is = 10
    > Case Is = 11
    > Case Is = 12
    > Case Is = 13
    > Case Is = 14
    > Case Is = 15
    > Case Is = 16
    > Case Is = 17
    > Case Is = 18
    > Case Is = 19
    > IF Cell............................Then
    > Call CellAddressPass(HiddenRowColrng)
    > AdjustedIncrement = Increment(PasteRowIncrement)
    > Set HiddenRowColrng = HiddenRowColrng.Offset(AdjustedIncrement, 0)
    > End if
    > End Select
    > '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    > Private Sub CellAddressPass(rng As Range)
    > Dim a As String
    > Dim b As String
    >
    > a = Cell.Parent.Name & "!" & Cell.Address(0, 0)
    > b = "'" & Workbooks(OriginalWorkbook).Path & "\[" &
    > Workbooks(OriginalWorkbook).Name & "]" & _
    > Cell.Parent.Name & "'!" &
    > Cell.Address(0, 0)
    >
    >
    > rng.Parent.Hyperlinks.Add Anchor:=rng, Address:="", _
    > SubAddress:=b, _
    > TextToDisplay:=a
    >
    > End Sub



  4. #4
    ExcelMonkey
    Guest

    RE: Routine running slow (memory leak?)

    So I am still not sure how to address this. The purpose of my question is
    based on the idea that my routine may be running slow due to me not resetting
    my variables.

    I have simplified my example. The goal being to find 3 attributes in a
    spreadsheet (say formulas, erros and validation). Upon finding these
    attributes, the cell address of the cell they are found in is pasted into a
    sheet whose name I have passed to the variable "AuditShtName". Just assume
    the sheet exists.

    In the first sub, ListAuditResults, I set up the 3 past ranges using the Set
    command up front to paste all the cell addresses that I find that exhibits
    these 3 attributes. I then run a loop which loops through sheets, within
    that loop I loop through the Attributes (1-3) and within that loop I loop
    through each cell in the .UsedRange.

    Now its not clear to me where I would re-set my paste ranges (in the spirit
    of no memory leak) as I need them all the time until the routine ends. If
    you look at the sub called MainAudit, every time the Case = 1, I will need
    the variable "Hardrng" to have retained its Setting as this tells the routine
    where to paste the results upon a test of TRUE. This variable updates every
    time the logic test = TRUE. Its this incrementing of +1 each time that
    allows the routine to paste to the growing column of pasted values on the
    "AuditShtName". I don't think I can put the following statement anwhere in
    this sub:

    Set Hardrng = Nothing
    Set Errrng =Nothing
    Set Validrng=Nothing

    as these will prevent the sub from knowing where to paste the addresses it
    finds. And these cases will be run repeatedly. Each sheet will be evaluted
    for all three cases.

    Where can I reset my variables? Has my structure prevented me from being
    able to do this? That is if I had set it up where it looped through:
    attributes/sheets/cells, then I would know that when the first case was
    completed, it would never run again and I could put "Set Hardrng = Nothing"
    within Case 2. But as I have set it up as sheet/attributes/cells, all the
    cases will run and will always need the info in the Set variables associated
    with each case.

    Any thoughts?

    Thanks again

    EM


    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'Define Public Variables
    Public AuditShtName As String
    Public Cell As Range

    'Set 3 Past Range Variables
    Public Hardrng As Range
    Public Errrng As Range
    Public Validrng As Range
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Sub ListAuditResults ()
    Dim ObjFind As String
    Dim PasteStartCell As String
    Dim sh As Worksheet

    With Workbook

    PasteStartCell = Range("B2").Address 'in paste sheet

    'Set Statements for 3 paste targets let routine know where to print results
    Set Hardrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,1)
    Set Errrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,2)
    Set Validrng=.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,3)


    For Each sh In ActiveWorkbook.Worksheets
    For AuditTypes = 1 To 3
    For Each Cell In sh.UsedRange
    Call MainAudit(AuditTypes)
    Next
    End Select
    Next
    Next
    End With
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Sub MainAudit(X As Integer)
    Dim PasteRowIncrement As Double

    PasteRowIncrement = 1

    Select Case X
    Case Is = 1
    If FormulaHasConstant(Cell) Then
    Call CellAddressPass(Hardrng)
    AdjustedIncrement = Increment(PasteRowIncrement)
    Set Hardrng = Hardrng.Offset(AdjustedIncrement, 0)
    End If
    Case Is = 2
    If CellHasError(Cell) = True Then
    Call CellAddressPass(Errrng)
    AdjustedIncrement = Increment(PasteRowIncrement)
    Set Errrng = Errrng.Offset(AdjustedIncrement, 0)
    End If
    Case Is = 3
    If CellHasValidation(Cell) Then
    Call CellAddressPass(Validrng)
    AdjustedIncrement = Increment(PasteRowIncrement)
    Set Validrng = Validrng.Offset(AdjustedIncrement, 0)
    End If
    End Select
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Function Increment(X As Double)

    Increment = 1

    End Function
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Sub CellAddressPass(rng As Range)
    Dim a As String
    Dim b As String

    a = Cell.Parent.Name & "!" & Cell.Address(0, 0)
    b = "'" & Workbooks(OriginalWorkbook).Path & "\[" &
    Workbooks(OriginalWorkbook).Name & "]" & _
    Cell.Parent.Name & "'!" &
    Cell.Address(0, 0)


    rng.Parent.Hyperlinks.Add Anchor:=rng, Address:="", _
    SubAddress:=b, _
    TextToDisplay:=a

    End Sub



    "Gary L Brown" wrote:

    > 1) Always re-set your 'Set's.
    > What I do is to put the re-set's just before the end of the program along
    > with an on error stmt so the re-set's don't get hung up. For example...
    >
    > Sub Test
    > Set Comrng = .Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,0)
    > Set Hardrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,1)
    > ''''other code''''
    > On Error Resume Next
    > Set Comrng = Nothing
    > Set Hardrng = Nothing
    > End Sub
    >
    > Or, since the ranges may be used throughout the module, put the Set
    > ...=Nothing in the procedure that is run when you no longer need the ranges
    > defined.
    >
    > 2) If your coding is all within one module, why not use 'Dim' or 'Private'
    > before the first procedure in the module so that the variable will be known
    > throughout the module but not carried in memory like 'Public' does.
    > The 'Public' declaration gives the variable scope in ALL modules.
    >
    > HTH,
    > --
    > Gary Brown
    > gary_brown@ge_NOSPAM.com
    > If this post was helpful, please click the ''Yes'' button next to ''Was this
    > Post Helpfull to you?''.
    >
    >
    > "ExcelMonkey" wrote:
    >
    > > I have a very large add-in that I build which is running very slow. In fact
    > > it crashes excel if I run too many times. I am questioning the structure I
    > > have used. I am wondering if the speed has something to do with either:
    > > 1) "Public Variables" or
    > > 2) the use of "Set" statement
    > >
    > > I have been reading about memory leak in the new book by Bullen/Bovey/Green
    > > (page 184) and their comments on memory reclaim. Not sure if it applies here
    > > or not.
    > >
    > > The routine effectively:
    > > 1) sets up 19 paste ranges, declares a public variable "Cell" and then loops
    > > through every cell in the UsedRange of every sheet in the spreadsheet
    > > (ListAuditResults Sub)
    > > 2) tests for 19 attributes (MainAudit Sub) - 1 at a time.
    > > 3) If the attribute is found (TRUE) then the routine pastes the cell address
    > > of the variable "Cell" to a named paste range (CellAddressPass Sub) set up
    > > earlier in the routine. This paste range increments on each successive
    > > round. So effectively the routine checks every cell for attribute 1 and then
    > > does it all over again for 2,3,4,5-19.
    > >
    > > With regards to the memory leak issue, do I need to do something with the 19
    > > paste range variables to reduce memory leak?
    > >
    > > The code below is a rough representation of the routine. I have left out
    > > many details as the does code works - its just slow. Note that I have only
    > > provided details for Case 19 in the MainAudit Sub. All 19 have a Set
    > > statement which increments the paste range for the attribute associated with
    > > each Case.
    > >
    > > Thanks in advance!
    > > EM
    > >
    > > ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    > > 'Define Public Variables
    > >
    > > Public Cell As Range
    > >
    > > 'Set 19 Past Range Variables
    > > Public Comrng As Range
    > > Public Hardrng As Range
    > > Public Errrng As Range
    > > Public Colrnge As Range
    > > Public Validrng As Range
    > > Public ValidErrrng As Range
    > > Public ExtLinkrng As Range
    > > Public Inputrng As Range
    > > Public CirCellrng As Range
    > > Public CondFormrng As Range
    > > Public FormTyperng As Range
    > > Public FontSizerng As Range
    > > Public FontTyperng As Range
    > > Public NumFormatrng As Range
    > > Public NamedCellrng As Range
    > > Public SpecSearchrng As Range
    > > Public FontIntColrng As Range
    > > Public ProtectedCellrng As Range
    > > Public ColouredFontCellrng As Range
    > > Public HiddenRowColrng As Range
    > >
    > > '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    > > 'Main Loop Structure
    > > Dim ObjFind As String
    > > Dim PasteStartCell As String
    > >
    > > With Workbook
    > >
    > > PasteStartCell = Range("B2").Address
    > >
    > > 'Set Statements for 19 paste targets let routine know where to print results
    > > Set Comrng = .Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,0)
    > > Set Hardrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,1)
    > > Set Errrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,2)
    > > Set Validrng=.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,3)
    > > Set ValidErrrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,4)
    > > Set ExtLinkrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,5)
    > > Set Inputrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,6)
    > > Set CirCellrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,7)
    > > Set CondFormrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,8)
    > > Set FormTyperng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,9)
    > > Set FontSizerng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,10)
    > > Set FontTyperng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,11)
    > > Set NumFormatrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,12)
    > > Set NamedCellrng =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,13)
    > > Set SpecSearchrng
    > > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,14)
    > > Set FontIntColrng
    > > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,15)
    > > Set ProtectedCellrng
    > > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,16)
    > > Set ColouredFontCellrng
    > > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,17)
    > > Set HiddenRowColrng
    > > =.Worksheets(AuditShtName).Range(PasteStartCell).Offset(0,18)
    > >
    > > For Each sh In ActiveWorkbook.Worksheets
    > > For AuditTypes = 1 To 19
    > > For Each Cell In sh.UsedRange
    > > Call MainAudit(ChkbxCtrlFind)
    > > Next
    > > End Select
    > > Next
    > > Next
    > > End With
    > > ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    > > Private Sub MainAudit(X As Integer)
    > > Select Case X
    > > Case Is = 1
    > > Case Is = 2
    > > Case Is = 3
    > > Case Is = 4
    > > Case Is = 5
    > > Case Is = 6
    > > Case Is = 7
    > > Case Is = 8
    > > Case Is = 9
    > > Case Is = 10
    > > Case Is = 11
    > > Case Is = 12
    > > Case Is = 13
    > > Case Is = 14
    > > Case Is = 15
    > > Case Is = 16
    > > Case Is = 17
    > > Case Is = 18
    > > Case Is = 19
    > > IF Cell............................Then
    > > Call CellAddressPass(HiddenRowColrng)
    > > AdjustedIncrement = Increment(PasteRowIncrement)
    > > Set HiddenRowColrng = HiddenRowColrng.Offset(AdjustedIncrement, 0)
    > > End if
    > > End Select
    > > '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    > > Private Sub CellAddressPass(rng As Range)
    > > Dim a As String
    > > Dim b As String
    > >
    > > a = Cell.Parent.Name & "!" & Cell.Address(0, 0)
    > > b = "'" & Workbooks(OriginalWorkbook).Path & "\[" &
    > > Workbooks(OriginalWorkbook).Name & "]" & _
    > > Cell.Parent.Name & "'!" &
    > > Cell.Address(0, 0)
    > >
    > >
    > > rng.Parent.Hyperlinks.Add Anchor:=rng, Address:="", _
    > > SubAddress:=b, _
    > > TextToDisplay:=a
    > >
    > > End Sub


+ Reply to Thread

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