2015-03-20 2 views
-1

Я пытаюсь вставить пустые строки в 2 листа после сравнения между ними, используя Col A Или Col B в качестве руководства. И у меня есть более 10 столбцов и много строк. Может быть, я попытаюсь объяснить с упрощенным пример ниже:Сравните пустые строки в 2 листах, вставьте пустые строки, если они найдены разными. В VBA

Лист1

A B C    
1 2 3 
111 222 333 
1111 2222 3333 

Лист2

A B C    
1 2 3 
11 22 33 
1111 2222 3333 

После сравнения

Лист1

A B C    
1 2 3 
(insert a blank row) 
111 222 333 
1111 2222 3333 

Sheet2

A B C    
1 2 3 
11 22 33 
(insert a blank row) 
1111 2222 3333 

ответ

1

Я думаю, что нам нужно более подробно на примере. Логика пустых строк, по-видимому, добавляет пустую строку, если в противоположной таблице нет совпадения. Однако это будет очень сложно сделать, если они не будут отсортированы по определенному столбцу в том же направлении. Я не уверен в конкретном коде, но я думаю, что логикой этого будет вложенный цикл, который проверял каждую строку листа B на строке листа A. Пока он проверяет, он также должен нести переменную с ближайшим соответствием до значения, которое не больше значения. Таким образом, если он не найдет соответствия, он может вставить пустую строку после ближайшего совпадения, не переходя. Вы бы затем запустить тот же код, а затем проверить все значения в B против всех строк в A.

+0

это объяснение близко. я не могу объяснить, поэтому я объясню в упрощенном примере. Мой VBA не очень хорош. – saina

0

Поиграйте:

Sub InsertBlankIfNotMatched() 

    Dim rngA As Range 
    Dim rngB As Range 
    Dim lngDataCounter As Long 
    Dim lngRowCount As Long 
    Dim varData1 As Variant 
    Dim varData2 As Variant 

    Dim chk As Integer 
    chk = 1 
    Set rngA = Sheet1.Range("A1").CurrentRegion 
    Set rngB = Sheet2.Range("A1").CurrentRegion 
    lngRowCount = rngA.Rows.Count 
    For lngDataCounter = 1 To lngRowCount 
     varData1 = Application.Transpose(Application.Transpose(rngA.Rows(lngDataCounter).Value)) 
     varData2 = Application.Transpose(Application.Transpose(rngB.Rows(lngDataCounter).Value)) 

     If chk = 1 Then 
      If Join(varData1, "") <> Join(varData2, "") Then 
       rngA.Rows(lngDataCounter).Insert Shift:=xlDown 
       lngRowCount = lngRowCount + 1 
       chk = 2 
      End If 
     ElseIf chk = 2 Then 
      If Join(varData1, "") <> Join(varData2, "") Then 
       rngB.Rows(lngDataCounter).Insert Shift:=xlDown 
       lngRowCount = lngRowCount + 1 
       chk = 1 
      End If 
     End If 
    Next 

End Sub 
+0

«Application.transpose», используя это, потому что вы вроде как добавляете весь столбец «range A1»? «Если соединение (varData1,« ») <> Join (varData2," ")" Эта строка не содержит , поймите, пожалуйста, кто-нибудь мне объяснит, спасибо Arya: Спасибо, что предоставили такую ​​приятную кодировку образец. Я играл с ним, я нашел то, что мне нужно. Кстати, вы – saina

+0

1. вам нужно сравнить 2 строки, поэтому нужно быть в одной ступени, поэтому я использовал объединение, которое объединяет массив с разделителем, как в первой строке, его 1 | 2 | 3 я беру его в массив и присоединяюсь к «» к результату 123. – Arya

+0

2. Если вы отлаживаете проверку кода только ** rngA.Rows (lngDataCounter) .Value ** и проверьте с помощью ** Application.Transpose (Application .Transpose (rngA.Rows (lngDataCounter) .Value)) **, это просто очистить ненужное измерение для ** varData1 ** – Arya