2015-02-05 32 views
0

所以我有兩個不同的工作表,它們有一個帶有服務訂單的列。基本上,如果Worksheet1的SO-ID列中的數字與Worksheet2中的SO#列匹配,那麼我想要執行的操作是:複製那些與該特定服務訂單號相關的相應列「Order」和「Type」從Worksheet2到Worksheet1。任何幫助將不勝感激。我發現下面的例子,但有很多更多的數據點比所示:比較兩個不同工作表的值

Worksheet1 named "In Progress": 

    Region SO-ID Site ID 
    C01 5818476 DNYF8766D 
    E01 5975844 DCD00139 
    E01 5446828 DEG02219 

. 
. 
. 
. 
. 


Worksheet B named "0205": 

No. SO#    Order  Type 
1 5446828  KMC07570 Re-Install 
2 5975844  KSS10269A Install 
3 5818476  KSS10349D Re-Install 
. 
. 
. 
. 


Results: 

In Worksheet1 named "In Progress": 

Region SO-ID Site ID  Order  Type 
C01 5818476 DNYF8766D KSS10349D Re-Install 
E01 5975844 DCD00139 KSS10269A  Install 
E01 5446828 DEG02219 KMC07570  Re-Install 
. 
. 
. 
. 
. 

這是我寫的代碼,但它不工作

Sub DCompare() 
Dim LR As Long 
LR = Range("A" & Rows.Count).End(xlUp).Row 
Dim i As Long 


For i = LR To 2 Step -1 
If ThisWorkbook.Sheets("Sheet1").Range("B" & i) = ThisWorkbook.Sheets("Sheet2").Range("B" & i) Then 
Worksheets("Sheet2").Cells(i, 8).Value = Worksheets("Sheet2").Cells(i, 3).Value 
Worksheets("Sheet2").Cells(i, 9).Value = Worksheets("Sheet2").Cells(i, 4).Value 
End If 
Next i 


End Sub 
+2

VLOOKUP公式不適合你嗎? – pnuts 2015-02-05 20:21:54

+0

我從來沒有真正使用過VLOOKUP公式,但我沒有嘗試的原因是因爲我想要一個宏,它可以幫助我將它應用到其他工作表中。 – Robert 2015-02-05 20:23:02

+1

如果你不介意宏(即安全/兼容性),那麼你有一個很好的理由國際海事組織。儘管VLOOKUP非常簡單,但我認爲大多數人會寫公式而不是VBA代碼,部分原因是「未來」往往不像過去那麼完全相同。 – pnuts 2015-02-05 20:26:44

回答

0

看來,每個比較你在你接受比賽之前,你將不得不匹配逐行比賽。最好搜索匹配的目標並記錄要用於傳輸數據的行。

Sub DCompare() 
    Dim LR As Long, i As Long, t As Long, ws2 As Worksheet 

    With ThisWorkbook 
     Set ws2 = .Sheets("Sheet2") 
     With .Sheets("Sheet1") 
      LR = .Range("A" & Rows.Count).End(xlUp).Row 
      For i = LR To 2 Step -1 
       If CBool(Application.CountIf(ws2.Columns("B"), .Cells(i, "B").Value2)) Then 
        t = Application.Match(.Cells(i, "B").Value2, ws2.Columns("B"), 0) 
        ws2.Cells(t, 8).Resize(1, 2) = .Cells(i, 3).Resize(1, 2).Value 
       End If 
      Next i 
     End With 
    End With 

    Set ws2 = Nothing 
End Sub 

尋找匹配,如果找到一個,如果發現它捕獲目標匹配行並傳輸兩個單元值得信息。我很好奇,爲什麼你需要從底部開始並努力工作,但我想可能存在沒有披露的信息等級。如果向後披露的原因被披露,可能會更容易避免傳輸數據。

+0

非常感謝。我會測試並報告。也沒有理由從底部開始。當我談到宏時,我並不是很出色,所以我從我認爲的一些在線博客那裏獲得了該線。但是,如果你有另一種方式縮小它會更容易或更快,隨時提出建議。再次感謝您的幫助。 – Robert 2015-02-05 21:13:01

0

第二個例子。在工作表B上使用一個簡單的。查找。包含一些變量,以便將數據放置在每張工作表上,命名工作表等,這可能會給您一些靈活性來進行自定義?

Option Explicit 

Sub subFindSOID() 
Dim wsSO As Worksheet, wsOrd As Worksheet 
Dim SORng As Range, OrdRng As Range, fndSO As Range, c As Range 
Dim SOStRow As Long, SOEndRow As Long, SOCol As Long, SOff As Long 
Dim OrdStRow As Long, OrdEndRow As Long, OrdCol As Long 

'Assign worksheets 
Set wsSO = Worksheets("In Progress") 
Set wsOrd = Worksheets("0205") 

'Assign data start position on each sheet 
SOStRow = 3 
SOCol = 2 

OrdStRow = 3 
OrdCol = 2 
SOff = 1 

    'Get search range 
    With wsOrd 
     OrdEndRow = .Cells(Rows.Count, OrdCol).End(xlUp).Row 
     Set OrdRng = .Range(.Cells(OrdStRow, OrdCol), .Cells(OrdEndRow, OrdCol).Offset(0, SOff + 2)) 
    End With 

    With wsSO 
     'Get range to iterate 
     SOEndRow = .Cells(Rows.Count, SOCol).End(xlUp).Row 
     Set SORng = .Range(.Cells(SOStRow, SOCol), .Cells(SOEndRow, SOCol)) 
      'Iterate the range 
      For Each c In SORng.Offset(0, 1) 
       Set fndSO = OrdRng.Find(What:=c, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext) 
       If Not fndSO Is Nothing Then 
        'Copy the data columns 
        c.Offset(0, 2).Value = fndSO.Offset(0, SOff).Value 
        c.Offset(0, 3).Value = fndSO.Offset(0, SOff + 1).Value 
       End If 
      Next c 
    End With 
End Sub