Not tested

I used Option Explicit

If you are not using Worksheet_Change or other events, you don't need to disable them

Sh is Dim-ed as a Worksheet

To avoid issues with empty strings, I like to use Len() = 0 as a check (it might be a 0 length string)

To avoid issues with a non-empty string that consists of spaces, I like to use Trim()


For number based WS looping, I've found it's easier for me to use .Cells(r, c) instead of something like Range("A" & i)

To answer your question, look at Next q and Next Sh below to see how a nested loop works

My thoughts

Option Explicit


Sub RemoveBlankCells2()
    Dim strLR2 As String
    Dim q As Long
    Dim Sh As Worksheet


    For Each Sh In Sheets(Array("Fire", "FA Def", "FA NA", "Sprinkler", "Sprinkler Def", "Sprinkler NA", "Suppression", "Suppression Def", "Suppression NA", "Inspections"))
        With Sh
            strLR2 = .Range("A" & .Rows.Count).End(xlUp).Row


            For q = 2 To strLR2
                If Len(Trim(.Cells(q, 9).Value)) = 0 Then .Cells(q, 9).ClearContents
            Next q
        End With
    Next Sh


End Sub