2014-06-10 2 views
0

지금 나는 직원이 데이터 입력을 위해 사용하는 마스터 Excel 통합 문서를 가지고 있습니다. 각자는 자신의 데스크톱에 사본을 다운로드 한 다음 완료된 데이터 옆에있는 "x"를 입력하여 다양한 항목에 대한 진행 상황을 표시합니다. 각 제품에는 해당 행에 해당 데이터가 나열되어 있습니다. 마스터 통합 문서는 분기마다 데이터가있는 범위를 복사하는 매크로를 사용하여 각 개인 통합 문서에서 현재 업데이트되는 제품의 새로운 데이터로 채워집니다 (아래 코드 참조).행 삽입 VBA

Sub GetDataFromClosedWorkbook() 
'Created by XXXX 5/2/2014 
Application.ScreenUpdating = False ' turn off the screen updating 

Dim wb As Workbook 
Set wb = Workbooks.Open("LOCATION OF FILE", True, True) 
' open the source workbook, read only 
With ThisWorkbook.Worksheets("1") 
' read data from the source workbook: (Left of (=) is paste @ destination, right of it is copy) 
.Range("F8:K25").Value = wb.Worksheets("1").Range("F8:K25").Value 
End With 

With ThisWorkbook.Worksheets("2") 
' read data from the source workbook: (Left of (=) is paste @ destination, right of it is copy) 
.Range("V5:Z359").Value = wb.Worksheets("2").Range("V5:Z359").Value 
End With 

wb.Close False ' close the source workbook without saving any changes 
Set wb = Nothing ' free memory 
Application.ScreenUpdating = True ' turn on the screen updating 

End Sub 

제가하는 데 문제는 이것이다 : 모든 한 번 잠시, 나는 (이 그냥 데이터를 추가로 반대 마스터에 행을 추가하는 새로운 제품을 추가해야합니다 행 전체에 추가됨). 때로는이 행이 끝에 있으며 때로는 중간에 있습니다. 아래 코드에서 볼 수 있듯이, VBA는 현재 미리 정의 된 범위에서 복사/붙여 넣기 만하므로이 행 변경을 처리 할 수 ​​없습니다. 각 사용자의 통합 문서는 행 #에서이 변경 사항을 인식하지 않으므로 열의 데이터가 잘못된 행과 연관됩니다. 일반적으로 전체 시트를 복사하고 문제를 해결할 수 있습니다. 내가 가진 문제는 각 사용자가 자신의 데이터를 옆에있는 자신의 통합 문서에 자신의 프로세스를 기록 할 수 있어야한다는 것입니다. 마스터 시트의 새 행이 각 사용자가 만든 표시를 지우거나 이동하지 않고 다른 모든 행에 추가되고 추가되도록 코드를 작성하는 방법이 있습니까? 나는 이것이 데이터를 보존 할 것이기 때문에 마스터에서 새로운 것이라면 행을 "삽입"하는 방법을 찾으려고 노력했지만 그걸 알아낼 수는 없다. 또한 워크 북에서 서버의 보안으로 인해 워크 북을 연결하는 등의 작업은 옵션이 아닙니다. 아무도 이것에 어떤 생각을 가지고 있습니까?

+0

각 제품마다 고유 한 이름이나 고유 한 식별자가 있습니까? –

+0

예. 그렇습니다. 첫 번째 7 열은 모두 제품에 고유하며 각각 고유 한 식별자가 될 수 있습니다. – Brumder

+0

마스터 통합 문서를 업데이트 할 때 새 제품 만 추가합니까, 아니면 기존 행을 업데이트합니까? –

답변

0

이 문제에 접근하는 한 가지 방법은 Scripting.Dictionary 개체를 사용하는 것입니다. 대상 식별자와 원본 식별자에 대한 사전을 만들어 비교할 수 있습니다. 이 작업을 수행하기 위해 키 - 값 쌍이 실제로 필요하지 않다고 생각되지만 희망 사항은 올바른 방향으로 연결됩니다!

Sub Main() 

Dim source As Worksheet 
Dim target As Worksheet 
Dim dictSource As Object 
Dim dictTarget As Object 
Dim rng As Range 
Dim i As Integer 
Dim j As Integer 
Dim idSource As String 
Dim idTarget As String 
Dim offset As Integer 

Set source = ThisWorkbook.Sheets(2) 
Set target = ThisWorkbook.Sheets(1) 

offset = 9 'My data starts at row 10, so the offset will be 9 

Set rng = source.Range("A10:A" & source.Cells(source.Rows.Count, "A").End(xlUp).Row) 
Set dictSource = CreateObject("Scripting.Dictionary") 
For Each cell In rng 
    dictSource.Add Key:=cell.Value, Item:=cell.Row 
Next 

Set rng = target.Range("A10:A" & target.Cells(target.Rows.Count, "A").End(xlUp).Row) 
Set dictTarget = CreateObject("Scripting.Dictionary") 
For Each cell In rng 
    dictTarget.Add Key:=cell.Value, Item:=cell.Row 
Next 

i = 1 
j = source.Range("A10:A" & source.Cells(source.Rows.Count, "A").End(xlUp).Row).Rows.Count 
Do While i <= j 
Retry: 
    idSource = source.Cells(i + offset, 1).Value 
    idTarget = target.Cells(i + offset, 1).Value 
    If Not (dictSource.Exists(idTarget)) And idTarget <> "" Then 
     'Delete unwanted rows 
     target.Cells(i + offset, 1).EntireRow.Delete 
     GoTo Retry 
    End If 
    If dictTarget.Exists(idSource) Then 
     'The identifier was found so we can update the values here... 
     dictTarget.Remove (idSource) 
    ElseIf idSource <> "" Then 
     'The identifier wasn't found so we can insert a row 
     target.Cells(i + offset, 1).EntireRow.Insert 
     'And you're ready to copy the values over 
     target.Cells(i + offset, 1).Value = idSource 
    End If 
    i = i + 1 
Loop 

Set dictSource = Nothing 
Set dictTarget = Nothing 

End Sub 
+0

위의 코드에서 주목할 점은'target' 시트의 식별자 목록이'source' 시트의 식별자 목록보다 길면 나머지 행이 처리되지 않는다는 것입니다. 나는 이것이 당신이 끝날 것 인 상황인지는 모르지만 그것을 기록하는 것이 좋습니다. – natancodes

+0

이것은 멋지다, 고마워! 조금 시간이 지나면 다시 돌아가서 다시 돌아올 것입니다. 이 작업을 빨리보고 있으면 마스터 시트의 한 열에서 사전을 만드는 것입니다. 맞습니까? 내가 생각하고있는 것은 (다시, 나는 여전히 그걸 가지고 놀아야 만한다.)이 코드를 실행하면 그 정보에 대한 행이 추가 될 것이므로 이전 코드를 수정하여 새로운 범위를 업데이트 할 수 있어야한다. 그 후 대상 시트, 맞지? 덕분에 도와 줘서 고마워 .- 그것을 시험해보기를 고대하고있다. – Brumder

+0

마스터 시트와 대상 시트 모두에서 하나의 열에서 사전을 작성하고있다. - dictSource는 마스터 시트의 식별자와 식별자가있는 열을 가지고있다. 'dictTarget'은 대상 시트에 같은 식별자를 포함합니다. 두 사전에있는 식별자의 데이터를 대체하지 않고 대상 시트를 마스터 시트와 일치 시키려고 행이 삽입됩니다. 이것은 아마도 'Exists' 함수를 사용하여 키를 검색하기 때문에 하나의 사전이나 하나도 없어도 가능합니다. – natancodes