Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
每个工作表循环的Excel VBA_Excel_Vba_For Loop_Each_Worksheet - Fatal编程技术网

每个工作表循环的Excel VBA

每个工作表循环的Excel VBA,excel,vba,for-loop,each,worksheet,Excel,Vba,For Loop,Each,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

我正在编写代码,以便基本上遍历工作簿中的每一页,然后更新列宽。下面是我写的代码;我没有收到任何错误,但它实际上也没有做任何事情。非常感谢您的帮助

 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

尝试稍微修改您的代码:

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
注意,
调整列的大小
例程接受范围所属的参数-工作表

基本上,当您使用
Range(“O:O”)
-code操作符和ActiveSheet中的Range时,这就是为什么您应该在ws语句中使用
,然后使用
.Range(“O:O”)


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

您需要将工作表标识符放入范围语句中,如下所示

 Option Explicit
 Dim ws As Worksheet, a As Range

Sub forEachWs()

For Each ws In ActiveWorkbook.Worksheets
Call resizingColumns
Next

End Sub

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

请尝试以下更简洁的代码:

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
如果您想要额外的列,只需将
1更改为15
更改为
1到X
,其中
X
是所需列的列索引,并附加要
StrSize
的列大小

例如,如果希望
p:p
的宽度为
25
,只需添加
;25
标准化
并将
ColIter…
更改为
ColIter=1至16

希望这能有所帮助。

而不是像上面建议的那样在每个范围之前添加“ws” 改为在调用之前使用“ws.activate”


这会让你进入你想要的工作表。

@simoco发布了我的答案的更简洁版本。我应该删除我的吗?另一种方法是使用
Array(20.14,9.71,…)
而不是string+split:)较短的代码,但会占用更多内存,速度会稍微慢一些。更短并不意味着更好。是的,这就是为什么我保留了那个“声明”,lol。然而,除非用户想对几十个工作表和数百个列执行此操作,否则我认为更新此操作要容易得多(至少如果您知道列索引并且不被
StrSize
,harhar搞糊涂的话)。在我这方面,它在一个相对的瞬间完成了3张纸。:)现在,这是基于假设运行的,可能是错误的,但是如果您正试图这样做,您可以使用
ws.Columns(“A:O”).AutoFit来代替sub。我建议您不要使用这种做法,因为它容易出错。明确定义每个范围或命令的工作表可确保使用propper工作表执行。当使用“激活”时,用户可以在执行过程中手动选择另一个工作表,代码将自动关闭。另外,你最好把它作为一个评论而不是一个答案,因为它实际上并不能回答眼前的问题。