简体   繁体   中英

VBA Create List to Loop ClearContents

I have an overly long block of code that I would like suggestions on how to clean up, because I clearly wrote it in the least efficient way.

Ideally, I am looking for suggestions on how to define the worksheets/ranges that clearcontents will run on as a list, then loop through each and run the script.

How might this best be accomplished?

I appreciate any help you might be able to provide.

Sub ClearContents()

    Sheets("Control1").Select
    Cells.Select
    Selection.ClearContents

    Sheets("Control2").Select
    Cells.Select
    Selection.ClearContents

    Sheets("Data").Select
    Range("A8").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents

    Sheets("S1P1").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents

    Sheets("S1P2").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents

    Sheets("S1P3").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents

    Sheets("S1P4").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents

    Sheets("S1P5").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents

    Sheets("S1P7").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents

    Sheets("S2P1").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents

    Sheets("S2P4").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents

    Sheets("S2P8").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents

    Sheets("S3P1").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents

    Sheets("S4P11").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents

    Sheets("S5P2").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents

    Sheets("S1P8").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents

    Sheets("S1P8").Select
    Range("G2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents

    Sheets("S5P10").Select
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents

    Sheets("S5P10").Select
    Range("L2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents

End Sub

I have some advice to improve your code:

  1. Avoid using .Select . This will slow your macro. You can clear the contents using:

     Worksheets("S5P10").Range("L2").Clear 
  2. Use fully qualified names. Ex. Worksheets("Sheet1")

  3. You can write a reusable procedure:

     Sub ClearContents(oSheet as String, oRange as String) Worksheets(oSheet).Range(oRange).Clear End Sub 

Then, you can call your procedure using a loop with an array or just providing Sheet and Range

Call ClearContents("S5P10", "L2")
Sub ClearSomeSheets()
Dim ws as worksheet
For each ws in thisworkbook.worksheets
select case ws.name
case "Control1","Control2",
   ws.usedrange.clearcontents
case "Data"

    ws.Range(ws.Range("A8"), ws.Range("A8").End(xlToRight).End(xlDown)).ClearContents

case "S1P1","S1P8" 'etc....
   ws.Range(ws.Range("A2"), ws.Range("A2").End(xlToRight).End(xlDown)).ClearContents

end select
next ws
end sub

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM