2014-02-20 4 views
13

Я работаю над кодом, чтобы в основном просматривать каждый лист в моей книге, а затем обновлять ширину столбцов. Ниже приведен код, который я написал; Я не получаю никаких ошибок, но он на самом деле ничего не делает. Любая помощь очень ценится!Excel VBA для каждой строки рабочего стола

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 
+0

теперь это работает по предположению и может быть неправильным, но вместо вашего юга вы можете использовать 'ws.Columns (« A: O »). AutoFit', если это то, что вы пытаетесь сделать. – user2140261

ответ

22

Попробуйте немного изменить код:

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 

Примечание, resizingColumns процедура занимает Parametr - рабочий лист, к которому принадлежит Ranges.

В основном, когда вы используете Range("O:O") - код operats с диапазоном от ActiveSheet, поэтому вы должны использовать With ws заявление и затем .Range("O:O").

И нет никакой необходимости использовать глобальные переменные (если не использовать их где-то еще)

2

Вы должны поместить идентификатор листа в операторах диапазона, как показано ниже ...

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 
+1

@simoco опубликовал более сжатую версию моего ответа. Должен ли я удалить мою? – Jacob

+1

нет, вы не должны: –

4

Попробуйте это более лаконичный код:

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 to 15 на 1 to X где X - это индекс столбца нужного столбца и добавьте размер столбца, который вы хотите, StrSize.

Например, если вы хотите P:P иметь ширину 25, просто добавьте ;25 в StrSize и изменить ColIter... к ColIter = 1 to 16.

Надеюсь, это поможет.

+2

+1 для более короткого кода :) Я также подумал об этом подходе) –

+3

другим способом является использование 'Array (20.14.9.71, ..)' вместо строки + split :) –

+2

Более короткий код, но будет использовать больше памяти и будет немного медленнее. Короче это не значит лучше. – user2140261

-2

Вместо добавления "ws." перед каждым диапазоном, как было предложено выше, вы можете добавить «ws.activate» перед вызовом.

Это приведет вас к рабочему листу, над которым вы хотите работать.

+0

Я бы советовал против этой практики, поскольку она подвержена ошибкам. Явное определение рабочего листа для каждого диапазона или команды гарантирует, что рабочая таблица propper используется для выполнения. При использовании активации пользователь может вручную выбрать другой рабочий лист во время выполнения, а ваш код отключиться. Также лучше добавить это как комментарий вместо ответа, так как он действительно не отвечает на вопрос. – Luuklag

Смежные вопросы