每个工作表循环的Excel VBA

Dak*_*ota 18 excel each vba for-loop worksheet

我正在处理代码,基本上遍历我的工作簿中的每个工作表,然后更新列宽.以下是我写的代码; 我没有收到任何错误,但它实际上也没有做任何事情.任何帮助是极大的赞赏!

 Option Explicit
 Dim ws As Worksheet, a As Range

Sub forEachWs()

For Each ws In ActiveWorkbook.Worksheets
Call resizingColumns
Next

End Sub

Sub resizingColumns()
Range("A:A").ColumnWidth = 20.14
Range("B:B").ColumnWidth = 9.71
Range("C:C").ColumnWidth = 35.86
Range("D:D").ColumnWidth = 30.57
Range("E:E").ColumnWidth = 23.57
Range("F:F").ColumnWidth = 21.43
Range("G:G").ColumnWidth = 18.43
Range("H:H").ColumnWidth = 23.86
Range("i:I").ColumnWidth = 27.43
Range("J:J").ColumnWidth = 36.71
Range("K:K").ColumnWidth = 30.29
Range("L:L").ColumnWidth = 31.14
Range("M:M").ColumnWidth = 31
Range("N:N").ColumnWidth = 41.14
Range("O:O").ColumnWidth = 33.86
End Sub
Run Code Online (Sandbox Code Playgroud)

Dmi*_*liv 27

尝试稍微修改您的代码:

Sub forEachWs()
    Dim ws As Worksheet
    For Each ws In ActiveWorkbook.Worksheets
        Call resizingColumns(ws)
    Next
End Sub

Sub resizingColumns(ws As Worksheet)
    With ws
        .Range("A:A").ColumnWidth = 20.14
        .Range("B:B").ColumnWidth = 9.71
        .Range("C:C").ColumnWidth = 35.86
        .Range("D:D").ColumnWidth = 30.57
        .Range("E:E").ColumnWidth = 23.57
        .Range("F:F").ColumnWidth = 21.43
        .Range("G:G").ColumnWidth = 18.43
        .Range("H:H").ColumnWidth = 23.86
        .Range("i:I").ColumnWidth = 27.43
        .Range("J:J").ColumnWidth = 36.71
        .Range("K:K").ColumnWidth = 30.29
        .Range("L:L").ColumnWidth = 31.14
        .Range("M:M").ColumnWidth = 31
        .Range("N:N").ColumnWidth = 41.14
        .Range("O:O").ColumnWidth = 33.86
    End With
End Sub
Run Code Online (Sandbox Code Playgroud)

注意,resizingColumns例程需要参数 - Ranges所属的工作表.

基本上,当你使用Range("O:O")- 具有ActiveSheet范围的代码操作时,这就是你应该使用With ws语句的原因.Range("O:O").

并且不需要使用全局变量(除非您在其他地方使用它们)


Jer*_*ino 5

试试这个更简洁的代码:

Sub LoopOverEachColumn()
    Dim WS As Worksheet
    For Each WS In ThisWorkbook.Worksheets
        ResizeColumns WS
    Next WS
End Sub

Private Sub ResizeColumns(WS As Worksheet)
    Dim StrSize As String
    Dim ColIter As Long
    StrSize = "20.14;9.71;35.86;30.57;23.57;21.43;18.43;23.86;27.43;36.71;30.29;31.14;31;41.14;33.86"
    For ColIter = 1 To 15
        WS.Columns(ColIter).ColumnWidth = Split(StrSize, ";")(ColIter - 1)
    Next ColIter
End Sub
Run Code Online (Sandbox Code Playgroud)

如果你想其他列,只是改变1 to 151 to X这里X是你想要的列的列索引,并添加你想要的列大小StrSize.

例如,如果你想P:P拥有的宽度25,只需添加;25StrSize和更改ColIter...ColIter = 1 to 16.

希望这可以帮助.

  • 另一种方法是使用`Array(20.14,9.71,..)`而不是string + split :) (3认同)
  • 为更短的代码+1 :)我也考虑过这种方法) (2认同)
  • 代码较短但会使用更多内存并且速度稍慢.更短并不意味着更好. (2认同)