2017-01-08 5 views
0

Я пытаюсь использовать определенный диапазон для циклического перехода через автоматический фильтр для копирования данных, а затем цикл через массив диапазонов, где я хочу вставить значение данных.Вложенные петли не работают, не удается выйти из внутреннего цикла

im работает с проблемами, поскольку внутренний цикл продолжает выполняться, и все диапазоны имеют одинаковые значения.

думать, что мне как-то нужно конденсировать это до 1 цикла, но для жизни меня не может понять, как заставить оба увеличиваться вместе в одном цикле?

Sub TrendTables() 

Dim rng As Range, dailyTrendrng As Long, c As Range 
Dim lastrow As Long 

Dim aTrendRng(1 To 16) As Range 

Set aTrendRng(1) = Sheets("Daily Trends").Range("A2") 
Set aTrendRng(2) = Sheets("Daily Trends").Range("K2") 
Set aTrendRng(3) = Sheets("Daily Trends").Range("A29") 
Set aTrendRng(4) = Sheets("Daily Trends").Range("K29") 
Set aTrendRng(5) = Sheets("Daily Trends").Range("A56") 
Set aTrendRng(6) = Sheets("Daily Trends").Range("K56") 
Set aTrendRng(7) = Sheets("Daily Trends").Range("A83") 
Set aTrendRng(8) = Sheets("Daily Trends").Range("K83") 
Set aTrendRng(9) = Sheets("Daily Trends").Range("A110") 
Set aTrendRng(10) = Sheets("Daily Trends").Range("K110") 
Set aTrendRng(11) = Sheets("Daily Trends").Range("A137") 
Set aTrendRng(12) = Sheets("Daily Trends").Range("K137") 
Set aTrendRng(13) = Sheets("Daily Trends").Range("A164") 
Set aTrendRng(14) = Sheets("Daily Trends").Range("K164") 
Set aTrendRng(15) = Sheets("Daily Trends").Range("A191") 
Set aTrendRng(16) = Sheets("Daily Trends").Range("K191") 


'clear ranges on Daily Trends tab 
Set rng = Sheets("Daily Trends").Range("A2:S24, A29:S51, A56:S78, A83:S105, A110:S132, A137:S159, A164:S186, A191:S213") 
rng.ClearContents 

'turn off any previous filters 
If Sheets("daily dump").AutoFilterMode Then 
    Sheets("daily dump").AutoFilter.Range.AutoFilter 
End If 


With Sheets("daily dump") 
    lastrow = .Cells(Rows.Count, "A").End(xlUp).Row 
End With 

Set c = Sheets("mapping").Range("BG1:BG16") 

For Each c In Sheets("mapping").Range("BG1:BG16") 

Sheets("daily dump").Range("A4:P" & lastrow).AutoFilter Field:=4, Criteria1:="=" & c.Value 
Sheets("daily dump").Range("A4:P" & lastrow).SpecialCells(xlCellTypeVisible).Copy 

    For dailyTrendrng = LBound(aTrendRng) To UBound(aTrendRng) 
     aTrendRng(dailyTrendrng).PasteSpecial xlValues 
    Next 


''''''this is where i want to go back to my first "FOR LOOP" 


Next 

End Sub 
+0

Правильно ли я понимаю, что вы собираетесь копировать диапазоны (по крайней мере, одну строку высокого и 16 столбцов (AP) шириной в одну ячейку?) Так как это выглядит так: или вы хотите вставить значения в соответствии с порядок, например, результат из ячейки A в диапазоне отфильтрования до 'aTrendRng (1)', от ячейки B до 'aTrendRng (2)' и т. д. И вы можете удалить строку 'Set c = Sheets (« mapping ») .Range ("BG1: BG16") ', поскольку c используется как экземпляр диапазона для каждого цикла. – Rufus

+0

ищет вставить значения в порядке в соответствии с диапазонами, определенными массивом aTrendRng. – geoTheNeo

+0

Я хочу вставить значения в соответствии с порядком определяемый массивом aTrendRng. aka цикл завершения для фильтрации диапазона, скопировать диапазон фильтрации, запустить внутренний цикл, чтобы определить, где вставлять значения, повторять внешнюю итерацию 1x, повторить внутренний цикл int eration 1x и т. д. – geoTheNeo

ответ

0

Если вы уверены, что ваши скопированные диапазоны всегда будут вписываться в области назначения х 10 колонной 27 строки, следующий код был переработан, чтобы использовать только один цикл:

Sub TrendTables() 

    Dim rng As Range, dailyTrendrng As Long, c As Range 
    Dim lastrow As Long 
    Dim mappingRow As Long 
    Dim aTrendRng As Variant 

    aTrendRng = Array("A2", "K2", _ 
         "A29", "K29", _ 
         "A56", "K56", _ 
         "A83", "K83", _ 
         "A110", "K110", _ 
         "A137", "K137", _ 
         "A164", "K164", _ 
         "A191", "K191") 

    'clear ranges on Daily Trends tab 
    Set rng = Worksheets("Daily Trends").Range("A2:S24, A29:S51, A56:S78, A83:S105, A110:S132, A137:S159, A164:S186, A191:S213") 
    rng.ClearContents 

    With Worksheets("daily dump") 
     'turn off any previous filters 
     If .AutoFilterMode Then 
      .AutoFilter.Range.AutoFilter 
     End If 

     lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row 

     mappingRow = 1 
     For dailyTrendrng = LBound(aTrendRng) To UBound(aTrendRng) 
      'This line could be used if we wanted to get rid of "mappingRow", but 
      'it's a bit harder to understand 
      '.Range("A4:P" & lastrow).AutoFilter Field:=4, Criteria1:="=" & Worksheets("mapping").Range("BG" & (dailyTrendrng - LBound(aTrendRng) + 1)).Value 
      'so we will use the following line instead 
      .Range("A4:P" & lastrow).AutoFilter Field:=4, Criteria1:="=" & Worksheets("mapping").Range("BG" & mappingRow).Value 
      .Range("A4:P" & lastrow).SpecialCells(xlCellTypeVisible).Copy 
      Worksheets("Daily Trends").Range(aTrendRng(dailyTrendrng)).PasteSpecial xlValues 

      mappingRow = mappingRow + 1 
     Next 
    End With 

End Sub 

Основных изменений были:

  • Я создал дополнительную переменную (mappingRow), чтобы указать на каждую ячейку в «отображение» листа. (Я включил прокомментированную линию, которая достигла бы того же самого без дополнительной переменной, но использование дополнительной переменной, вероятно, легче понять.) Это единственное изменение, которое было действительно, необходимое для достижения того, чего вы хотели.

  • Я просто сохранил 16 адресов диапазона адресатов, а не 16 различных объектов диапазона. Казалось, было бы немного легче поддерживать этот путь.

  • Я изменил Rows.Count на .Rows.Count так, чтобы он ссылался на лист «daily_dump», а не на активный лист.

  • Я использовал Worksheets, а не Sheets везде - Sheets коллекция включает в себя Chart листов, так что, как правило, лучше практика конкретно относятся к Worksheets, когда вы знаете, что вы используете Worksheet, и использовать только Sheets, когда вы не знаете, является ли это Worksheet или Chart, на которые вы ссылаетесь.

+0

Большое спасибо за помощь, которая прекрасно работает. Это определенно дает мне кое-что, чтобы пересмотреть и узнать, что вы делали и почему. Большое вам спасибо за это. я действительно, когда с параметром, который вы закомментировали, поскольку счетчик сопоставления не увеличивался. Я благодарю вас за помощь и предлагаю эту альтернативу! – geoTheNeo

+0

@geoTheNeo - К сожалению, я забыл включить в код строку 'mappingRow = mappingRow + 1' - теперь я отредактировал ответ – YowE3K