Avatar billede mrkr Juniormester
28. maj 2008 - 10:26 Der er 16 kommentarer og
1 løsning

teste om 1 tal er brugt på flere at gruppehold

I kolonne D står der tal fra 1 - 49 der angiver hold.
Det samme tal bliver brugt flere gange.

I kolonne G står der næsten altid noget, men ikke altid.
Det tal der står i kolonne G er typisk fra 100-199

Tallet i kolonne G må gerne anvendes flere gange, men må kun anvendes på et unikt tal fra kolonne D.

dvs. tallet 101 må gerne stå i kolonne G i mange linier men der SKAL stå det samme tal f.eks. 10 i kolonne D i alle disse linier.

Er det ikke tilfældet skal der poppe en meddelelse op som fortæller hvilket linienr. der er gal med. (gerne incl. den tekst der står i kolonne A i pågældende linie.

Hvis det kan lade sig gøre den meget gerne skrive:
Fejl:
tekst fra kolonne A          tekst kolonne D  TEkst kolonne G     
tekst fra kolonne A          tekst kolonne D  TEkst kolonne G     
og så videre

Altså vise alle de linier der giver problemer.
Avatar billede supertekst Ekspert
28. maj 2008 - 10:58 #1
Hvor mange rækker er der tale om (ca)?
Avatar billede mrkr Juniormester
28. maj 2008 - 11:03 #2
der er tale om ca. 500 rækker.
Som udgangspunkt sker denne fejl ikke, det er bare en sikkerhedsforanstaltning.

Typisk er der ca 10 i hver gruppe.
Avatar billede mrkr Juniormester
28. maj 2008 - 11:11 #3
det optimale ville være at fejlmeddelesen sorterede efter nr i kol. D
Sådan at den viste fejlen gruppevis.
Aner ikke om det kan lade sig gøre, men hvis man ikke spørger, så finder man heller ikke ud af det :-)
Avatar billede supertekst Ekspert
28. maj 2008 - 11:20 #4
Det er ganske korrekt - men det skulle nok kunne lade sig gøre - vender tilbage lidt senere...
Avatar billede supertekst Ekspert
28. maj 2008 - 14:31 #5
Forslag med en lidt anden visualisering - men prøv at se på det...

Rem Ved uoverenstemmelser opbygges en kolonne til højre med Holdnr i første række
Rem og rækkenr neden under.
Rem Hold er anført i rækkefølge  - ej fejlmeldte holdnr er ikke anført - derfor
Rem tomme kolonner - fra venstre mod højre
Rem Koden indsættes i aktuelle ark

Const startRæk = 1                          'kan justeres
Dim antalRæk, antalKol
Public Sub TestAfNr()
Dim gnr, dnr

    Application.ScreenUpdating = False
   
Rem Find antal rækker
    antalRæk = ActiveCell.SpecialCells(xlLastCell).Row
    antalKol = ActiveCell.SpecialCells(xlLastCell).Column
       
Rem Gennenløb af rækker indtil sidste række
    For ræk = startRæk To antalRæk
        gnr = Cells(ræk, 7)
        dnr = Cells(ræk, 4)
       
Rem Er gNr udfyldt og holdnr ikke checket
        If gnr <> "" And Cells(ræk, 4).Interior.ColorIndex = xlNone Then
            checkOk gnr, dnr, ræk
        End If
    Next ræk
   
    Application.ScreenUpdating = True
   
Rem Gennemløb afsluttet - hvis evt. fejl
    MsgBox ("Gennemløb afsluttet")
End Sub
Private Sub checkOk(gnr, holdNr, aktuelleRække)
Dim aGnr, aDnr, aktuelleKol, fejlRæk, flag As Boolean
   
    flag = False
   
    If aktuelleRække < antalRæk Then
        For ræk = aktuelleRække + 1 To antalRæk
            aGnr = Cells(ræk, 7)
            aDnr = Cells(ræk, 4)
           
            If aGnr = gnr And Cells(ræk, 4).Interior.ColorIndex = xlNone Then
Rem Hvis ens Gnr - så check om Holdnr er ens
                If aDnr <> holdNr Then
Rem Beregn kolonne iflg. Holdnr
                    aktuelleKol = antalKol + holdNr
Rem Find ledige række i denne kolonne
                    For r = 2 To 65000
                        If Cells(r, aktuelleKol) = "" Then
                            fejlRæk = r
                            Exit For
                        End If
                    Next r
Rem gem række med uoverensstemmelse i kolonne for holdnr
                    If flag = False Then
Rem udgangsrækken markeres
                        Cells(fejlRæk, aktuelleKol) = aktuelleRække
                        fejlRæk = fejlRæk + 1
                        flag = True
                        Cells(aktuelleRække, 4).Interior.ColorIndex = 6
                    End If
                   
                    Cells(fejlRæk, aktuelleKol) = ræk
                    If Cells(1, aktuelleKol) = "" Then
                        Cells(1, aktuelleKol) = holdNr
                        Cells(1, aktuelleKol).Font.Bold = True
                    End If
                   
Rem marker HoldNr (dNnr-cellen) som testet
                    Cells(ræk, 4).Interior.ColorIndex = 6
                End If
            End If
        Next ræk
    End If
End Sub
Avatar billede mrkr Juniormester
28. maj 2008 - 15:00 #6
Så har jeg testet lidt på koden.
Det viser jo fint hvor den er galt, og det meget nemt at finde fejlene. Men jeg vil alligevel høre om der kan rettes lidt i koden.

a) når man har rettet fejlene, bliver farvekoden ved med at være gul, også selvom man kører koden igen. Kunne man evt. slette alle farvekoder inden gennemløbet.

b) da jeg har en del linier den løber igennem kunne jeg rigtig godt tænke mig at den lavede en besked med:
Der er fejl i linierne
tekst i kol. A  + tekst i kol G
do
do
do
Avatar billede supertekst Ekspert
28. maj 2008 - 15:10 #7
a)
OK - farve og kolonnerne med fejl-nr kan slettes inden fornyet gennemløb

b)
Hvornår ønsker du dette skal ske?
Skal det være som en message-boks?
Avatar billede mrkr Juniormester
28. maj 2008 - 15:14 #8
ja, det må meget gerne være en message-boks til sidst når alle liner er løbet igennem.
Avatar billede supertekst Ekspert
28. maj 2008 - 15:27 #9
OK
Avatar billede supertekst Ekspert
28. maj 2008 - 16:07 #10
Giv signal, hvis alle fejllinier ikke kan vises i msgbox'en - evt. skal der være flere pr. linie.

Rem Version 2
Rem =========
Rem Ved uoverenstemmelser opbygges en kolonne til højre med Holdnr i første række
Rem og rækkenr neden under.
Rem Hold er anført i rækkefølge  - ej fejlmeldte holdnr er ikke anført - derfor
Rem tomme kolonner - fra venstre mod højre
Rem Koden indsættes i aktuelle ark

Const startRæk = 1                          'kan justeres
Dim antalRæk, antalKol
Public Sub TestAfNr()
Dim gnr, dnr

Rem Find antal rækker
    antalRæk = ActiveCell.SpecialCells(xlLastCell).Row
    antalKol = ActiveCell.SpecialCells(xlLastCell).Column

Rem Slet tidligere farve-markeringer
    Columns("D").Select
    Selection.Cells.Interior.ColorIndex = xlNone

    Application.ScreenUpdating = False
Rem Gennenløb af rækker indtil sidste række
    For ræk = startRæk To antalRæk
        gnr = Cells(ræk, 7)
        dnr = Cells(ræk, 4)
       
Rem Er gNr udfyldt og holdnr ikke checket
        If gnr <> "" And Cells(ræk, 4).Interior.ColorIndex = xlNone Then
            checkOk gnr, dnr, ræk
        End If
    Next ræk
   
    Application.ScreenUpdating = True
   
Rem Gennemløb afsluttet - hvis evt. fejl
    opbygMsgBox
   
End Sub
Private Sub checkOk(gnr, holdNr, aktuelleRække)
Dim aGnr, aDnr, aktuelleKol, fejlRæk, flag As Boolean
   
    flag = False
   
    If aktuelleRække < antalRæk Then
        For ræk = aktuelleRække + 1 To antalRæk
            aGnr = Cells(ræk, 7)
            aDnr = Cells(ræk, 4)
           
            If aGnr = gnr And Cells(ræk, 4).Interior.ColorIndex = xlNone Then
Rem Hvis ens Gnr - så check om Holdnr er ens
                If aDnr <> holdNr Then
Rem Beregn kolonne iflg. Holdnr
                    aktuelleKol = antalKol + holdNr
Rem Find ledige række i denne kolonne
                    For r = 2 To 65000
                        If Cells(r, aktuelleKol) = "" Then
                            fejlRæk = r
                            Exit For
                        End If
                    Next r
Rem gem række med uoverensstemmelse i kolonne for holdnr
                    If flag = False Then
Rem udgangsrækken markeres
                        Cells(fejlRæk, aktuelleKol) = aktuelleRække
                        fejlRæk = fejlRæk + 1
                        flag = True
                        Cells(aktuelleRække, 4).Interior.ColorIndex = 6
                    End If
                   
                    Cells(fejlRæk, aktuelleKol) = ræk
                    If Cells(1, aktuelleKol) = "" Then
                        Cells(1, aktuelleKol) = holdNr
                        Cells(1, aktuelleKol).Font.Bold = True
                    End If
                   
Rem marker HoldNr (dNnr-cellen) som testet
                    Cells(ræk, 4).Interior.ColorIndex = 6
                End If
            End If
        Next ræk
    End If
End Sub
Private Sub opbygMsgBox()
Dim mBox, kol, ræk, holdNr
    mBox = ""

Rem gennemgå kolonner med evt. fejlmarkeringer - pr. hold
    For kol = antalKol + 1 To antalKol + 49
        If Cells(1, kol) <> "" Then
            holdNr = Cells(1, kol)
            mBox = "Fejl - HoldNr.: " & CStr(holdNr) + vbCr
            For ræk = 2 To 65000
                If Cells(ræk, kol) = "" Then
                    Exit For
                Else
                    fejlrække = CStr(ræk) + " " + Cells(ræk, 1) + " " + CStr(Cells(ræk, 7)) + vbCr
                    mBox = mBox + fejlrække
                End If
            Next ræk
        End If
           
    Next kol
   
Rem vis MsgBox
    MsgBox (mBox)
   
Rem Slet anvendte kolonner t/fejlmarkeringer
    Range(Cells(1, antalKol + 1), Cells(65000, antalKol + 49)).Select
    Selection.Clear
   
    ActiveWorkbook.Save
End Sub
Avatar billede mrkr Juniormester
28. maj 2008 - 16:35 #11
a) Nu blev den noget langsom om at lave tjekket, desværre.
Det kan jeg god leve med, men som altid. Jo hurtigere jo bedre. :-)
Koden er meget svære end jeg forstår, men dit forslag nr. 1 var, næsten som den skulle være, hvis blot man kunne få message boksen med.

b) Den tekst den skrive i messageboksen er ikke helt korrekt. Den skrive altid den tekst der stå i celle a2+a3+osv alt efter hvor mange fejl der er.

Den skal helst skrive den tekst som står i de linier som har fejlen.
Avatar billede supertekst Ekspert
28. maj 2008 - 16:41 #12
Så er det en "ommer"... :-)
Avatar billede supertekst Ekspert
28. maj 2008 - 17:07 #13
Slet manuelt evt. fejlkolonnerne - hvis dette ikke er gjort.
Når jeg kører kan jeg umiddelbart ikke se at hastigheden er ændret.

Rem Version 3
Rem =========
Rem Ved uoverenstemmelser opbygges en kolonne til højre med Holdnr i første række
Rem og rækkenr neden under.
Rem Hold er anført i rækkefølge  - ej fejlmeldte holdnr er ikke anført - derfor
Rem tomme kolonner - fra venstre mod højre
Rem Koden indsættes i aktuelle ark

Const startRæk = 1                          'kan justeres
Dim antalRæk, antalKol
Public Sub TestAfNr()
Dim gnr, dnr

    Application.ScreenUpdating = False

Rem Find antal rækker
    antalRæk = ActiveCell.SpecialCells(xlLastCell).Row
    antalKol = ActiveCell.SpecialCells(xlLastCell).Column

Rem Slet tidligere farve-markeringer
    Columns("D").Select
    Selection.Cells.Interior.ColorIndex = xlNone

Rem Gennenløb af rækker indtil sidste række
    For ræk = startRæk To antalRæk
        gnr = Cells(ræk, 7)
        dnr = Cells(ræk, 4)
       
Rem Er gNr udfyldt og holdnr ikke checket
        If gnr <> "" And Cells(ræk, 4).Interior.ColorIndex = xlNone Then
            checkOk gnr, dnr, ræk
        End If
    Next ræk
   
   
Rem Gennemløb afsluttet - hvis evt. fejl
    opbygMsgBox
   
    Application.ScreenUpdating = True
End Sub
Private Sub checkOk(gnr, holdNr, aktuelleRække)
Dim aGnr, aDnr, aktuelleKol, fejlRæk, flag As Boolean
   
    flag = False
   
    If aktuelleRække < antalRæk Then
        For ræk = aktuelleRække + 1 To antalRæk
            aGnr = Cells(ræk, 7)
            aDnr = Cells(ræk, 4)
           
            If aGnr = gnr And Cells(ræk, 4).Interior.ColorIndex = xlNone Then
Rem Hvis ens Gnr - så check om Holdnr er ens
                If aDnr <> holdNr Then
Rem Beregn kolonne iflg. Holdnr
                    aktuelleKol = antalKol + holdNr
Rem Find ledige række i denne kolonne
                    For r = 2 To 65000
                        If Cells(r, aktuelleKol) = "" Then
                            fejlRæk = r
                            Exit For
                        End If
                    Next r
Rem gem række med uoverensstemmelse i kolonne for holdnr
                    If flag = False Then
Rem udgangsrækken markeres
                        Cells(fejlRæk, aktuelleKol) = aktuelleRække
                        fejlRæk = fejlRæk + 1
                        flag = True
                        Cells(aktuelleRække, 4).Interior.ColorIndex = 6
                    End If
                   
                    Cells(fejlRæk, aktuelleKol) = ræk
                    If Cells(1, aktuelleKol) = "" Then
                        Cells(1, aktuelleKol) = holdNr
                        Cells(1, aktuelleKol).Font.Bold = True
                    End If
                   
Rem marker HoldNr (dNnr-cellen) som testet
                    Cells(ræk, 4).Interior.ColorIndex = 6
                End If
            End If
        Next ræk
    End If
End Sub
Private Sub opbygMsgBox()
Dim mBox, kol, ræk, holdNr, fRækNr
    mBox = ""

Rem gennemgå kolonner med evt. fejlmarkeringer - pr. hold
    For kol = antalKol + 1 To antalKol + 49
        If Cells(1, kol) <> "" Then
            holdNr = Cells(1, kol)
            mBox = "Fejl - HoldNr.: " & CStr(holdNr) + vbCr
            For ræk = 2 To 65000
                If Cells(ræk, kol) = "" Then
                    Exit For
                Else
                    fRækNr = Cells(ræk, kol)
                    fejlrække = CStr(fRækNr) + ": " + Cells(fRækNr, 1) + " " + CStr(Cells(fRækNr, 7)) + vbCr
                    mBox = mBox + fejlrække
                End If
            Next ræk
        End If
    Next kol
   
Rem vis MsgBox
    MsgBox (mBox)
   
Rem Slet anvendte kolonner t/fejlmarkeringer
    Range(Cells(1, antalKol + 1), Cells(65000, antalKol + 49)).Select
    Selection.Clear
   
    ActiveWorkbook.Save
End Sub
Avatar billede mrkr Juniormester
28. maj 2008 - 19:43 #14
jep. Nu funker det, men der er dog en lille mærkelig fejl.
Hvis det er et numerisk tal der står i kolonne A og ikke en tekst, så går den ned. Det er ikke tit det sker, men én gang er jo nok.

Hastigheden var lidt sløv hos mig stadig, men da jeg ændrede den til "kun" at løbe 500 linier igennem, kører den perfekt.
Avatar billede supertekst Ekspert
28. maj 2008 - 23:26 #15
Slet evt. rækkerne, der ligger efter sidste synlige række.

Den opstående fejl rettes i den markerede -------> linie <------------
Det er når en streng-udtryk indeholder en numerisk værdi.

Private Sub opbygMsgBox()
Dim mBox, kol, ræk, holdNr, fRækNr
    mBox = ""

Rem gennemgå kolonner med evt. fejlmarkeringer - pr. hold
    For kol = antalKol + 1 To antalKol + 49
        If Cells(1, kol) <> "" Then
            holdNr = Cells(1, kol)
            mBox = "Fejl - HoldNr.: " & CStr(holdNr) + vbCr
            For ræk = 2 To 65000
                If Cells(ræk, kol) = "" Then
                    Exit For
                Else
                    fRækNr = Cells(ræk, kol)
    ----------> fejlrække = CStr(fRækNr) + ": " + CStr(Cells(fRækNr, 1)) + " " + CStr(Cells(fRækNr, 7)) + vbCr      '<---------------------------------------
Avatar billede mrkr Juniormester
29. maj 2008 - 20:01 #16
så virker den lige som den skal.
jeg takker mange gange for den store indsats.
Avatar billede supertekst Ekspert
29. maj 2008 - 23:45 #17
Det var godt - selv tak..
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