08. juni 2006 - 13:50Der er
21 kommentarer og 2 løsninger
Fjerne ens linier
Hejsa
Jeg leder efter noget hjælp til følgende funktion:
Enten en makro eller bare en formel (jeg ved ikke hvordan det løses bedst)
------------ Jeg har kolonne A = Bilagsnr. Jeg har kolonne B = Beløb Jeg har kolonne C = Bilagsnr. Jeg har kolonne D = Beløb ------------
Funktionen skal søge fra toppen af kolonne A. For hvert bilagsnr. den støder på der er ens med et bilagsnr. i kolonne C, skal den tjekke om kolonne B * 25% er lig med beløbet i kolonne D ud fra det samme bilagsnr.
Hvis de er det skal den slette linierne, og fortsætte søgningen/sletningen.
Så er den klar. Først tager du en kopi af din fil, dernæst vælger du Funktioner -> Makro -> Visual Basic Editor Så vælger du Insert -> Module I det tomme vindue kopierer du følgende kode ind: Public Sub deleteThem() Set StartRange = Range("A2", Range("A2").End(xlDown)) Set CompRange = Range("C2", Range("C2").End(xlDown))
For Each Acell In StartRange BilagA = Acell BeloebA = Acell.Offset(0, 1)
For Each Bcell In CompRange BilagB = Bcell BeloebB = Bcell.Offset(0, 1)
If BilagA = BilagB Then If BeloebB = (0.25 * BeloebA) Then Range(Acell, Acell.Offset(0, 1)).Delete Shift:=xlUp Range(Bcell, Bcell.Offset(0, 1)).Delete Shift:=xlUp End If End If Next Next End Sub
Så er du klar til at gå tilbage i Excel og vælge Funktioner -> Makro -> Afspil -> deleteThem
Husk at ting slettet i VBA ikke kan genskabes, så sørg for at du udfører opgaven på en kopi til at starte med, så du kan kontrollere om den har den ønskede effekt. Jeg har taget udgangspunkt i det du har skrevet den skal kunne, men hvis den ikke kan det, så må du skrive det tydligere, så skal jeg se om jeg har tid til at rette den til.
Og for en god ordens skyld må vi hellere sige at kolonne C og D er i et andet ark, ellers kan det jo ikke lade sig gøre at slette linien kan jeg regne ud, når det ikke altid er samme linie som samme bilagnr. er på
Hmmm, det ville jeg gerne have vidst inden jeg lavede koden, men jeg har en hurtig måde at løse det på, og den ligger hos dig :D
Du følger mit svar, og lige inden du kører makroen kopierer du lige numrene fra det andet ark, over i det med koden, så de står i kolonne C og D, så virker det stadig, når du så har kørt makroen klipper du bare kolonne c og d tilbage i det rigtige ark!
Nu har jeg prøvet din kode, hvor alle data ligger i samme dokument, som første beskrevet.
Det virker ikke, synes jeg.
Og jeg tror desværre ikke helt jeg forstår hvad du siger jeg skal gøre i anden forklaring.
Er der nogle som kan klare mit problem. Det helt optimale er at alle data kan ligge som først forklaret, altså i samme ark. Men at den så bare sletter data i kolonne A+B og efterfølgende C+D hvis de opfylder betingelserne, og altså ikke sletter rækken. Bilagsnr. står i fleste tilfælde stadig ikke i samme række
du skriver: .. skal den tjekke om kolonne B * 25% er lig med beløbet i kolonne D .. skal det være: D = B * 0,25 eller D = B * 1,25?
hvis det skal være B *1,25 rett opp denne linje: If Cells(a - i, 2).Value * 0.25 = Cells(c, 4).Value Then
Det blir lett feil når man behandler range i excel vba samtidig som man driver å sletter celler i det samme range, men prøv denne koden.
Public Sub deleteThem() i = 0 For a = 2 To Range("A" & Rows.Count).End(xlUp).Row For c = 2 To Range("C" & Rows.Count).End(xlUp).Row If Cells(a - i, 1).Value = Cells(c, 3).Value Then If Cells(a - i, 2).Value * 0.25 = Cells(c, 4).Value Then Cells(a - i, 1).Resize(1, 2).Delete Shift:=xlUp Cells(c, 3).Resize(1, 2).Delete Shift:=xlUp i = i + 1 Exit For End If End If Next Next End Sub
mira96ac du er ikke ret specifik i dine tilbagemeldinger... Du forklarer ikke hvordan det kan være at det ikke virker. Når min kode finder ud af, at der i kolonne A er et bilagsnr. som stemmer med bilagsnummeret i C, så tjekker den at D = B*0,25 altså at D er fire gange mindre end B, hvis det er tilfældet fjerner den de to celler i A + B og herefter de to celler i C + D.
Du må fortælle mig hvordan den skal virke, hvis jeg skal kunne tilpasse den. Er det fordi kriteriet er anderledes? Er det fordi ens bilagsnr. med passende beløb fremkommer mere end en gang, eller hvad er det?
Den virker som det skal. Og det er som du har lavet at D = B * 0,25.
Men D er ikke altid præcist 25% af B. Der vil oftest være afrundet op eller ned. Kan man indflette dette i formlen, så den accepterer en afvigelse når der f.eks. afrundes til 2 decimaler ?
mira96ac! det bør la seg gjøre. Det enkleste er hvis denne koden fungerer:
Public Sub deleteThem() i = 0 For a = 2 To Range("A" & Rows.Count).End(xlUp).Row For c = 2 To Range("C" & Rows.Count).End(xlUp).Row If Cells(a - i, 1).Value = Cells(c, 3).Value Then If Round(Cells(a - i, 2).Value * 0.25, 2) = Round(Cells(c, 4).Value, 2) Then Cells(a - i, 1).Resize(1, 2).Delete Shift:=xlUp Cells(c, 3).Resize(1, 2).Delete Shift:=xlUp i = i + 1 Exit For End If End If Next Next End Sub
Mit bud er at fejlen i min kode skyldes, at der bliver slettet en linie, hvorefter ranget bliver ændret, det kan jeg godt rette, men hvis du vil bruge den anden kode, så vil jeg ikke bruge tid på det.
Det nye problem er straks langt værre. Det er farligt at give et script mulighed for at runde beløb op eller ned, medmindre du er 100% sikker på, at der ikke vil være beløb der kan ligge tæt på 25%, som ikke skal slettes.
Det lyder som en løsning Oyejo. Hvordan skal jeg gøre hvis den skal teste på et beløb mellem 24% og 26% ?
Og et bonus-spørgsmål. Kan man ændre funktionen, så den ikke sletter felterne når testen=sand. Den skal i stedet klippe felterne i kolonne A+B og C+D som matcher hinanden til f.eks. kolonne E+F og G+H så de står ud for hinanden.
Jeg skal eventuelt give flere point ved løsning af ovenstående.
Jeg har fjernet afrunding med 2 decimaler fra Oyejo's kode, det betyder at 100 * 25% = 25 bliver sammenlignet med Afrund(25,001; 0) = 25 Det burde fungere, og er i øvrigt en bedre løsning, end at tage fra 24-26%. Det eneste der kan ske af fejl, er hvis tallene bliver forkert afrundet, når de bliver tastet ind.
Public Sub deleteThem2() i = 0 For a = 2 To Range("A" & Rows.Count).End(xlUp).Row For c = 2 To Range("C" & Rows.Count).End(xlUp).Row If Cells(a - i, 1).Value = Cells(c, 3).Value Then If Round(Cells(a - i, 2).Value * 0.25, 0) = Round(Cells(c, 4).Value, 0) Then Cells(a - i, 1).Resize(1, 2).Delete Shift:=xlUp Cells(c, 3).Resize(1, 2).Delete Shift:=xlUp i = i + 1 Exit For End If End If Next Next End Sub
Public Sub deleteThem() Dim vData(3) i = 0 For a = 2 To Range("A" & Rows.Count).End(xlUp).Row For c = 2 To Range("C" & Rows.Count).End(xlUp).Row If Cells(a - i, 1).Value = Cells(c, 3).Value Then If Cells(a - i, 2).Value * 0.24 < Cells(c, 4).Value Then If Cells(a - i, 2).Value * 0.26 > Cells(c, 4).Value Then vData(0) = Cells(a - i, 1) vData(1) = Cells(a - i, 2) vData(2) = Cells(c, 3) vData(3) = Cells(c, 4) Cells(a - i, 1).Resize(1, 2).Delete Shift:=xlUp Cells(c, 3).Resize(1, 2).Delete Shift:=xlUp Cells(Range("E" & Rows.Count).End(xlUp).Row + 1, 5). _ Resize(1, 4).Value = vData() i = i + 1 Exit For End If End If End If Next Next End Sub
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.