03. januar 2006 - 09:14Der er
22 kommentarer og 1 løsning
Finde ens celler i samme kolonne
Hejsa.
Jeg er igang med opbygningen af en stor database i excel. Ved godt at der findes andre programmer (f.eks. access), der er bygget til formålet, men dem har jeg ikke en brik forstand på, derfor blir det i excel... ;-)
Jeg har nu brug for at kunne sortere/søge efter 2 eller flere ens celler i en kolonne.
I stedet for at sortere i alfabetisk orden og derefter kigge listen igennem manuelt, vil jeg gerne have en eller anden funktion til at gøre det for mig, da listen meget hurtigt kan blive temmelig lang (5.000-10.000 rækker).
Findes der en søge funktion af en slags i excel, der kan finde ens celler i en kolonne, eller skal man lave en knap til det med noget vba-halløj bagved...??
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
Den simple løsning vil jo nok være Autofilter, hvis jeg forstår dig ret.
Hvis du skal have listen sorteret på antallet af forekomster, skal du også lige tilføje en kolonne, der tæller antallet af forekomster. Her kan du bruge =TÆL.HVIS()
Hmmm... jo måske Autofilter kan bruges til formålet... på en eller anden måde...
Så skal jeg bare ha TÆL.HVIS til at virke. For det er desværre ikke sådan at der måske er 5-10 forskellige værdier i kolonnen, men nærmere 5.000-10.000... :S Så hvordan får jeg fixet den...?
denne vba-kode markerer dubletter som gule. Du indsætter bare det hele i et modul og kører makroen test_mark_dups Derefter markerer du første celle i den kolonne du ønsker chekket og trykker ok.
Sub test_mark_dups() Dim Rng1 As Range Dim rstart1 As Range
Set rstart1 = Application.InputBox("Udpeg 1. celle i kolonnen at finde dubletter i ", , , , , , , 8) Set Rng1 = Range(rstart1.Offset(1, 0), rstart1.Cells(65536, 1).End(xlUp))
MarkDuplicates Rng1, vbYellow
End Sub
Private Sub MarkDuplicates(rlist As Range, lColor As Long) Dim Cell As Range Dim Uniqs As Object 'New Dictionary Set Uniqs = CreateObject("scripting.dictionary") Application.ScreenUpdating = False On Error Resume Next For Each Cell In rlist Uniqs.Add Cell.Value, CStr(Cell.Value) If Err.Number <> 0 Then Cell.Interior.Color = lColor Err.Clear Next Cell Application.ScreenUpdating = True
ok, nu har bak (som sædvanlig *S*) rystet en løsning ud af ærmet....
Men hvis du stadig er interesseret i Autofilter og TÆL.HVIS() løsningen, skal formlen se sådan ud: =TÆL.HVIS(A$1:A$30000;B1) Formlen læses sådan: tæl antallet af celler i området A1 til A30000, hvor indholdet er lig med indholdet af B1. Husk dollartegnet, specielt foran A1, da dataområdet ellers ændres, når cellen kopieres nedad.
bak: Det er lige præcis sådan noget som det jeg er ude efter... problemet er bare at når jeg kører makroen så siger den "Application-defined or object-defined error"... hvad gør jeg forkert...???
b_hansen: Hmmm...tror ikke jeg kan bruge TÆL.HVIS løsningen for jeg aner jo ikke hvad jeg skal sammenligne med... altså, jeg aner ikke hvad du i dit eksempel kalder B1 er... Det er en lang liste med forskellige navne, som hurtigt bliver udvidet...
Så er den lavet om. Husk at det stadig er overskriften der skal markeres
Sub test_mark_dups() Dim Rng1 As Range Dim rstart1 As Range
Set rstart1 = Application.InputBox("Udpeg 1. celle i kolonnen at finde dubletter i ", , , , , , , 8) Set Rng1 = Range(rstart1.Offset(1, 0), Cells(65536, rstart1.Column).End(xlUp))
MarkDuplicates Rng1, vbYellow
End Sub
Private Sub MarkDuplicates(rlist As Range, lColor As Long) Dim Cell As Range Dim Uniqs As Object 'New Dictionary Set Uniqs = CreateObject("scripting.dictionary") Application.ScreenUpdating = False On Error Resume Next For Each Cell In rlist Uniqs.Add Cell.Value, CStr(Cell.Value) If Err.Number <> 0 Then Cell.Interior.Color = lColor Err.Clear Next Cell Application.ScreenUpdating = True
Sub test_mark_dups() Dim Rng1 As Range Dim rstart1 As Range
Set rstart1 = ActiveSheet.Range("B1") Set Rng1 = Range(rstart1.Offset(1, 0), Cells(65536, rstart1.Column).End(xlUp))
MarkDuplicates Rng1, vbYellow End Sub
Private Sub MarkDuplicates(rlist As Range, lColor As Long) Dim Cell As Range Dim Uniqs As Object 'New Dictionary Set Uniqs = CreateObject("scripting.dictionary") Application.ScreenUpdating = False On Error Resume Next For Each Cell In rlist Uniqs.Add Cell.Value, CStr(Cell.Value) If Err.Number <> 0 Then Cell.Interior.Color = lColor Err.Clear Next Cell Application.ScreenUpdating = True
Jeg vil foreslå at du erstatter den første sub med denne her. Den fjerner de gamle farver først, inden den laver sammenligningerne.
Sub test_mark_dups() Dim Rng1 As Range Dim rstart1 As Range
Set rstart1 = ActiveSheet.Range("B1") Set Rng1 = Range(rstart1.Offset(1, 0), Cells(65536, rstart1.Column).End(xlUp)) Rng1.Interior.ColorIndex = 0 MarkDuplicates Rng1, vbYellow End Sub
hmmmm... tror ikke det er nødvendigt... for der skulle ikke gerne være andre farver i dokumentet på det tidspunkt.
hvis der er fundet dubletter på et tidligere tidspunkt (og disse er blevet markeret vha den makro) så skal de slettes helt fra listen...
Det kan måske bygges ind i den eksisterende makro at dubletten bliver slettet fra listen...??? Den skal så lige kopieres ind i et nyt ark så man jo kan se hvilke der skal fjernes... ;-) eller det er måske et nyt spørgsmål...???
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.