Как сравнить строковые различия между двумя отдельными столбцами листов в Excel-VBA? - PullRequest
2 голосов
/ 19 июля 2011

Лист1 Лист2

Выше у меня есть две ссылки на изображения, которые я взял из моего документа Excel (Лист 1, Лист 2)

Вот краткое описание, я просто хочу, чтобы мои макросы сравнивали номер детали (столбец C) с обоих листов и выясняли различия. И когда между двумя листами обнаруживаются различия строк, она выделяет строку на обоих листах списка спецификаций, чтобы указать пользователю различия в номере детали (столбец C). Но это тоже проблема, поскольку на изображениях есть некоторые строки с «пробелом», о которых должен заботиться цикл, чтобы предотвратить сравнение пустой строки, что дает неверный результат.

Извините за плохое владение английским языком и объяснения, если вам не понятно. Может ли кто-нибудь помочь мне в этом, я довольно бесцелен в том, с чего и как начать, и я должен завершить это в течение недели без предварительных знаний о понимании программирования в Excel-VBA.

Изменено:

Я обновил свой пост, может кто-нибудь взглянуть и высказать свое мнение о том, как я могу изменить код, чтобы выделить всю строку столбца от A до P вместо столбца C Только различия значений диапазона?

Sub differences() 

    Dim ws1 As Worksheet, ws2 As Worksheet 
    Dim lastRow1 As Integer, lastrow2 As Integer 
    Dim rng1 As Range, rng2 As Range, temp As Range, found As Range 

    Application.ScreenUpdating = False 

    Set ws1 = ThisWorkbook.Sheets("Sheet1") 
    Set ws2 = ThisWorkbook.Sheets("Sheet2") 

    lastRow1 = ws1.Range("A" & Rows.Count).End(xlUp).Row 
    lastrow2 = ws2.Range("A" & Rows.Count).End(xlUp).Row 

    Set rng1 = ws1.Range("C21:C" & lastRow1) 
    Set rng2 = ws2.Range("C21:C" & lastrow2) 

    For Each temp In rng1 
        Set found = Find_Range(temp.Value, rng2, , xlWhole) 
        If found Is Nothing Then 
            temp.Interior.ColorIndex = 3 
        End If 
    Next temp 

    For Each temp In rng2 
        Set found = Find_Range(temp.Value, rng1, , xlWhole) 
        If found Is Nothing Then 
            temp.Interior.ColorIndex = 3 
        End If 
    Next temp 


End Sub 

Function Find_Range(Find_Item As Variant, Search_Range As Range, Optional LookIn As Variant, Optional LookAt As Variant, Optional MatchCase As Boolean) As Range 

    Dim c As Range 
    Dim firstAddress As String 

    If IsMissing(LookIn) Then LookIn = xlValues 'xlFormulas
    If IsMissing(LookAt) Then LookAt = xlPart 'xlWhole
    If IsMissing(MatchCase) Then MatchCase = False 

    With Search_Range 
        Set c = .Find(What:=Find_Item, LookIn:=LookIn, LookAt:=LookAt, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=MatchCase, SearchFormat:=False) 
        If Not c Is Nothing Then 
            Set Find_Range = c 
            firstAddress = c.Address 
            Do 
                Set Find_Range = Union(Find_Range, c) 
                Set c = .FindNext(c) 
            Loop While Not c Is Nothing And c.Address <> firstAddress 
        End If 
    End With 
End Function 

1 Ответ

0 голосов
/ 20 июля 2011

Поскольку я не вижу изображения, я сделаю предположение, что вы пытаетесь проверить, существует ли номер детали в другом списке, а если нет, выделите его.

Вне моей головы это то, что вам в основном нужно будет сделать.

Public Sub Test()
    CompareRange Sheet1.Range("A2", "A8"), Sheet2.Range("A2", "A8")
End Sub


Public Sub CompareRange(range1 As Range, range2 As Range)
    Dim CompareCell As Range
    Dim CheckCell As Range
    Dim CellFound As Boolean
    For Each CompareCell In range1.Cells
        CellFound = False
        For Each CheckCell In range2.Cells

            If CheckCell.Text = CompareCell.Text Then
                CellFound = True
            End If
        Next CheckCell
        If Not CellFound Then
            CompareCell.Interior.Color = vbYellow
        End If
    Next CompareCell
End Sub

Следует отметить, что эта функция предполагает наличие одного столбца диапазона. в противном случае он проверит все ячейки в ваших диапазонах и, вероятно, выделит больше, чем вы предполагали.

EDIT
Насколько выделение строки
попробуйте добавить это в ваш цикл поиска

Dim CompareSheet as Worksheet 'Add at top of function

'Add to the For Each Loop
Set CompareSheet = temp.Worksheet
CompareSheet.Range("A" & temp.Row, "P" & temp.Row).Interior.ColorIndex = 3
...