/ / Find første ikke-blanke celle for hver søjle fra rækker, der matcher opslag for at fusionere dobbelt matcher - excel, excel-vba, excel-formel, vlookup, excel-2013, vba

Find første ikke-blanke celle for hver søjle fra rækker, der matcher opslag for at fusionere dobbelt matcher - excel, excel-vba, excel-formel, vlookup, excel-2013, vba

Jeg har et regneark, der er kombineret kontaktlister fra en række kilder, med varierende grad af fuldstændighed. Nogle kontakter har givet deres information flere gange, men efterladt forskellige felter tomt hver gang. Jeg søger at fjerne mindst nogle af dubletterne ved at kombinere rækker for at udfylde de tomme værdier.

Her er et forenklet eksempel på, hvordan mine data ser ud

id    email                    phone    company    job title
01    johnsmith@example.com    5550123  acme inc
01    johnsmith@example.com             acme inc   CEO
02    janedoe@gmail.com                 XYZ Co
02                             5555555
03    frank@school.edu
03    frank@school.edu                  school
03    frank@school.edu         5551111
04    bob@promoted.com                  job inc    VP Sales
04    bob@promoted.com                  job inc    mail clerk

Hvis jeg er i stand til at få alle emner udfyldt dafjernelse af dubletter uden at miste data og håndtere sager som sidstnævnte vil være trivielle. En løsning, der også de-dupes, mens du ikke bryder eller sletter sag, ville også fungere.

Jeg har ikke fundet en måde at få krigen til sløjfegennem alle kampe indtil den finder et ikke-tomt resultat, medmindre jeg sorterer hver kolonne. Desværre har mine rigtige data 100 + kolonner og flere tusinde rækker, så det gøres manuelt, for hver kolonne er upraktisk.

svar:

0 for svar № 1

Sådan gør du det her.

Forudsætter at:

  1. Dataene er i Sheet1, og at de starter i celle A1.

  2. Du har et tomt ark2.

Procedure:

  1. Skift til Sheet2.

  2. Indtast denne formel i celle A1: =Sheet1!A1

  3. Kopier den celle til B1 og A2.

  4. I celle B2 indtaste denne formel:

.

=IFERROR(INDEX(INDEX(Sheet1!B:B,MATCH(Sheet1!$A2,Sheet1!$A:$A,0)):INDEX(Sheet1!B:B,MATCH(Sheet1!$A2,Sheet1!$A:$A,1)),MATCH(TRUE,LEN(INDEX(Sheet1!B:B,MATCH(Sheet1!$A2,Sheet1!$A:$A,0)):INDEX(Sheet1!B:B,MATCH(Sheet1!$A2,Sheet1!$A:$A,1)))>0,0)),"")

Dette er en array formel og skal bekræftes med Ctrl+Flytte+Gå ind.

.

  1. Kopier celle B2.

  2. Vælg område B3 til B2000 (eller hvor langt du skal gå) og indsæt.

  3. Vælg hele kolonne B ved at klikke på kolonne B-overskriften øverst på arket.

  4. Kopier kolonne B.

  5. Vælg kolonne C til Z (eller hvor mange du har brug for) og indsæt.

Det er det.

Tip: Når formlerne har gjort deres ting, kan du kopiere alle cellerne på Sheet2 ved at klikke på den lille grå firkant i det yderste øvre venstre hjørne af arket og Indsæt specielle som værdier. Dette erstatter alle formler med hårde værdier på ark 2.


0 for svar № 2

Dette er baseret på princippet om at sortere akolonne af emner og værdier vil efterlade emnerne nederst. Ved at cykle gennem kolonnerne og sortere hver sektion af lignende ID'er, vil de ikke-blanke værdier stige til toppen. Disse kan let bruges til at udfylde celler i de nederste rækker.

Sub fill_in_the_blanks()
Dim rw As Long, cl As Long, id As Variant
With Worksheets("Sheet1")
With .Cells(1, 1).CurrentRegion
.Cells.Sort Key1:=.Columns(1), Order1:=xlAscending, _
Orientation:=xlTopToBottom, Header:=xlYes
For rw = 2 To .Rows.Count
If id <> .Cells(rw, 1).Value2 Then
id = .Cells(rw, 1).Value2
With .Cells(rw, 1).Resize(Application.CountIf(.Columns(1), .Cells(rw, 1).Value), .Columns.Count)
For cl = 2 To .Columns.Count
.Cells.Sort Key1:=.Columns(1), Order1:=xlAscending, _
Key2:=.Columns(cl), Order2:=xlAscending, _
Orientation:=xlTopToBottom, Header:=xlNo
If CBool(Application.CountA(.Columns(cl))) And _
CBool(Application.CountBlank(.Columns(cl))) Then
With .Columns(cl).SpecialCells(xlCellTypeBlanks)
.FormulaR1C1 = "=r[-1]c"
.Value = .Value2
End With
End If
Next cl
End With
End If
Next rw
.RemoveDuplicates Columns:=1, Header:=xlYes
End With
End With
End Sub

Området, der skal arbejdes på, styres af Range.CurrentRegion ejendom. Der bør ikke være fuldstændigt tomme rækker eller kolonner, der adskiller "øen" med data.

Udfylde de tomme felter


Beslægtede spørgsmål


Kommentarer (0)

Tilføj en kommentar