2015-08-03 2 views
0

Это, наверное, простой вопрос для тех, кто знаком с VBA, но как новичок, я полностью опустошен.Комбинация If Then и Do Loop (я думаю)

У меня есть два листа, один из них - это исходные данные, которые я уже использую для того, чтобы вытащить из проекта без проблем. Другой - выходной лист. На листе с данными у меня есть 3 столбца (A, E и H). В столбце A есть список задач, столбец E имеет описание, а столбец H имеет финансовый год и квартал.

На выходной странице у меня 10 лет финансовых лет.

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

Я чувствую, что это должно быть сочетание DO Loop и If If, но то, что я пытался, не работает. Ниже я начал и знал довольно быстро, что это не сработает.

Do Until Worksheets("Project Data").Range("A1").Offset(Row, 0).Value = Empty 

    If Worksheets("Project Data").Range("A1").Value = "Task example*" Then 

     If Worksheets("Project Data").Range("H1") = "FY15*" Then 

      If Worksheets("Project Data").Range("E1") = "" Then Worksheets("Output").Range("C5") = 1 

     ElseIf Worksheets("Project Data").Range("E1") = "description 1*" Then Worksheets("Output").Range("C5") = 2 
     ElseIf Worksheets("Project Data").Range("E1") = "description 2*" Then Worksheets("Output").Range("C5") = 3 

     End If 

     If Worksheets("Project Data").Range("H1") = "FY16*" Then 

      If Worksheets("Project Data").Range("E1") = "" Then Worksheets("Output").Range("C6") = 1 

     ElseIf Worksheets("Project Data").Range("E1") = "description 1*" Then Worksheets("Output").Range("C6") = 2 
     ElseIf Worksheets("Project Data").Range("E1") = "description 2*" Then Worksheets("Output").Range("C6") = 3 

     End If 

    Loop 

Как я уже говорил, это не работало по нескольким причинам. Любая помощь будет принята с благодарностью! Заранее спасибо!

Редактировать: добавление некоторых фиктивных данных. Не могу понять, как добавить вложение и не иметь рейтинга, чтобы добавить изображение, поэтому у меня есть списки ниже, надеюсь, это работает. Извините, это уродливо!

Исходные данные

  • Колонка A (задача)/Колонка E (описание)/Колонка H (FYQ)
  • Пример/А/FY15Q4
  • Встреча/пустой/FY17Q1
  • тестирование/пустой/FY16Q3
  • Пример/B/FY15Q3
  • Пример/B/FY16Q1
  • Встреча/пустой/FY15Q2
  • тестирование/пустой/FY16Q3
  • Пример/С/FY16Q2

Выходные данные

  • FY15/A/B
  • FY16/B/C

Может быть до 6 по каждой строке финансового года

ответ

1

Несколько быстрых отладочных вещей. Попробуйте это и сообщите мне, если вам все еще нужна помощь. Я надеюсь, что это заставит код работать несколько, и я доверяю вашей логике If Then.

Dim row as Integer 
row = 0 
Do Until Worksheets("Project Data").Range("A1").Offset(row, 0).Value = vbNullString 

If Worksheets("Project Data").Range("A1").Value = "Task example*" Then 
    If Worksheets("Project Data").Range("H1") = "FY15*" Then 
     If Worksheets("Project Data").Range("E1") = "" Then Worksheets("Output").Range("C5") = 1 
      ElseIf Worksheets("Project Data").Range("E1") = "description 1*" Then Worksheets("Output").Range("C5") = 2 
      ElseIf Worksheets("Project Data").Range("E1") = "description 2*" Then Worksheets("Output").Range("C5") = 3 
     End If 
    End If 
Else 
    If Worksheets("Project Data").Range("H1") = "FY16*" Then 
     If Worksheets("Project Data").Range("E1") = "" Then Worksheets("Output").Range("C6") = 1 
      ElseIf Worksheets("Project Data").Range("E1") = "description 1*" Then Worksheets("Output").Range("C6") = 2 
      ElseIf Worksheets("Project Data").Range("E1") = "description 2*" Then Worksheets("Output").Range("C6") = 3 
     End If 
    End If 
End If 

row = row + 1 

Loop 

Редактировать: После комментариев, вот что я сделал. Я создал фиктивный лист, используя ваши входы, добавленные выше. Я назвал этот лист «RawData». Я создал второй лист под названием «OutputData». В OutputData я добавил FY15-FY18 в ячейки A1-A4. Это был макрокод. Обратите внимание, что это может быть красивее, но оно должно работать и быть достаточно динамичным, чтобы продолжить эволюцию этой таблицы.

Option Explicit 
Sub GenerateOutputDat() 
    Dim taskToFind As String, rawData As Worksheet, outputData As Worksheet, startPoint As Integer 
    Dim fiscalYears() As String, arraySize As Integer, x As Integer, n As Variant, descr As Range 
'Initialize variables 
    Set rawData = ActiveWorkbook.Sheets("RawData") 
    Set outputData = ActiveWorkbook.Sheets("OutputData") 
    taskToFind = "Example"        'Change this to find different string 
'Setup fiscalYears array 
    outputData.Activate 
    arraySize = Range("A1").End(xlDown).Row - 1   'because VB Arrays start at 0, not 1 
    ReDim fiscalYears(arraySize) As String 
    For x = LBound(fiscalYears) To UBound(fiscalYears) 
     fiscalYears(x) = outputData.Range("A1").Offset(x, 0).Value 
    Next 
'logic to populate OutputData 
    For Each n In fiscalYears 
     rawData.Activate 
     Range("A1").Select 
     startPoint = Cells.Find(n).Row 
     On Error GoTo ErrorHandle 
     Cells.Find(n, After:=ActiveCell, SearchOrder:=xlByColumns).Activate 
     Do 
      Set descr = Cells(ActiveCell.Row, 5) 
      If Cells(ActiveCell.Row, 1).Value = taskToFind Then 
       outputData.Activate 
       Cells.Find(n).Activate 
       If Cells(ActiveCell.Row, 2).Value = vbNullString Then 
        ActiveCell.Offset(0, 1).Activate 
       Else 
        ActiveCell.End(xlToRight).Offset(0, 1).Activate 
       End If 
       ActiveCell.Value = descr.Value 
      End If 
      rawData.Activate 
      Cells.Find(n, After:=ActiveCell, SearchOrder:=xlByColumns).Activate 
     Loop Until ActiveCell.Row <= startPoint 
ErrorHandle: 
     Range("A1").Activate 
    Next 
End Sub 
+0

Я думаю, что моя логика может быть выключена. Другая проблема, о которой я забыл упомянуть, заключается в том, что у меня будет несколько входных данных для каждого FY, поэтому я не хочу просто перейти к следующей строке, пока не будет выполнен поиск всех FY. Я также пытаюсь понять, есть ли способ избежать выполнения кода для каждого FY, как я уже говорил выше. – sfowler38

+0

В точку FY вы можете объявить целое число (financialYear) и просто иметь Range («H1»). Value = «FY» и financialYear & «*». Затем вы можете добавить 1 к вашему фискальному целю во время цикла, чтобы он каждый раз переходил к следующему году. Если вы можете опубликовать некоторые фиктивные образцы данных с листа, который вы ищете, я могу попытаться посмотреть его глубже. Надеюсь, я помогу. – legendjr

+0

Вы определенно помогаете! Попытка добавить некоторые фиктивные данные прямо сейчас. – sfowler38

0

Это другой подход, который вы заявили, но я думаю, что он также может соответствовать вашим потребностям. Не могли бы вы сообщить мне, если/как это не так, я могу улучшить свой ответ?

Dim rngTasks As Range 
Dim cellTasks As Range 
Dim lngTasksRow As Long 
Dim lngFYRow As Long 
Dim cellFY As Range 
Dim lngFYCol As Long 

With Worksheets("Project Data") 
    'How many rows of tasks are there? 
    lngTasksRow = .Range("A" & .Rows.Count).End(xlUp).Row 
    'Set a range covering every row of tasks 
    Set rngTasks = .Range(.Cells(1, 1), .Cells(lngTasksRow, 1)) 'Range to find task in 
End With 
With Worksheets("Output") 
    'For each row in the range 
    For Each cellTasks In rngTasks 
     'If the task is the one we are looking for 
     If cellTasks.Value = Worksheets("Project Data").Range("A1").Value Then 
      'How many FY rows are there on "Output" 
      lngFYRow = .Range("A" & .Rows.Count).End(xlUp).Row 
      'Search to see if the FY we want is already on "Output" 
      Set cellFY = .Range(.Cells(1, 1), .Cells(lngFYRow, 1)).Find(What:=cellTasks.Offset(0, 7).Value, After:=.Range("A1"), Lookat:=xlWhole, LookIn:=xlValues, _ 
        SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) 
      'If not, use the next blank row; if yes, then use the existing row 
      If cellFY Is Nothing Then 
       lngFYRow = lngFYRow + 1 
      Else 
       lngFYRow = cellFY.Row 
      End If 
      'Find next blank column in FY Row 
      lngFYCol = Application.CountA(.Rows(lngFYRow)) + 1 
      'Copy the description to that column from "Project Data" 
      .Cells(lngFYRow, lngFYCol).Value = cellTasks.Offset(0, 4).Value 
     End If 
    Next cellTasks 
End With 
+0

Я тоже это пробовал, и это давало мне ошибки в настройках переменных. – sfowler38

+0

Какая ошибка и на какой строке? – puzzlepiece87

+0

Я получаю сообщение об ошибке «Ошибка компиляции: объект обязателен». Установите lngTasksRow = .Range («A» & .Rows.Count) .End (xlUp) .row. – sfowler38