2017-01-05 4 views
0

У меня есть главный файл, который отслеживает ход доставки для моей компании. Я обновляю это на еженедельной основе с прогрессом в существующих поставках (отгрузки, которые уже находятся в главном файле) и вводят новые поставки. Эти обновления представлены в виде листа обновления, который находится в том же формате, что и основной файл. Я автоматизировал ввод новых поставок, но я зациклился на том, как я могу обновить существующий прогресс поставок.VBA - Обновление основного файла из нового файла

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

ДЛЯ ЭКЗАМЕНА: ссылка на отправку находится в колонке «С», отправка отправления находится в колонке «АГ», отправка отправляется в колонку «AH» и отправление прибывает в колонку «ИИ» .. и так далее. В главном листе у меня может быть номер ссылки и дата отправки. В листе обновления может быть указана дата отправки для этой отправки. Я хотел бы взять дату отправки и скопировать ее в основной файл для этой отправки.

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

Спасибо за вашу помощь

Пожалуйста, смотрите мою попытку код:

Sub Eupdatedates() 
Dim lr As Long, rw As Long, extRNG As Range 
Set wb = Workbooks("masterfile.xlsm") 
Set ws = wb.Sheets("RawDATA") 
lastRow = ws.Range("B" & ws.Rows.Count).End(xlUp).Row 


Set extRNG = Workbooks("updatefile.csv").Worksheets("report").Range("C:AL") 


For i = 33 To 38 ' columns which contain dates that need updating 


    ws.Range("$A$2:$CV$" & lastRow).AutoFilter field:=i, Criteria1:="=" 'filter out cells containing data 



    lastRow = ws.Range("B" & ws.Rows.Count).End(xlUp).Row ' find last row after filtering 
    firstRow = Range("Cells(2,i): Column(i)" &  Rows.Count).Cells.SpecialCells(xlCellTypeBlanks).Row ' indentify first row after filtering 
    For rw = firstRow To lastRow ' loop through each each empty row cell and perform a vlookup to the update file 
     Cells(rw, i) = Application.VLookup(Cells(rw, i), extRNG, i - 2, False) 
    Next rw 

Next i 



End Sub 

Я получаю сообщение об ошибке с "Range (" Cells (2, я): Колонка (I)»Я думаю, Я искал онлайн и, похоже, не нашел способ определить диапазон в цикле for.Я новичок в VBA, поэтому много оснований, чтобы наверстать. Любые мысли были бы очень благодарны !!

+1

Вы пытались написать VBA код, чтобы решить это? –

+0

Нет, я не уверен, с чего начать и что будет эффективным методом. Спасибо – SmC

+0

Ну, начните свою работу, разделив основную задачу на небольшие задачи - например. 1. Найдите пробелы в столбцах, 2. найдите способ копирования и вставки поверх основного файла, 3. и т. Д. Затем сделайте небольшое исследование для каждой задачи и покажите, что у вас есть. – Vityata

ответ

0

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

  • Сколько у вас строк? (Я хочу знать, когда остановиться)
  • Где находится лист обновлений и что он называется?
  • начало с первой строки (номер строки = 1)
  • Что такое ссылка на отправку (корабль ref)?
  • выберите ячейку (номер строки, номер столбца)
  • бланк? ДА - найдите соответствующее значение в листе обновления на основе подтверждения и обновления судна, НЕТ - перейдите к следующей колонке, представляющей интерес
  • Нет столбцов, представляющих интерес для этой строки? - переход к следующей строке (номер строки +1)
  • т.д.
+0

Спасибо, Кайл, Это то, что я искал, так как не был уверен, есть ли ответ на два лайнера. Количество строк будет меняться, и я буду держать рабочие файлы открытыми во время выполнения макроса. Я отредактировал сообщение с моим запрограммированным кодом, где я застрял в какой-то момент. Thanks – SmC

+0

Рад помочь. С вашим сообщением об ошибке - проверьте, где ваши кавычки находятся в Range («Ячейки (2, i): Ячейки (lastRow, i)». Возможно, более эффективно создавать строку диапазона вне скобок, например: | Для i = 2 To 4 | stRange = "$ A $ 2: B" & CStr (i) | firstRow = Range (stRange) | Извините, не удается получить разрывы строк для работы в этом ответе, поэтому добавили | где они должны быть. –

+0

вы немного меня потеряли, Кайл !! Я изменил код, чтобы сделать следующее, хотя он все еще не работает. Теперь, когда я запускаю код, он просто ничего не делает. Sub ESourcedate() | Set extRNG = | Рабочие книги («updatefile.csv»). Рабочие листы («отчет»). Диапазон («C: AL») | Установите wb = Рабочие книги («masterfile.xlsm») | Установите ws = wb.Sheets («RawDATA») | lastrow = ws.Range («C» & ws.Rows.Count) .End (xlUp) .Row| Для i = 33 To 38| Для r = 3 Для последнего: Если ячейки (r, i) .Value = "" Then| Ячейки (r, i) .Value = Application.VLookup (Ячейки (r, 3)), extRNG, i - 2, False) | Конец If| Следующий r| Следующий i| End Sub | – SmC