2014-10-01 29 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)