2017-10-23 1 views
0

다음 코드는 시트 (SOC 5)의 열 BH에 특정 값을 갖는 데이터 행을 식별하고 각 행에서 행 A 열의 해당 값을 복사하는 데 적합합니다. 새로운 장으로. 그러나 새롭게 식별 된 값만 대상 시트에 복사하는 코드를 수정해야합니다. 의미, 대상 시트 이미 내가 찾고있는 가치의 일부를했다. 기본 데이터를 새로 고친 후 조건을 충족하는 최신 값만 가져 오는 코드가 필요합니다.새 값만 복사하는 추가 조건

Sub Cond5Copy() 
'The data is in sheet Data 
Sheets("Data").Select 
RowCount = Cells(Cells.Rows.Count, "a").End(xlUp).Row 
For i = 1 To RowCount 
    'the qualifying value is in column BH 
    Range("BH" & i).Select 
    check_value = ActiveCell 
    If check_value = "5" Then 
     Cells(Application.ActiveCell.Row, 1).Copy 
     'The destination set is in sheet SOC 5 
     Sheets("SOC 5").Select 
     RowCount = Cells(Cells.Rows.Count, "a").End(xlUp).Row 
     Range("a" & RowCount + 1).Select 
     ActiveSheet.Paste 
     Sheets("Data").Select 
    End If 
    Next 
End Sub 
+0

무엇보다 먼저 .select와 activesheets를 제거하십시오. – Cyril

+0

어떤 데이터가 다양한 데이터를 갖습니까? – Cyril

답변

0
Sub Cond5CopyNew() 
Dim wsSource As Worksheet 
Dim wsDest As Worksheet 
Dim rowCount As Long 


Set wsSource = Worksheets("Data") 
Set wsDest = Worksheets("SOC 5") 


Application.ScreenUpdating = False 

With wsSource 
    rowCount = .Cells(.Cells.Rows.Count, "a").End(xlUp).Row 

    For i = 1 To rowCount 
     If .Cells(i, "BH").Value = 5 Then 
      'Second check, make sure it's not already copied 
      If WorksheetFunction.CountIf(wsDest.Range("A:A"), .Cells(i, "A").Value) = 0 Then 
       'Copy the row over to next blank row 
       .Cells(i, "A").Copy wsDest.Cells(.Rows.Count, "A").End(xlUp).Offset(1) 
      End If 
     End If 
    Next i 
End With 

Application.ScreenUpdating = True 

End Sub 
1

당신이 만나는 모든 데이터를 이동하는 시도 할 수 있습니다 : A의

Dim s as Worksheet, d as Worksheet, LRs as Long, LRd as Long 
Set s = Sheets("Data") 's for Source 
Set d = Sheets("SOC 5") 'd for Destination 
LRs = s.Cells(s.Rows.Count, "A").End(xlUp).Row 'last row of source 
LRd = d.Cells(d.Rows.Count, "A").End(xlUp).Row 'last row of destination 
For i = 1 to LRd 
    If d.Cells(i, "B") = Application.Index(s.Range(s.Cells(1, "B"), s.Cells(LRs, "B")), Application.Match(d.Cells(i, "A"), s.Range(s.Cells(1, "A"), s.Cells(LRs, "A")),0)) Then 
     s.Rows(Application.Match(d.Cells(i, "A"), s.Range(s.Cells(1, "A"), s.Cells(LRs, "A")),0)).Copy d.Rows(i) 
    End If 
Next i 

사용 abritrary 룩업 :

Dim s as Worksheet, d as Worksheet, LRs as Long, LRd as Long 
Set s = Sheets("Data") 's for Source 
Set d = Sheets("SOC 5") 'd for Destination 
LRs = s.Cells(s.Rows.Count, "A").End(xlUp).Row 'last row of source 
For i = 1 to LRs 
    If s.Cells(i, "BH") = 5 Then 
     LRd = d.Cells(d.Rows.Count, "A").End(xlUp).Row 'last row of destination 
     s.Rows(i).Copy d.Rows(LRd + 1) 
    End If 
Next i 

당신은이 최신 데이터를 확인하는 데 사용할 수 있습니다 (일치)와 B (색인)의 출력을 비교합니다.

+0

목표는 소스 시트에 대한 대상 시트에서 값이 일치하지 않는지 (원본 데이터가 변경됨)를 결정하는 것입니다. 대상 셀이 소스 셀과 일치하지 않으면 대상 행을 복사/붙여 넣기하여 대상 행을 덮어 씁니다. – Cyril

0

고유 한 값 목록을 원하는 것처럼 들립니다. 사전 개체 사용을 고려 했습니까? Excel의 사전 개체 VBA에는 값이 사전에 이미 있는지 확인할 수있는 메서드가 있습니다. 사전에 추가하려는 값이 사전에 없는지 확인하여 고유 한 값만 사용하여 사전을 쉽게 채울 수 있습니다. 이 당신에게 유망한 소리가 나는 경우에

, 그때 내가 VBA에서 사전을 사용하는 방법에 대한 자세한 내용은 다음 리소스를 방문해 보시기 바랍니다 :

https://excelmacromastery.com/vba-dictionary/#A_Quick_Guide_to_the_VBA_Dictionary

당신은 다음과 같은 존재 사용하는 것이 좋습니다 방법 :

dict.Exists(Key) 

값이 이미 사전에 있는지 확인하십시오.

이 답이 명확하지 않은 경우 알려주십시오. 필요한 경우 자세히 설명해 드리겠습니다.