2014-10-01 102 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 2014-10-01 16:24:30

+3

您已经在此处询问了[许多问题](http://stackoverflow.com/users/4095610/user4095610),但尚未接受任何答案(即使这些答案似乎已经集成到此最终版本中你的宏...)。作为一个礼节问题,你可能会考虑* upvoting *有用的答案,或[“**接受**”那些真正帮助你的人)(http://stackoverflow.com/help/accepted-answer)解决你的问题。 – 2014-10-01 16:28:21

+0

好吧@DavidZemens我会的。 – user4095610 2014-10-01 16:30:59

回答

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”(ALWAYS 24)之间的列数。 FOR循环中的位使用Cells(<row>, <column>)语法从一个单元复制到另一个单元。因为J总是从3循环到24,所以ROWS 3到24是唯一会被更新的。也许你的意思是Cells(i,j)