Studento919
Studento919

Reputation: 635

Trim all cells within a workbook(VBA)

I have attempted to add functionality to an excel add-in ave been developing which trims the leading spaces at the end of used cells, and maybe even parse the text, The reason I need to do this is simply to have it turn into a hyperlink which I have already working but that parts fine.

This is what I have attempted so far, I have it trimming the active.worksheet am on which is fine but I can't figure out how to:

  1. Trim Every cell being used across the whole workbook.
  2. And also parse the text if possible

This is my attempt at Trimming the entire workbook, Its something simple I just know it, I just cant figure it out:

Sub DoTrim(Wb As Workbook)
Dim cell As Range
Dim str As String
Dim nAscii As Integer
Dim wsh As Worksheet

For Each wsh In Worksheets
    With wsh.UsedRange
        For Each cell In ActiveSheet.UsedRange
            str = Trim(cell)
             If Len(str) > 0 Then
                        nAscii = Asc(Left(str, 1))
                        If nAscii < 33 Or nAscii = 160 Then
                            If Len(str) > 1 Then
                              str = Right(str, Len(str) - 1)
                            Else
                                str = ""
                            End If
                        End If
                    End If
                    cell = str
        Next cell
    End With
Next wsh
End Sub

Any advice would be welcome am fairly new to this Language so sorry if I sound like a complete Newb!

TL;DR Trims cells only worksheet am on, needs to run across whole workbook I cant figure out how to iterate it across the whole thing.

EDIT: Is that also a quicker way of trimming these cells, the spreadsheets that are created for whom am designing this are massive and takes a while to trim the cells at times

Upvotes: 3

Views: 14029

Answers (2)

Siddharth Rout
Siddharth Rout

Reputation: 149295

Try this

Sub DoTrim(Wb As Workbook)
    Dim aCell As Range
    Dim wsh As Worksheet
    
    '~~> If you are using it in an Add-In, it is advisable 
    '~~> to keep the user posted :)
    Application.StatusBar = "Processing Worksheets... Please do not disturb..."
    DoEvents
    
    Application.ScreenUpdating = False
    
    For Each wsh In Wb.Worksheets
        With wsh
            Application.StatusBar = "Processing Worksheet " & _
                                    .Name & ". Please do not disturb..."
            DoEvents
            
            For Each aCell In .UsedRange
                If Not aCell.Value = "" And aCell.HasFormula = False Then
                    With aCell
                        .Value = Replace(.Value, Chr(160), "")
                        .Value = Application.WorksheetFunction.Clean(.Value)
                        .Value = Trim(.Value)
                    End With
                End If
            Next aCell
        End With
    Next wsh
    
    Application.ScreenUpdating = True
    Application.StatusBar = "Done"
End Sub

Upvotes: 9

MarkHone
MarkHone

Reputation: 381

I agree with Siddarth:

For Each cell In ActiveSheet.UsedRange

Should be:

For Each cell In wsh.UsedRange

I would have thought you should be able to remove with 'With wsh.UsedRange' statement around the loop as well.

As you are passing in a WorkBook reference, perhaps you should consider changin your outer For loop from:

For Each wsh In Worksheets

to:

For Each wsh In Wb.Worksheets

Upvotes: 6

Related Questions