Avatar billede Sørensen Juniormester
23. januar 2018 - 09:51 Der er 9 kommentarer og
1 løsning

automatisk behandling af rådata

Hej

Jeg får 4 gange årligt en masse data, som jeg gerne vil have excel hurtig behandler for mig så jeg får et output som er nemt at overskue. Rådaten sætter jeg ind i et ”rådata” ark og herefter skal den automatisk gøre følgende ting for mig:

I arket ”rådata 1” vil jeg først gerne at den kigger på kolonne A ”Expiration date”, her skal den farve alle de datoer der ligger før d. 1/1-2018 røde.

Så vil jeg gerne at den overføre navnene fra kolonnen c ”lev.” og den tilhørende dato til den liste på ark ”udløb pr. 1 jan 2018” der matcher det navn der står i kolonne b ”certificate” ved siden af. Altså står der halal i kolonnen b skal den tage navnet i kolonne c og dato i kolonne a og overføre til ark ”udløb pr. 1 jan 2018” under Halal --> leverandør og certifikat udløb. Stadig kun på de datoer der er røde.

Er det noget der kan lade sig gøre med VBA??
Håber virkelig der er nogen der kan hjælpe mig:)

https://www.dropbox.com/s/1wisc8uh5fkspyu/Certifikatudl%C3%B8b%202018.xlsx?dl=0
Avatar billede finb Ekspert
23. januar 2018 - 09:57 #1
Har lige tid til den ene:
Betinget formattering: = år(celleA)<2018
""I arket ”rådata 1” vil jeg først gerne at den kigger på kolonne A ”Expiration date”, her skal den farve alle de datoer der ligger før d. 1/1-2018 røde.""
Avatar billede Mads32 Ekspert
23. januar 2018 - 14:04 #2
Hej

Et hurtigt svar.

Du kan anvende "Filter" på din oprindelige ark, Filtrer på kolonne "C" lev. for f. eks.halal, og på kolonne "A" hvor du først filtrerer på alle, og derefter sletter de datoer der ikke skal vises.

Det kan sikker opstilles med en formel for kolonne "A"
Avatar billede Tegler Mester
23. januar 2018 - 15:05 #3
Hej Therge
Jeg har lavet en VBA-løsning, der ser ud til at fungere. Makroen arbejder ud fra data i det aktive ark. Kopier koden ind i et VBA-modul. Bemærk at du i koden kan ændre udløbsdatoen og navnet på det ark, hvori du opsamler data'ene.

Sub SorterRaadata()

Dim Datelimit As String, ReportSht As Worksheet, StartCl As Range, i As Integer
Dim LFF()
Dim Halal()
Dim Kosher()
Dim Miljo()
Dim Okologi()
Dim RSPO()

Application.ScreenUpdating = False
Datelimit = "1-1-2018"  '<<<<-----Her kan du ændre certifikatudløbsdata

Set ReportSht = ThisWorkbook.Worksheets("pr. 1 jan 2018") '<<<<-----Her kan du ændre navnet på det tilhørende ark

'----------------------------------
'Lav en liste for hver certifikattype med de artikler/varer, der opfylder datokriteriet

ReDim LFF(0 To 1, 0 To 0)
ReDim Halal(0 To 1, 0 To 0)
ReDim Kosher(0 To 1, 0 To 0)
ReDim Miljo(0 To 1, 0 To 0)
ReDim Okologi(0 To 1, 0 To 0)
ReDim RSPO(0 To 1, 0 To 0)

ActiveSheet.Cells(2, 1).Select

While ActiveCell.Value <> ""

    If DateValue(ActiveCell.Value) < DateValue(Datelimit) Then
        ActiveCell.Interior.ColorIndex = 3
        Select Case True
       
            Case ActiveCell.Offset(0, 1).Value Like ("Ledelse*")
                ReDim Preserve LFF(0 To 1, 0 To UBound(LFF, 2) + 1)
                LFF(0, UBound(LFF, 2)) = ActiveCell.Value
                LFF(1, UBound(LFF, 2)) = ActiveCell.Offset(0, 2).Value
           
            Case ActiveCell.Offset(0, 1).Value Like ("Halal*")
                ReDim Preserve Halal(0 To 1, 0 To UBound(Halal, 2) + 1)
                Halal(0, UBound(Halal, 2)) = ActiveCell.Value
                Halal(1, UBound(Halal, 2)) = ActiveCell.Offset(0, 2).Value
               
            Case ActiveCell.Offset(0, 1).Value Like ("Kosher*")
                ReDim Preserve Kosher(0 To 1, 0 To UBound(Kosher, 2) + 1)
                Kosher(0, UBound(Kosher, 2)) = ActiveCell.Value
                Kosher(1, UBound(Kosher, 2)) = ActiveCell.Offset(0, 2).Value
               
            Case ActiveCell.Offset(0, 1).Value Like ("Miljø*")
                ReDim Preserve Miljo(0 To 1, 0 To UBound(Miljo, 2) + 1)
                Miljo(0, UBound(Miljo, 2)) = ActiveCell.Value
                Miljo(1, UBound(Miljo, 2)) = ActiveCell.Offset(0, 2).Value
           
            Case ActiveCell.Offset(0, 1).Value Like ("Økologi*")
                ReDim Preserve Okologi(0 To 1, 0 To UBound(Okologi, 2) + 1)
                Okologi(0, UBound(Okologi, 2)) = ActiveCell.Value
                Okologi(1, UBound(Okologi, 2)) = ActiveCell.Offset(0, 2).Value
               
            Case ActiveCell.Offset(0, 1).Value Like ("RSPO*")
                ReDim Preserve RSPO(0 To 1, 0 To UBound(RSPO, 2) + 1)
                RSPO(0, UBound(RSPO, 2)) = ActiveCell.Value
                RSPO(1, UBound(RSPO, 2)) = ActiveCell.Offset(0, 2).Value
        End Select
    End If
    ActiveCell.Offset(1, 0).Select
Wend

'-----------------------------------------
'Skriv listerne i de relevante kolonner i ReportSht
ReportSht.Activate
Set StartCl = Cells(2, 1).End(xlDown)
For i = 1 To UBound(LFF, 2)
    StartCl.Offset(i, 0).Value = LFF(1, i)
    StartCl.Offset(i, 2).Value = LFF(0, i)
Next

Set StartCl = Cells(2, 5).End(xlDown)
For i = 1 To UBound(Halal, 2)
    StartCl.Offset(i, 0).Value = Halal(1, i)
    StartCl.Offset(i, 2).Value = Halal(0, i)
Next

Set StartCl = Cells(2, 9).End(xlDown)
For i = 1 To UBound(Kosher, 2)
    StartCl.Offset(i, 0).Value = Kosher(1, i)
    StartCl.Offset(i, 2).Value = Kosher(0, i)
Next

Set StartCl = Cells(2, 13).End(xlDown)
For i = 1 To UBound(Miljo, 2)
    StartCl.Offset(i, 0).Value = Miljo(1, i)
    StartCl.Offset(i, 2).Value = Miljo(0, i)
Next

Set StartCl = Cells(2, 17).End(xlDown)
For i = 1 To UBound(Okologi, 2)
    StartCl.Offset(i, 0).Value = Okologi(1, i)
    StartCl.Offset(i, 2).Value = Okologi(0, i)
Next

Set StartCl = Cells(2, 21).End(xlDown)
For i = 1 To UBound(RSPO, 2)
    StartCl.Offset(i, 0).Value = RSPO(1, i)
    StartCl.Offset(i, 2).Value = RSPO(0, i)
Next

End Sub
Avatar billede Sørensen Juniormester
24. januar 2018 - 09:15 #4
Jeg kan få det til at virke med at den markere datoerne røde, men så ikke mere. Så kommer den med en fejlbox "Type mismatch"..??? Kan ikke se hvor det går galt??

https://www.dropbox.com/s/kdopbzoy8rmriw7/Certifikatudl%C3%B8b%202018.xlsm?dl=0
Avatar billede Tegler Mester
24. januar 2018 - 13:34 #5
Hej
Det er fordi der er rod i dine data i rådataarket. Når du kommer ned til række 2343 står der ikke  længere datoer i kolonne A, men producenter eller leverandører.
Desuden så anbringer jeg VBA-koden i et kodemodul, ikke i et regneark - men jeg ved ikke om det har nogen betydning...
Husk at sørge for at dit rådataark er det aktive ark, før du kører koden.
Vi kan tilføje lidt fejlfinding til koden, så du kan finde hvor det går galt:

While ActiveCell.Value <> ""
On Error GoTo msg:
    If DateValue(ActiveCell.Value) < DateValue(Datelimit) Then
Indsæt linjen med fed mellem de to andre linjer

Exit Sub
msg:
MsgBox "Fejl i celle " & ActiveCell.Address & vbCr & "Indhold: " & ActiveCell.Value

End Sub
Indsæt linjerne med fed lige før "End Sub"
Avatar billede Sørensen Juniormester
24. januar 2018 - 14:39 #6
Der skal ikke være data fra række 2343 af. Mine rådata går kun til 2342.
Det er data den sætter ind når jeg afspiller makroen, men kan se at det ligner det data jeg gerne vil have flyttet til "pr. 1 jan 2018" arket.

Jeg er ikke stærk nok til excel så jeg kan få den der fejlfinding kode til at virke. Noget andet jeg kan gøre??
Avatar billede Tegler Mester
24. januar 2018 - 16:20 #7
I det oprindelige regneark, du delte via Dropbox (certifikatudløb 2018.xlsx) er der data til og med række 3551. Fra række 2342 har de alle datoen 11-11-1111. Grunden til at du ikke kan se dem er, at din tabel er filtreret. Klik på filtersymbolet ved overskriften "Certificate" i celle B1.
Når jeg fjerner de fejlagtigt indsatte data og kører makroen, fungerer det problemfrit.
Men det kræver, at du kopierer koden ind i et Kodemodul og IKKE ind på 'Kodesiden' i dit regneark, som du havde gjort. Jeg har testet begge situationer. Det fejler, hvis man ikke gør, som jeg skriver.
Avatar billede Sørensen Juniormester
05. februar 2018 - 08:58 #8
Jeg har fået det til at virke nu, ved at gøre som du beskriver.
Jeg vil gerne have tilføjet en ekstra ting den skal gøre når jeg kører makroen, men kan simpelthen ikke regne ud hvad det er jeg skal tilføje??
Jeg vil gerne at den tager producent navnet fra kolonne D fra "Rådata" arket og flytter den til kolonnen B i "pr 1 jan. 2018" arket.
E det noget du kan hjælpe med??

https://www.dropbox.com/s/13nlfkh6tm96iaa/Certifikatudl%C3%B8b%202018.xlsm?dl=0
Avatar billede Tegler Mester
05. februar 2018 - 23:18 #9
Hej
Jeg har udvidet mine arrays, så de også medtager producenten. Erstat den relevante del af den gamle kode med dette:

'----------------------------------
'Lav en liste for hver certifikattype med de leverandører + producenter, der opfylder datokriteriet

ReDim LFF(0 To 2, 0 To 0)
ReDim Halal(0 To 2, 0 To 0)
ReDim Kosher(0 To 2, 0 To 0)
ReDim Miljo(0 To 2, 0 To 0)
ReDim Okologi(0 To 2, 0 To 0)
ReDim RSPO(0 To 2, 0 To 0)

ActiveSheet.Cells(2, 1).Select

While ActiveCell.Value <> ""

    If DateValue(ActiveCell.Value) < DateValue(Datelimit) Then
        ActiveCell.Interior.ColorIndex = 3
        Select Case True
       
            Case ActiveCell.Offset(0, 1).Value Like ("Ledelse*")
                ReDim Preserve LFF(0 To 2, 0 To UBound(LFF, 2) + 1)
                LFF(0, UBound(LFF, 2)) = ActiveCell.Value
                LFF(1, UBound(LFF, 2)) = ActiveCell.Offset(0, 2).Value
                LFF(2, UBound(LFF, 2)) = ActiveCell.Offset(0, 3).Value
           
            Case ActiveCell.Offset(0, 1).Value Like ("Halal*")
                ReDim Preserve Halal(0 To 2, 0 To UBound(Halal, 2) + 1)
                Halal(0, UBound(Halal, 2)) = ActiveCell.Value
                Halal(1, UBound(Halal, 2)) = ActiveCell.Offset(0, 2).Value
                Halal(2, UBound(Halal, 2)) = ActiveCell.Offset(0, 3).Value
               
            Case ActiveCell.Offset(0, 1).Value Like ("Kosher*")
                ReDim Preserve Kosher(0 To 2, 0 To UBound(Kosher, 2) + 1)
                Kosher(0, UBound(Kosher, 2)) = ActiveCell.Value
                Kosher(1, UBound(Kosher, 2)) = ActiveCell.Offset(0, 2).Value
                Kosher(2, UBound(Kosher, 2)) = ActiveCell.Offset(0, 3).Value
               
            Case ActiveCell.Offset(0, 1).Value Like ("Miljø*")
                ReDim Preserve Miljo(0 To 2, 0 To UBound(Miljo, 2) + 1)
                Miljo(0, UBound(Miljo, 2)) = ActiveCell.Value
                Miljo(1, UBound(Miljo, 2)) = ActiveCell.Offset(0, 2).Value
                Miljo(2, UBound(Miljo, 2)) = ActiveCell.Offset(0, 3).Value
           
            Case ActiveCell.Offset(0, 1).Value Like ("Økologi*")
                ReDim Preserve Okologi(0 To 2, 0 To UBound(Okologi, 2) + 1)
                Okologi(0, UBound(Okologi, 2)) = ActiveCell.Value
                Okologi(1, UBound(Okologi, 2)) = ActiveCell.Offset(0, 2).Value
                Okologi(2, UBound(Okologi, 2)) = ActiveCell.Offset(0, 3).Value
               
            Case ActiveCell.Offset(0, 1).Value Like ("RSPO*")
                ReDim Preserve RSPO(0 To 2, 0 To UBound(RSPO, 2) + 1)
                RSPO(0, UBound(RSPO, 2)) = ActiveCell.Value
                RSPO(1, UBound(RSPO, 2)) = ActiveCell.Offset(0, 2).Value
                RSPO(2, UBound(RSPO, 2)) = ActiveCell.Offset(0, 3).Value
        End Select
    End If
    ActiveCell.Offset(1, 0).Select
Wend

'-----------------------------------------
'Skriv listerne i de relevante kolonner i ReportSht
ReportSht.Activate
Set StartCl = Cells(2, 1).End(xlDown)
For i = 1 To UBound(LFF, 2)
    StartCl.Offset(i, 0).Value = LFF(1, i)
    StartCl.Offset(i, 1).Value = LFF(2, i)
    StartCl.Offset(i, 2).Value = LFF(0, i)
Next

Set StartCl = Cells(2, 6).End(xlDown)
For i = 1 To UBound(Halal, 2)
    StartCl.Offset(i, 0).Value = Halal(1, i)
    StartCl.Offset(i, 1).Value = Halal(2, i)
    StartCl.Offset(i, 2).Value = Halal(0, i)
Next

Set StartCl = Cells(2, 11).End(xlDown)
For i = 1 To UBound(Kosher, 2)
    StartCl.Offset(i, 0).Value = Kosher(1, i)
    StartCl.Offset(i, 1).Value = Kosher(2, i)
    StartCl.Offset(i, 2).Value = Kosher(0, i)
Next

Set StartCl = Cells(2, 16).End(xlDown)
For i = 1 To UBound(Miljo, 2)
    StartCl.Offset(i, 0).Value = Miljo(1, i)
    StartCl.Offset(i, 1).Value = Miljo(2, i)
    StartCl.Offset(i, 2).Value = Miljo(0, i)
Next

Set StartCl = Cells(2, 21).End(xlDown)
For i = 1 To UBound(Okologi, 2)
    StartCl.Offset(i, 0).Value = Okologi(1, i)
    StartCl.Offset(i, 1).Value = Okologi(2, i)
    StartCl.Offset(i, 2).Value = Okologi(0, i)
Next

Set StartCl = Cells(2, 26).End(xlDown)
For i = 1 To UBound(RSPO, 2)
    StartCl.Offset(i, 0).Value = RSPO(1, i)
    StartCl.Offset(i, 1).Value = RSPO(2, i)
    StartCl.Offset(i, 2).Value = RSPO(0, i)
Next


Vær opmærksom på, at den kode, du har skrevet ved hjælp af makro-recorderen bruger absolutte cellereferencer. Dvs kører du den på et andet datasæt med et andet antal poster, så får du et noget uforudsigeligt resultat.
Avatar billede Sørensen Juniormester
12. februar 2018 - 13:04 #10
Det er fantastisk. Det virker lige som jeg ønsker det.
Tusind tak for din hjælp, det sætter jeg pris på;)
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

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