Avatar billede rotroc Nybegynder
03. april 2007 - 11:41 Der er 12 kommentarer og
1 løsning

Kan VBA finde standardord i celler samt slette ikke standard.

Hej Eksperter.

Jeg vil lave et Pivot diagram hvor jeg kan vise salgs statistik.
Min pivot tabel skal på sigt danne grundlag for grafer – altså antal solgte vare per tidsenhed – pr sælger – mest solgte varetype osv

Jeg får kildedata via en liste fra vores økonomisystem. Listen er opstillet i kolonneform med tilbudsnummer, kunde, pris, varebetegnelse osv. Listen vil altid være opstillet ens mht kolonne antal og benævnelser.

Mit problem er ganske enkelt at den enkelte varebetegnelse ikke er anført som et enkelt nummer men som en betegnelse som f.eks BR3 eller J400 eller SR1 og at der i samme celle ofte forekommer andre tal og ord. En varebetegnelse i en celle kunne typisk være:
"BR3 jf. (TT65.684)", hvor BR3 er varetypen og tallet i parentes et variabel tegningsnummer vi bruger som reference overfor kunden. Der forkommer tilfælde hvor varetypen helt er omgivet af andre tal evt ord, dog er varetypen altid omgivet af mellemrum.

Spørgsmålet er om jeg f.eks via VBA, kan identificere hvilket produkt som findes i tekststrengen. Jeg skal, gerne automatisk, have fundet varetypen, dvs f.eks BR3 i  tekststrengen og have slettet alle andre ord og tal i cellen inden mine data er klar til Pivot tabellen. Jeg har vel omkring 30 forsk. standardvaretyper med forskellige navne som ovenstående.

Kan Excel evt via VBA identificere disse forekomster og slette alt andet end typenummeret således jeg ikke hver gang skal gøre dette manuelt ?

Kan Excel gøre det selvom varetype betegnelsen er inde i en sætning altså der er andre ord eller tal før og efter varebetegnelsen ?

Vil Excel skelne mellem store og små bogstaver i en angivet varebetegnelse såfremt en sælger fejlagtig har skrevet med småt ?
Avatar billede supertekst Ekspert
03. april 2007 - 11:48 #1
Ja - hvis man har en liste over de ca. 30 standardvaretyper - så kan disse identificeres og det overflødige slettes.
Avatar billede supertekst Ekspert
03. april 2007 - 12:18 #2
Varebetegnelse            Efter
    BR3 jf. (TT65.684)    BR3
    1234 J400 1234            J400
    BBB SR1 AAA            SR1
    br3 123                    BR3
    4711 j400            J400
    ABC sr1 xyz            SR1

Via følgende kode: (Ark1 / VBA (Alt+F11)

Dim idTabel As Variant, antalID
Sub redigerVareID()
Dim antalRæk, vID As String, rID As String
    idTabel = Array("BR3", "J400", "SR1")      'tilpasses
    antalID = 3    'antal elementer i Array    tilpasses
   
    antalRæk = ActiveCell.SpecialCells(xlLastCell).Row
    For r = 2 To antalRæk
        vID = Cells(r, 4)
        rID = isolerID(vID)
        If rID <> "" Then
            Cells(r, 5) = rID
        Else
            MsgBox (vID + " kunne ej isolered")
        End If
    Next r
   
End Sub
Private Function isolerID(id)
Dim xId
    xId = UCase(id)
   
    For f = 0 To antalID - 1
        If InStr(xId, idTabel(f)) > 0 Then
            isolerID = idTabel(f)
            Exit Function
        End If
    Next f
    isolerID = ""
End Function
Avatar billede rotroc Nybegynder
03. april 2007 - 21:26 #3
Hej Supertekst.

Jeg har kopieret koden til Ark1 i VBA editoren. For at teste funktionen slettede jeg alle kolonner i Ark1 pånær kolonnen ”Betegnelse” hvori alle varebetegnelser fremstår.

Samtidigt har jeg slettet alle celler med varebetegnelser der afviger fra de tre jeg vil teste på, nemlig: LR4, Q030 og N35 hvilket også er de tre typer jeg har indskrevet i din VBA kode dvs i Array  parenteserne.

Hvis jeg kører koderne kommer MsgBox melding “kunne ej isoleres” op hele tiden. Der sker dog ikke noget med data der står i cellerne.
Det er som om at koden stopper ved End If i nedenstående udklip.

For r = 2 To antalRæk
        vID = Cells(r, 4)
        rID = isolerID(vID)
        If rID <> "" Then
            Cells(r, 5) = rID
        Else
            MsgBox (vID + " kunne ej isoleres")
        End If
    Next r
   
End Sub
´
Gør jeg noget forkert eller mangler jeg at gore noget ?
Avatar billede supertekst Ekspert
03. april 2007 - 22:49 #4
Bemærk følgende - idet jeg tror at sletning af kolonner har rykket forudsætningerne:

For r = 2 To antalRæk
        vID = Cells(r, 4)          '<<<-VareID hentesfra kolonne 4 = D
        rID = isolerID(vID)
        If rID <> "" Then
            Cells(r, 5) = rID      '<<<-Redigeret ID indsættes i kolonne 5 = E
        Else
            MsgBox (vID + " kunne ej isoleres")
        End If
    Next r
   
End Sub
Avatar billede rotroc Nybegynder
09. april 2007 - 09:24 #5
Perfekt - jeg har oprettet en CommandButton der kører makroen som den skal.
Meldingen "kunne ej isoleres" kommer også frem når der i en celle står et ukendt partnummer. Her kunne det være helt i top hvis der i denne MsgBox istedet stod:  "Kunne ej isoleres. Slet værdi ?" Ved tryk på "JA" vi hele den specifikke række i regnearket hvor cellen fremstår i simpelthen blive slettet. Ved tryk på "NEJ" kører makroen videre. Dette vil gøre at der i mit regneark til slut kun er kendte varenumre da
makroen både sortere al unødig tekst fra -  samtidigt med at ukendte varenumre bliver slettet i forbindelse med eksekveringen af makroen. Er dette muligt at programmere ?
Avatar billede supertekst Ekspert
09. april 2007 - 13:38 #6
Ja - vender tilbage...
Avatar billede supertekst Ekspert
09. april 2007 - 14:00 #7
Version 2:

Dim idTabel As Variant, antalID
Sub redigerVareID()
Dim antalRæk, vID As String, rID As String, svar
    idTabel = Array("BR3", "J400", "SR1")      'tilpasses
    antalID = 3    'antal elementer i Array    tilpasses
   
    antalRæk = ActiveCell.SpecialCells(xlLastCell).Row
    For r = 2 To antalRæk
        vID = Cells(r, 4)
        rID = isolerID(vID)
        If rID <> "" Then
            Cells(r, 5) = rID
        Else
Rem Spørg ikke på evt. "blanke"
            If vID <> "" Then
                svar = MsgBox(vID + " kunne ej isoleres. Slet værdi?", vbYesNo)
                If svar = 6 Then
                    Rows(CStr(r)).Select
                    Selection.Delete Shift:=xlUp
                    Cells(r, 1).Select
                End If
            End If
        End If
    Next r
   
End Sub
Private Function isolerID(id)
Dim xId
    xId = UCase(id)
   
    For f = 0 To antalID - 1
        If InStr(xId, idTabel(f)) > 0 Then
            isolerID = idTabel(f)
            Exit Function
        End If
    Next f
    isolerID = ""
End Function
Avatar billede rotroc Nybegynder
09. april 2007 - 15:26 #8
Hmm - jeg har 53 rækker i Arket. 7 rækker indeholder varetyper som ikke er oprettet i idTabel Array og som derfor burde blive slettet. Koden finder kun 4 af de 7 rækker som den dog sletter som den skal. De resterende 3 rækker står tilbage. Mystisk.
Jeg tror at det bliver meget kompliceret at få denne nød knækket og må acceptere at jeg alligevel manuelt skal slette nogle rækker. Stadigvæk er det en stor hjælp jeg har fået idet jobbet er lettet betydeligt med kun få rækker der kræver opmærksomhed.
Point til dig Supertekst - smider du et svar?
Avatar billede supertekst Ekspert
09. april 2007 - 15:34 #9
Obs: Du skal huske at justere antallet:
    antalID = 3    'antal elementer i Array    tilpasses

kunne det være det der giver problemer?

Jeg tror nu antallet af elementer i array'et kan genereres - hvis jeg finder det- vender jeg tilbage...
Avatar billede supertekst Ekspert
09. april 2007 - 15:50 #10
Hvis du korrigere denne linie:
  antalID = 3    'antal elementer i Array    tilpasses

til følgende:
    antalID = UBound(idTabel)  'antal elementer i Array (1. element= 0)
Avatar billede supertekst Ekspert
09. april 2007 - 17:06 #11
Yderligere tilføjelse - efter at der nu kan slettes rækker:

            If vID <> "" Then
                svar = MsgBox(vID + " kunne ej isoleres. Slet værdi?", vbYesNo)
                If svar = 6 Then
                    Rows(CStr(r)).Select
                    Selection.Delete Shift:=xlUp
                    r = r - 1  '<------------------ tilføj denne linie     
                    Cells(r, 1).Select
                End If
            End If
Avatar billede rotroc Nybegynder
09. april 2007 - 20:17 #12
Yes, det var lige præcis denne linie r = r-1, der gjorde forskellen.
Godt gået supertekst. Hvor/hvordan lærer man at programmere som dig?
Avatar billede supertekst Ekspert
09. april 2007 - 23:53 #13
Fint - det kom jeg i tanke om til eftermiddagsteen..
Tak for det - til det sidste: træning...
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