Найти подходящие значения ячеек в Рабочей книге 1 (Столбец A) и Рабочей книге 2 (Столбец A); Вставить соответствующие данные - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь создать макрос, который берет долларовую сумму и процент (2 отдельных столбца) для отчета за определенный месяц, и добавляет его в историческую рабочую книгу, показывающую все долларовые значения / проценты проекта в прошлом. Код ниже, кажется, работает, но на самом деле просто вставляет значение следующей строки из ежемесячного отчета (wb1) в следующую строку в следующем пустом столбце исторической книги (wb2). Мне нужно, чтобы оно фактически совпадало с именами проектов в wb1 и именами проектов в wb2, так что новые значения фактически приходят из правильного проекта. Я знаю, что это не работает, потому что я взял имя проекта, чтобы посмотреть, что произойдет, и макрос все еще опубликовал информацию о пропущенном имени проекта в wb2, обрезав последнее значение в конце списка проектов, когда не было больше нет занятых клеток. Таким образом, если есть 10 проектов, и я беру проект 5, данные публикуются для проектов 1-9.

Мне также нужно будет добавить новую строку, если имя проекта в wb1 не отображается в столбец A. в wb2. Новая строка будет содержать отсутствующее имя проекта и вставит сумму в долларах за этот месяц. Или, по крайней мере, скажите пользователю, что в wb2 нет конкретного имени проекта. Я не уверен, как именно я буду go делать это, но мне, по крайней мере, нужен код ниже для точного добавления значений проекта.

Любая помощь будет принята с благодарностью!


Workbooks.Open ("T:\ADMINISTRATION\Marie Presley\HistoricalFees.xlsx")

Dim wb1 As Workbook
Dim wb2 As Workbook
Dim y As Integer
Dim sht As Worksheet

'=============================================
Dim w1 As Worksheet, w2 As Worksheet
 Dim i As Long, j As Long, n As Integer
Dim NextEmptyCol As Long

 Set w1 = Workbooks("Forecast Summary Report Generator.xlsm").Worksheets("Forecast Summary")
 Set w2 = Workbooks("HistoricalFees.xlsx").Worksheets("Sheet1")

NextEmptyCol = w2.Cells(1, Columns.Count).End(xlToLeft).Column + 1

 n = 0
 For i = 1 To w2.Cells(Rows.Count, 1).End(xlUp).Row       'for each used cell in w2.colA
   For j = 1 To w1.Cells(Rows.Count, 3).End(xlUp).Row + n 'for each used cell in w1.colC

    'Find the text from w1.colC (current w1 row), within cell in w2.colA (current w2 row)
     If InStr(1, w2.Cells(i, 1).Value, w1.Cells(j, 3).Value) > 0 Then

      'If found then copy cell in w2.colB into cell in w2.colE (current w2 row)
       w1.Cells(i, 8).Copy (w2.Cells(i, NextEmptyCol))
       w1.Cells(i, 9).Copy (w2.Cells(i, (NextEmptyCol + 1)))

       Exit For    'this exits the inner For loop

       n = n + 1   'this would jump over the next cell(s) in w1, but never executes
     End If
   Next j
 Next i

End Sub

Ответы [ 2 ]

0 голосов
/ 13 января 2020

В заголовке ваших вопросов написано Col A и Col A, но ваш код содержит Col C и Col A, если вам нужно исправить приведенный ниже код, замените 3 на 1. Поместите NextEmptyCol в If statement, потому что ваши столбцы не будут одинаковыми для каждой строки.

Удалить ...

NextEmptyCol = w2.Cells(1, Columns.Count).End(xlToLeft).Column + 1

'and

   For i = 1 To w2.Cells(Rows.Count, 1).End(xlUp).Row       'for each used cell in w2.colA
   For j = 1 To w1.Cells(Rows.Count, 3).End(xlUp).Row + n 'for each used cell in w1.colC

 'Find the text from w1.colC (current w1 row), within cell in w2.colA (current w2 row)
 If InStr(1, w2.Cells(i, 1).Value, w1.Cells(j, 3).Value) > 0 Then

  'If found then copy cell in w2.colB into cell in w2.colE (current w2 row)
   w1.Cells(i, 8).Copy (w2.Cells(i, NextEmptyCol))
   w1.Cells(i, 9).Copy (w2.Cells(i, (NextEmptyCol + 1)))

   Exit For    'this exits the inner For loop

Заменить этим ...

   For j= 1 To w2.Cells(Rows.Count, 1).End(xlUp).Row       'for each used cell in w2.colA
   For i = 1 To w1.Cells(Rows.Count, 3).End(xlUp).Row + n 'for each used cell in w1.colC

       If w2.Cells(j, 1).Value = w1.Cells(i, 3).Value Then 'find w2 values in w1 
           NextEmptyCol = w2.Cells(j, w2.Columns.Count).End(xlToLeft).Column + 1 'set the next empty column for each row
           w2.Cells(j, NextEmptyCol).Resize(, 2).Value = w1.Cells(i, 8).Resize(, 2).Value

       End If
   Next j
   Next i
0 голосов
/ 13 января 2020

Я знаю, это звучит плохо, но, принимая предложение Za c, посмотрим, сможете ли вы сначала сделать этот алгоритм с помощью функций VLookup и Find worksheet. Даже если вам нужно использовать вспомогательные листы для обработки нескольких шагов. Было бы лучше, если бы вы действительно знали, а затем увидели, что вы хотите сделать, работая, прежде чем приступить к адаптации чужого кода.

Затем попробуйте затем использовать Application.worksheetfunction для репликации рабочие формулы визуального листа.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...