2016-04-12 2 views
1

Вчера я решил изучить VBA, чтобы облегчить мое преимущество. Это происходит лучше, чем ожидалось, но я уже много часов ломаю зубы по этому коду.excel VBA Цитирование через рабочие листы: ActiveWorkbook.Worksheets (I)?

Я пытаюсь удалить все пустые (кроме заголовка) столбцы, и это на всех листах книги. После многих поисковых запросов мне удалось найти несколько примеров, которые я мог бы приспособить к моим потребностям.

Я использовал этот код: remove columns , а затем попытался петлю ее через листы с помощью дорогой старый Microsoft support

Вместе я frankensteined его в этом:

Sub WorksheetLoop() 

Dim WS_Count As Integer 
Dim I As Integer 
Dim MyRange As Range 
Dim iCounter As Long 

WS_Count = ActiveWorkbook.Worksheets.Count 
For I = 1 To WS_Count 

'removecode 

    ' Define the target Range. 
     Set MyRange = ActiveWorkbook.Worksheets(I).UsedRange 

    'Start reverse looping through the range. 
    For iCounter = MyRange.Columns.Count To 1 Step -1 

    'If entire column is empty then delete it. 
    If Application.CountA(Columns(iCounter).EntireColumn) = 1 Then 
    Columns(iCounter).Delete 
    End If 

    Next iCounter 

'endremovecode 

     MsgBox ActiveWorkbook.Worksheets(I).Name 

    Next I 

    End Sub 

Когда я запускаю это, только начальный рабочий лист очищается. Ящик сообщений проделывает все их.

Почему? Что я делаю не так? Я пробовал найти решение, но не те темы здесь, казалось, дали больше ясности.

Благодарим вас за то, что вы ведете меня в правильном направлении.

Лара

+0

не ответ на ваш вопрос, но вы должны рассмотреть возможность изменения вашего цикла к для каждого, например: для каждого WS в ActiveWorkbook.Worksheets. –

ответ

2
Columns(iCounter).EntireColumn 

и

Columns(iCounter).Delete 

не с префиксом MyRange так ссылаться на столбцы активного листа не листа, содержащего MyRange. Stick MyRange. infront из них.

+0

что ... было полностью. Теперь я чувствую себя глупо. – Lara

1

Вы почти у цели. Вам просто нужно квалифицировать свой application.counta, а также ваш .columns().delete., поэтому каждый из них работает непосредственно с листом, о котором идет речь. В противном случае он просто работает с активным листом.

Попробуйте это:

Sub WorksheetLoop() 

Dim WS_Count As Integer 
Dim I As Integer 
Dim MyRange As Range 
Dim iCounter As Long 
Dim ws As Worksheet 

WS_Count = ActiveWorkbook.Worksheets.Count 

For I = 1 To WS_Count 
    Set ws = ActiveWorkbook.Worksheets(I) 
    'removecode 

    With ws 
    ' Define the target Range. 
     Set MyRange = .UsedRange 

     'Start reverse looping through the range. 
     For iCounter = MyRange.Columns.Count To 1 Step -1 

      'If entire column is empty then delete it. 
      If Application.CountA(.Columns(iCounter).EntireColumn) = 0 Then 
      .Columns(iCounter).Delete 
      End If 

     Next iCounter 
    End With 

'endremovecode 

     MsgBox ws.Name 

    Next I 

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