2014-12-16 2 views
0

Я абсолютно новичок, когда дело доходит до макросов и VBA и вам нужна помощь.excel VBA loop then copy on condition

У меня есть книга с 6 рабочими листами. Первый рабочий лист («Все гранты FY15») имеет 5 столбцов («Дата», «Грант», «Тип», «Сумма» и «Категория», A2: E2). Я использую этот рабочий лист для ввода всех расходов по гранту. Остальные рабочие листы («City ESG», «County ESG», «CoC HMIS», «SSVF HMIS» и «HMIS Program Fees») имеют одинаковые столбцы в одном месте. В каждом из этих последующих рабочих листов у меня есть имя гранта (которое соответствует значению, которое будет помещено на «Все гранты FY15», B2: B500), размещенном на F2.

Я ищу способ прокрутки «Все гранты FY15», прочитайте значение в B2: B500 и скопируйте эту строку в следующую пустую строку на соответствующем листе, где F2 на этом листе равен B2 на " Все гранты FY15 ".

Это имеет смысл?

+0

Кроме того, мне нужно, чтобы он не дублировал предыдущие копии строк каждый раз, когда я запускаю его. –

+0

Вы использовали функцию 'VLOOKUP'? – TheEngineer

+0

Я просто попытался, но не могу понять, как использовать vlookup для копирования всей строки. –

ответ

0

Я добавил инструкцию IF для проверки столбца «F» на исходном листе для 0 или 1, чтобы проверить, уже ли он перемещен. Когда он перемещается, символ 1 помечен в столбце «F» (т. Е. Col # 6). Поскольку у вас есть только 5 столбцов, которые нужно переместить, я избавился от переменной lastCol и передал от lCol 1 до 5 вместо lastCol. Если что-то не будет скопировано, в столбце «F» не будет 1, и это, вероятно, потому, что ни один из листов не имеет значение = для столбца «B» -Grant.

Sub GrantCopy() 

Dim lastRow As Long 
Dim lastTRow As Long 'Last Target Row 
Dim tRow As Long  'Target Row 
Dim source As String 'The source sheet 
Dim target As String 'Variable target sheet 
Dim tempVal As String 'Hold value of Source!B2 
Dim ws As Worksheet 

source = "ALL Grants FY15" 
lastRow = Sheets(source).Range("A" & Rows.Count).End(xlUp).Row 

    For lRow = 3 To lastRow     'Loop through source sheet 
     If Sheets(source).Cells(lRow, "F").Value < 1 Then 'Check to make sure not already moved 
      tempVal = Sheets(source).Cells(lRow, "B").Text 

      For Each ws In Worksheets    'Loop through all sheets 
       If ws.Name <> source Then  'Make sure not checking Source sheet 
        target = ws.Name 

        If Sheets(target).Range("F2").Text = tempVal Then  'Does "B(row)" = F2 
         lastTRow = Sheets(target).Range("A" & Rows.Count).End(xlUp).Row 'Get Last Row 
         tRow = lastTRow + 1    'Set new Row 1 after last 

         For lCol = 1 To 5  'Copy cells from one sheet to another loop columns 
          Sheets(target).Cells(tRow, lCol) = Sheets(source).Cells(lRow, lCol).Value 
         Next lCol 
         Sheets(source).Cells(lRow, "F") = 1 'Mark row as having been moved with a "1" 
        End If 
       End If 
      Next ws 
     End If 
    Next lRow 
End Sub 
+0

Большое вам спасибо! Я получаю ошибку времени выполнения 424 (требуемый объект) для каждой идеи ws In Workbook ...? –

+0

@AmandaShipp. Я ошибочно набрал каждый ws в Workbook, который должен быть «in Worksheets» – peege

+0

Если я не понял ваши намерения. Вышеприведенный код просматривает каждую строку ВСЕХ Грантов, затем проходит через каждый другой лист, и если значение из текущей строки цикла ALL GRANTS (B: row) соответствует целевым листам «F2», оно добавит новую строку до конца цели и скопировать всю строку. – peege

0

Шаг 1:

В «Все гранты FY15» лист, добавить столбец после столбца «Категория», чтобы дублировать столбец дат, используя =A2. Чтобы распространить эту формулу на последнюю использованную строку, дважды щелкните по маленькому квадрату в нижнем правом углу ячейки, содержащей первую формулу.

Шаг 2:

В каждом оставшемся листе, в колонке «Дата», добавьте следующую формулу в первую ячейку под заголовком:

=VLOOKUP($B2,Sheet1!$B$2:$F$500,5) - Изменить «Лист1» по мере необходимости

В трех колонках после колонки «Грант» - «Тип», «Сумма» и «Категория» - добавить следующие формулы:

=VLOOKUP($B2,Sheet1!$B$2:$F$500,2) - Изменить «Лист1» в качестве необходимого

=VLOOKUP($B2,Sheet1!$B$2:$F$500,3) - Изменить «Лист1» по мере необходимости

=VLOOKUP($B2,Sheet1!$B$2:$F$500,4) - Изменить «Лист1» в качестве необходимого

ПРИМЕЧАНИЕ: Если некоторые из ваших «Date» ячеек может быть пустым на «Все гранты FY15» лист , изменить формулу =IF(ISBLANK(A2),"",A2)

Если какой-либо из ваших данных на «Все гранты FY15» лист может быть пустым, замените остальные формулы для:

=IF(ISNA(VLOOKUP($B2,Sheet1!$B$2:$F$500,5)),"",VLOOKUP($B2,Sheet1!$B$2:$F$500,5))

=IF(ISNA(VLOOKUP($B2,Sheet1!$B$2:$F$500,5)),"",VLOOKUP($B2,Sheet1!$B$2:$F$500,2))

=IF(ISNA(VLOOKUP($B2,Sheet1!$B$2:$F$500,5)),"",VLOOKUP($B2,Sheet1!$B$2:$F$500,3))

=IF(ISNA(VLOOKUP($B2,Sheet1!$B$2:$F$500,5)),"",VLOOKUP($B2,Sheet1!$B$2:$F$500,4))

Пример

Вот пример, чтобы дать вам лучшее представление о том, где эти формулы получить размещены:

«Al л Гранты FY15" Лист:

 A  B  C   D   E   F 
1 Date  Grant  Type  Amount  Category (blank) 
2 1/12/2014 abcd  efgh  1234  ijkl  1/12/2014 
3    BCDE  FGHI  2345  JKLM 
                 ^
                  | 
                  | 
                =IF(ISBLANK(A2),"",A2) 

"Город ESG" Лист:

 A  B  C   D   E 
1 Date  Grant  Type  Amount  Category 
2 1/12/2014 abcd  efgh  1234  ijkl 
3    BCDE  FGHI  2345  JKLM 
    ^    ^ ^  ^
     |     |  |   | 
     |     |  |   | 
     |     |  | =IF(ISNA(VLOOKUP($B2,'All Grants FY15'!$B$2:$F$13,4)),"",VLOOKUP($B2,'All Grants FY15'!$B$2:$F$13,4)) 
     |     |  | 
     |     | =IF(ISNA(VLOOKUP($B2,'All Grants FY15'!$B$2:$F$13,3)),"",VLOOKUP($B2,'All Grants FY15'!$B$2:$F$13,3)) 
     |     | 
     |    =IF(ISNA(VLOOKUP($B2,'All Grants FY15'!$B$2:$F$13,2)),"",VLOOKUP($B2,'All Grants FY15'!$B$2:$F$13,2)) 
     | 
    =IF(ISNA(VLOOKUP($B2,'All Grants FY15'!$B$2:$F$13,5)),"",VLOOKUP($B2,'All Grants FY15'!$B$2:$F$13,5)) 

Очевидно, что для ячейки B3, то "$ B2" будет изменено на "$ B3" и так далее.

+0

Благодарим вас за помощь, но по какой-то причине она просто не работает.Я использую созданные вами формулы (измененные для моей книги), но он продолжает вытаскивать неправильную информацию о ячейке. рабочие листы. Например, формула, используемая в City ESG B3, = IF (ISNA (VLOOKUP («ESG City of Mobile 2014», «Все гранты FY15»! $ B $ 3: $ B $ 500,5)), «», VLOOKUP («ESG City of Mobile 2014», «Все гранты FY15»! $ B $ 3: $ B $ 500,1)) .... Сначала я изменил $ B2 на $ F2, потому что я хотел, чтобы он искал значение в F2, но это не так. Затем я попробовал фактический текст в F2 («ESG City of Mobile 2014»), но безрезультатно. –

+0

Является ли «ESG City of Mobile 2014» значение в столбце «Грант», которое вы хотите найти в листе «Все гранты FY15»? – TheEngineer

+0

Это так. В приведенной выше формуле формулы я возвращаю CoC HMIS 2014 (еще один грант в столбце Грант) И это строка. –