Avatar billede mira96ac Novice
08. juni 2006 - 13:50 Der 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.

Kan det lade sig gøre ?

mira96ac
Avatar billede lillebror Nybegynder
08. juni 2006 - 15:08 #1
Det kan lade sig gøre med en makro. En formel kan evt sætte et tegn ud for hver linie, men du vil ikke kunne bede en formel om at slette rækker
Avatar billede mira96ac Novice
08. juni 2006 - 16:09 #2
Okay

Er der nogle som er villige til at hjælpe med en makro.
Avatar billede lillebror Nybegynder
08. juni 2006 - 16:14 #3
Stiller lige et afklarende spørgsmål.
Vil ens bilagnumre altid stå i samme række?
Avatar billede lillebror Nybegynder
08. juni 2006 - 16:29 #4
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.
Avatar billede mira96ac Novice
08. juni 2006 - 16:43 #5
Nej de vil ikke altid stå i samme række...
Avatar billede mira96ac Novice
08. juni 2006 - 16:51 #6
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å
Avatar billede mira96ac Novice
08. juni 2006 - 16:51 #7
Håber du får tid til at kigge på det
Avatar billede lillebror Nybegynder
08. juni 2006 - 17:26 #8
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!
Avatar billede lillebror Nybegynder
08. juni 2006 - 17:27 #9
Det eneste jeg bare lige skal være sikker på, det er at du vil have fjernet linierne fra begge dokumenter? For det er det den gør lige nu!
Avatar billede mira96ac Novice
09. juni 2006 - 08:24 #10
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

Giver det mening ?
Avatar billede oyejo Nybegynder
10. juni 2006 - 12:00 #11
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
Avatar billede lillebror Nybegynder
10. juni 2006 - 18:05 #12
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?
Avatar billede mira96ac Novice
11. juni 2006 - 17:25 #13
Sorry at jeg ikke har svaret så hurtigt og undskyldt til lillebror for mine dårlige tilbage meldinger. Jeg prøver at forklare lidt bedre.

Jeg laver følgende:
A          B                C                D
2        100              2                25
4        200              4                50
6        300              6                75
8        400              8                120 (30%)
10        500              11                125 (ikke samme nr i kolonne A og C)

Nu burde række 1-3 fjernes. Men den fjerner kun række 1 og 3. Kører jeg herefter makroen igen fjerner den også rigtigt nok række 2 ???
Avatar billede mira96ac Novice
11. juni 2006 - 17:27 #14
Til Oyejo.

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 ?
Avatar billede oyejo Nybegynder
12. juni 2006 - 07:26 #15
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
Avatar billede mira96ac Novice
12. juni 2006 - 09:13 #16
Jeg synes desværre ikke at det virker. Hvis jeg ændrer linie 3, kolonne D til 75,01, så svarer det til 25,00333%. Dette bliver ikke skjult.
Avatar billede oyejo Nybegynder
12. juni 2006 - 09:31 #17
Du har rett, den feiler fordi 75 ikke er lik 75,01 selv om det er 2 desimaler
Er litt usikker på hvilke kriterier vi skal bruke.

Hva med en test der beløpet må være større enn 24% og mindre enn 26%

kan også teste beløp for eksempel større enn 75 -1 og mindre enn 75+1
Avatar billede lillebror Nybegynder
12. juni 2006 - 12:22 #18
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.
Avatar billede mira96ac Novice
15. juni 2006 - 17:54 #19
Sorry. Har været bortrejst et par dage.

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.
Avatar billede lillebror Nybegynder
19. juni 2006 - 16:09 #20
Hejsa mira96ac

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
Avatar billede oyejo Nybegynder
19. juni 2006 - 17:25 #21
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
Avatar billede mira96ac Novice
20. juni 2006 - 13:37 #22
Jeg takker for hjælpen og leger lidt videre med det selv.

Jeg deler pointene mellem jer, da i begge har hjulpet
Avatar billede oyejo Nybegynder
23. juni 2006 - 17:24 #23
Lykke til og takk for point's
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester