Excel - porovnání dvou sloupců Vyřešeno

Programy pro práci v kanceláři (Word, Excel, Access…=>Office)

Moderátor: Mods_senior

vetchy
nováček
Příspěvky: 2
Registrován: prosinec 10
Pohlaví: Nespecifikováno
Stav:
Offline

Excel - porovnání dvou sloupců

Příspěvekod vetchy » 12 pro 2010 10:36

Dobrý den,
potřebuji poradit s porovnáním dvou sloupců v Excelu.

Ve sloupci B mám data (některé hodnoty se zde mohou opakovat). Ve sloupci C mám další data (opět se zde mohou různá data opakovat a můžu mít jiný počet dat než ve sloupci B).

Mou snahou je porovnat oba dva sloupce a vyloučit z nich položky, které jsou v obou dvou stejné. Např. když budu mít ve sloupci B hodnotu 1 3x a ve sloupci C pouze jednou, tak výsledkem porovnání bude, že ve sloupci A zůstane hodnota 1 2x a ve sloupci C nebude žádná.

Data v obou dvou sloupcích lze seřadit. Není podmínkou, aby výsledné porovnané sloupce byly opět B,C, ale pokud by to šlo, bylo by to lepší.

Navržený postup budu aplikovat na různě velé soubory dat (od pár údajů až po několik tisíc položek v každém ze sloupců).

Přikládám soubor s ukázkovými daty.

Poradí někdo? Už dlouho si s tím lámu hlavu.

Předem děkuji.
Přílohy
Pokus.xls
(18.5 KiB) Staženo 183 x

Reklama
navstevnik
Level 4
Level 4
Příspěvky: 1142
Registrován: srpen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Excel - porovnání dvou sloupců  Vyřešeno

Příspěvekod navstevnik » 12 pro 2010 12:57

Resenim je procedura VBA.
V editoru VBA (Alt+F11) vloz do standardniho modulu nize uvedenou proceduru a zavolej v editoru VBA klavesou F5 nebo v listu nabidka Nastroje>Makro>Makra>....:

Kód: Vybrat vše

Option Explicit

Sub ClearContentsClls()
  Dim BlkA As Range, BlkB As Range
  Dim Cll As Range, CllClr As Range
  Dim CntA As Long, CntB As Long, CntClr As Long
  Dim CntTmp As Long, CllTmp As Variant

  With Worksheets("list1")
    Set BlkA = .Range("b3:b" & Cells(.Rows.Count, 2).End(xlUp).Row)
    Set BlkB = .Range("c3:c" & Cells(.Rows.Count, 3).End(xlUp).Row)
    For Each Cll In BlkA.Cells
      If Cll <> vbNullString Then
        With WorksheetFunction
          CntA = .CountIf(BlkA, Cll.Value)
          CntB = .CountIf(BlkB, Cll.Value)
        End With
        CntClr = CntA
        If CntA > CntB Then
          CntClr = CntB
        End If
        If CntClr > 0 Then
          CllTmp = Cll.Value
          With BlkA
            CntTmp = 0
            Set CllClr = .Find(CllTmp, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)
            Do
              CllClr.ClearContents
              CntTmp = CntTmp + 1
              If CntTmp = CntClr Then Exit Do
              Set CllClr = .FindNext(CllClr)
            Loop
          End With
          With BlkB
            CntTmp = 0
            Set CllClr = .Find(CllTmp, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)
            Do
              CllClr.ClearContents
              CntTmp = CntTmp + 1
              If CntTmp = CntClr Then Exit Do
              Set CllClr = .FindNext(CllClr)
            Loop
          End With
        End If
      End If
    Next Cll
  End With
  BlkA.Sort Key1:=Range(BlkA.Resize(1, 1).Address), Order1:=xlAscending, Header:=xlYes, _
      OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
  BlkB.Sort Key1:=Range(BlkB.Resize(1, 1).Address), Order1:=xlAscending, Header:=xlYes, _
      OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
  Set Cll = Nothing
  Set CllClr = Nothing
  Set BlkA = Nothing
  Set BlkB = Nothing
End Sub

Podle potreby v procedure uprav nazev listu a cast adresy (je vcetne hlavicek sloupcu) a cislo sloupce (A:A=1, B:B=2,...) pro definici adresy porovnavanych bloku:
...
With Worksheets("list1")
Set BlkA = .Range("b3:b" & Cells(.Rows.Count, 2).End(xlUp).Row)
Set BlkB = .Range("c3:c" & Cells(.Rows.Count, 3).End(xlUp).Row)
...

Testuj na kopii dat, nejsou osetreny chybove stavy vznikle v dusledku nespravneho zadani adres.

vetchy
nováček
Příspěvky: 2
Registrován: prosinec 10
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Excel - porovnání dvou sloupců

Příspěvekod vetchy » 12 pro 2010 20:47

Ahoj,
díky moc za dané makro. Zatím jsem je vyzkoušel na dvou různých souborech a vždy to udělalo přesně to, co jsem potřeboval.
Jelikož tuto operaci budu používat docela často ušetří mi to moc práce a času, takže ještě jednou díky.

// Označuji za vyřešené.
// mike007


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • PowerQuery - import dat do sloupců Příloha(y)
    od MK_Vs » 31 říj 2023 10:00 » v Kancelářské balíky
    9
    2213
    od MK_Vs Zobrazit poslední příspěvek
    02 lis 2023 09:26
  • Porovnání technologie TV
    od Faster1 » 04 zář 2023 06:01 » v Vše ostatní (hw)
    6
    2005
    od Faster1 Zobrazit poslední příspěvek
    08 zář 2023 16:27
  • Porovnání hodnot ve sloupci Příloha(y)
    od luko02420 » 02 srp 2023 14:12 » v Kancelářské balíky
    0
    1812
    od luko02420 Zobrazit poslední příspěvek
    02 srp 2023 14:12
  • Fúze dvou PC
    od Luis » 10 čer 2023 15:04 » v Rady s výběrem hw a sestavením PC
    4
    754
    od petr22 Zobrazit poslední příspěvek
    11 čer 2023 13:51
  • Scan a tisk u dvou tiskáren
    od amirinda » 14 říj 2023 06:49 » v Vše ostatní (sw)
    12
    2210
    od amirinda Zobrazit poslední příspěvek
    14 říj 2023 16:39

Zpět na “Kancelářské balíky”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti