2013-09-18 3 views
1

Я пытаюсь запустить ту же функцию цикла While While на нескольких рабочих листах в книге и скомпилировать данные на другом листе. Код работает для одного рабочего листа, который указан, но как я могу заставить его работать с другими, которые находятся в книге одновременно? Также стоит упомянуть, что я только хочу, чтобы он работал на некоторых листах не все, что содержится в книге (листы называются годами - 2014, 2015 и т. Д.).Необходимо запустить цикл While While на нескольких листах

Это код

Sub Total_Button1_Click()

Dim я As Integer

Dim strSheetFrom As String

Dim j As Integer 
Dim strSheetTo As String 


i = 3 
j = 2 

strSheetFrom = "2014" 
strSheetTo = "Total" 

Do While Trim(Sheets(strSheetTo).Range("B" & CStr(j)).Text) <> "" 
    j = j + 2 
Loop 

Do While Trim(Sheets(strSheetFrom).Range("B" & CStr(i)).Text) <> "" 
    If UCase(Trim(Sheets(strSheetFrom).Range("A" & CStr(i)).Text)) = "Y" Then 
     Sheets(strSheetTo).Range("B" & j & ":G" & j).Value = Sheets(strSheetFrom).Range("B" & i & ":G" & i).Value 
     Sheets(strSheetTo).Range("H" & j & ":I" & j).Value = Sheets(strSheetFrom).Range("I" & i & ":J" & i).Value 
     Sheets(strSheetTo).Range("J" & j & ":J" & j).Value = Sheets(strSheetFrom).Range("L" & i & ":L" & i).Value 
     Sheets(strSheetTo).Range("K" & j & ":K" & j).Value = Sheets(strSheetFrom).Range("Q" & i & ":Q" & i).Value 
     Sheets(strSheetTo).Range("L" & j & ":AH" & j).Value = Sheets(strSheetFrom).Range("s" & i & ":AO" & i).Value 
     j = j + 1 
    End If 
    i = i + 1 
Loop 

MsgBox "Total book created" 

End Sub

+0

Каковы условия, которые должны выполняться именами WorkSheet, чтобы код знал, что он должен работать на этом листе? Между началом и концом года? любой рабочий лист с 4 номерами для имени? – user2140261

ответ

0

Используйте для каждого и перебирать коллекции Worksheet как это

'Variables 
Dim useWorkSheet As Worksheet 
Dim totalWorkSheet As Worksheet 
Dim yearAsNumeric As Integer 
Dim startingYear As Integer 

'Settings 
startingYear = 2014 

'To reference the total worksheet so we can work with it 
Set totalWorkSheet = ActiveWorkbook.Worksheets("Total") 

'Iterate over each item in the collection 
For Each useWorkSheet In ActiveWorkbook.Worksheets 
    'Force the name into a numeric value. If it starts with anything non numeric (A-Z|a-z|$,#,etc) then it will return 0 
    yearAsNumeric = Val(useWorkSheet.Name) 

    'Greater than or equal to the year we want to start with? 
    If yearAsNumeric >= startingYear Then 
     'Yes. Do your stuff here 
     useWorkSheet.Name 
    End If 
Next 
0

Попробуйте сделать вашу переменную strSheetFrom в нечто вроде этого массива:

strSheetFrom = new strSheetFrom[3] 
strSheetFrom[2] = "2012" 
strSheetFrom[1] = "2013" 
strSheetFrom[0] = "2014" 

Затем поместить свой код в другую петлю, как так:

dim w as integer 
for w = 0 To 3 

Do While Trim(Sheets(strSheetTo).Range("B" & CStr(j)).Text) <> "" 
j = j + 2 
Loop 

Do While Trim(Sheets(strSheetFrom[w]).Range("B" & CStr(i)).Text) <> "" 
If UCase(Trim(Sheets(strSheetFrom[w]).Range("A" & CStr(i)).Text)) = "Y" Then 
    Sheets(strSheetTo).Range("B" & j & ":G" & j).Value = Sheets(strSheetFrom[w]).Range("B" & i & ":G" & i).Value 
    Sheets(strSheetTo).Range("H" & j & ":I" & j).Value = Sheets(strSheetFrom[w]).Range("I" & i & ":J" & i).Value 
    Sheets(strSheetTo).Range("J" & j & ":J" & j).Value = Sheets(strSheetFrom[w]).Range("L" & i & ":L" & i).Value 
    Sheets(strSheetTo).Range("K" & j & ":K" & j).Value = Sheets(strSheetFrom[w]).Range("Q" & i & ":Q" & i).Value 
    Sheets(strSheetTo).Range("L" & j & ":AH" & j).Value = Sheets(strSheetFrom[w]).Range("s" & i & ":AO" & i).Value 
    j = j + 1 
End If 
i = i + 1 
Loop 

w -= 1 
next 

Я не проверял, но что-то вроде того. Вы поняли эту идею.

+0

Спасибо - с некоторыми незначительными изменениями это сработало. – user2793046

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