2014-10-01 4 views
-1

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

Sub crossUpdate() 

Dim rng1 As Range, rng2 As Range, rng1Row As Range, rng2Row As Range, Key As Range, match As Variant 
Dim wb1 As Workbook 
Dim wb2 As Workbook 
Dim endRng2 As Long 

Set wb2 = Workbooks("011 High Level Task List v2.xlsm") 
Set wb1 = Workbooks("011 High Level Task List v2 ESI.xlsm") 

'Unfilter and Unhide both sheets 
With wb1.Sheets("Development Priority List") 
.Cells.EntireColumn.Hidden = False 
.Cells.EntireRow.Hidden = False 
.AutoFilterMode = False 
End With 
With wb2.Sheets("Development Priority List") 
.Cells.EntireColumn.Hidden = False 
.Cells.EntireRow.Hidden = False 
.AutoFilterMode = False 
End With 

'Copy and paste original sheet to new temp sheet 
wb1.Sheets("Development Priority List").Activate 
wb1.Sheets("Development Priority List").Cells.Select 
Selection.Copy 
Sheets.Add.Name = "SourceData" 
wb1.Sheets("SourceData").Paste 

N = Cells(Rows.Count, "A").End(xlUp).Row 
Set rng1 = wb1.Sheets("SourceData").Cells.Range("A2:A" & N) 
Set rng1Row = rng1.EntireRow 

'Sort temp sheet by key 
wb1.Worksheets("SourceData").Sort.SortFields.Clear 
    wb1.Worksheets("SourceData").Sort.SortFields.Add Key:=wb1.Sheets("SourceData").Cells.Range("A2:A" & N), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 
     xlSortNormal 
    With wb1.Worksheets("SourceData").Sort 
     .SetRange Range("A1:Z1000") 
     .Header = xlYes 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 

'Sort update sheet by key 
wb2.Activate 
wb2.Worksheets("Development Priority List").Sort.SortFields.Clear 
    wb2.Worksheets("Development Priority List").Sort.SortFields.Add Key:=wb2.Sheets("Development Priority List").Cells.Range("A2:A" & N), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 
     xlSortNormal 
    With wb2.Worksheets("Development Priority List").Sort 
     .SetRange Range("A1:Z1000") 
     .Header = xlYes 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 

'Dev columns moved on SourceData sheet 
wb1.Sheets("SourceData").Activate 
Columns("F:G").Select 
Selection.Cut 
Columns("A:A").Select 
Selection.Insert Shift:=xlToRight 


'Dev columns moved on update sheet 
wb2.Sheets("Development Priority List").Activate 
Columns("F:G").Select 
Selection.Cut 
Columns("A:A").Select 
Selection.Insert Shift:=xlToRight 


'Update sheet searched and updated from SourceData 
Set rng2 = wb2.Sheets("Development Priority List").Cells.Range("C2:C" & N) 
endRng2 = rng2.Rows.Count 
For i = 2 To rng1.Rows.Count + 1 
    Set Key = wb1.Sheets("SourceData").Range("C" & i) 
    match = Application.match(Key, rng2, 0) 
'Rows that don't exsist in update sheet are added 
    If IsError(match) Then 
     wb1.Sheets("SourceData").Range("C" & i, "Z" & i).Copy 
     wb2.Sheets("Development Priority List").Range("C" & endRng2, "Z" & endRng2).Select 
     wb2.Sheets("Development Priority List").Paste 
     endRng2 = endRng2 + 1 
'All other rows are scanned for changes 
    Else 
     For j = 3 To wb1.Sheets("SourceData").Range("C" & i, "Z" & i).Columns.Count 
      wb2.Sheets("Development Priority List").Cells(j, i).Value = wb1.Sheets("SourceData").Cells(j, i) 
     Next j 


    End If 

Next i 

'SourceData sheet deleted 
Application.DisplayAlerts = False 
wb1.Sheets("SourceData").Delete 
Application.DisplayAlerts = True 

'Dev columns moved back on update sheet 
wb2.Sheets("Development Priority List").Activate 
Columns("A:B").Select 
Selection.Cut 
Columns("H:H").Select 
Selection.Insert Shift:=xlToRight 

wb1.Activate 
+0

С быстрым взглядом может быть, что ваша переменная «N» равна 24. Поместите точку разрыва на строку, следующую за тем, где вы назначаете «N» и проверяете значение «N» в окне «Локали». – JNevill

+3

Вы задали [несколько вопросов] (http://stackoverflow.com/users/4095610/user4095610) здесь, но еще не приняли никаких ответов (хотя эти ответы, похоже, были включены в эту окончательную версию вашего макроса ...). В качестве эттикета вы можете подумать о том, чтобы «повысить» полезные ответы или [«** Принимать **» те, которые действительно помогли вам] (http://stackoverflow.com/help/accepted-answer), решить вашу проблему. –

+0

Ok @DavidZemens Я буду. – user4095610

ответ

0

Мне потребовалось несколько раз вернуться к этому, чтобы выяснить, что случилось. Вот то, что я считаю, что происходит:

Этот код:

For j = 3 To wb1.Sheets("SourceData").Range("C" & i, "Z" & i).Columns.Count 
    wb2.Sheets("Development Priority List").Cells(j, i).Value = wb1.Sheets("SourceData").Cells(j, i) 
Next j 

зацикливается от 3 до количества столбцов между «C» и «Z» (ВСЕГДА 24). Бит внутри цикла FOR использует синтаксис Cells(<row>, <column>) для копирования из одной ячейки в другую. Поскольку J всегда циклируется от 3 до 24, тогда ROWS с 3 по 24 являются единственными, которые будут обновлены. Возможно, вы имели в виду Cells(i,j)?

Смежные вопросы