Avatar billede mim007 Nybegynder
26. oktober 2005 - 12:15 Der er 34 kommentarer og
1 løsning

rense adressedata

Hej
Jeg skal have renset en fil med navne og adresse oplysninger, som ligger vandret under hinanden over i en databasetruktur.
i dag står data eksempelvis sådan her:

Jens O. Vadstrup
Teknikker
Jens Ove Vadstrup
Statsborgerskab: Danmark
Vesterløkken 22
8305  Samsø
Født: 30.03.1955

Men nogen gange står stillingsbetegnelsen der ikke, så navn står der to gange, i andre tilfælde er der mellem vej og postnummeret en stedangivelse. Med andre ord adressefeltet kan være mellem 6 og 8 linier.
Jeg har brug for at lave en automatiseret formel, så i stedet for at have data ustruktureret i en kolonner laver følgende struktur:
navn, stilling, navn på stemmeseddel, vej, postnummer, statsborgerskab.
Avatar billede jkrons Professor
26. oktober 2005 - 12:22 #1
Eftersom der ikke er et bestemt system i tingene, tror jeg ikke at du kan automatisere processen. Hverken med en formel eller en makro. Ingen af delene kan jo skelne mellem om det, der står i en celle er et navn eller en stillingsbetegnelse.
Avatar billede mim007 Nybegynder
26. oktober 2005 - 12:27 #2
jeg tænkte om man kun lave en hvis-formel eller lignende (kan bare ikke selv overskue den :-))
Den skulle putte den celle, der hedder noget med "født:" i en bestemt celle.
Cellen over "født" er altid postnummeret, så den skal i en bestemt celle.
en anden formel  skal lede efter statsborgskab: og putte det i en celle og herefter skal en anden formel tage henholdsvis det, som ligger lige over og nedenunder og pitte i hver sin celle. Så har vi da næsten det hele.
Avatar billede jkrons Professor
26. oktober 2005 - 12:28 #3
Jeg forståpr hvad du mener. Jeg tror bare ikke at det er så nemt endda.
Avatar billede jkrons Professor
26. oktober 2005 - 12:30 #4
Husk, at en formel ikke "kan putte noget i en celle" - bortset fra den, hvor formlen selv står.
Avatar billede mim007 Nybegynder
26. oktober 2005 - 12:33 #5
klart, men det er også fint, men hvordan lyder en formel, der skal have indholdet i en celle, hvis det eksempelvis indeholder ordet født: - altså hvordan laver jeg en hvisformel med trunkering/wildcard. Når jeg laver =hvis(a2="født*";a2;""), så sker der ingenting
Avatar billede jkrons Professor
26. oktober 2005 - 12:35 #6
Hvias du har tålmodighed et øjeblik, så skal jeg forsøge mig med en løsning :-)
Avatar billede mim007 Nybegynder
26. oktober 2005 - 12:48 #7
klart. Glæder mig
Avatar billede jkrons Professor
26. oktober 2005 - 13:15 #8
Det tog sin tid, men her er en serie formler, der burde kunne løse dine problemer:

Jeg antager at dine data står i A-kolonnen. Du vil gerne have dit resultat til at stå i B, C, D osv.

Indsæt følgende formler i relevante celler:

B1: =A1
C1: =HVIS(VENSTRE(A2;4)<>VENSTRE(A1;4);A2;"")
D1: =HVIS(C1="";A2;A3)
E1: =HVIS(C1="";A3;A4)
F1: =HVIS(VENSTRE(A3;15)="Statsborgerskab";A4;A5)
G1: =HVIS(VENSTRE(A7;4)="Født";A6;HVIS(A7="";A5;HVIS(VENSTRE(A8;4)="Født";A7)))
H1: =HVIS(VENSTRE(A7;4)="Født";A7;HVIS(VENSTRE(A8;4)="født";A8;A6))

Løsningen er baseret på den forudsætning at ingen titler har de samme første fire bostaver fælles med de første fire bogstaver af navnet. Hvis det ER tilfældet skal du rette antallet af testbogstaver i formeln i C1, fx =HVIS(VENSTRE(A2;8)<>VENSTRE(A1;8);A2;""), hvis du vil teste på otte bogstaver. Hvis nogen kan hedde præcis det samme som deres stilling, så altså A1 og A2 er helt ens, også selv om der står en stilling i A2 bryder logikken sammen. Ellers skulle det virke.

Nu opstår det så det problem, at du ikke umiddlebart kan kopiere formlen nedad. Kopierer du den til B2 osv, vil den stadig teste på de data, der står ovenfor. Derfor skal formlen altid kopieres til den første række med data i næste gruppe. Altså den den række hvor navnet i næste gruppe står.
Avatar billede mim007 Nybegynder
26. oktober 2005 - 13:29 #9
mange tak
Avatar billede mim007 Nybegynder
26. oktober 2005 - 13:30 #10
hvordan kommer jeg til at give dig point.
Avatar billede jkrons Professor
26. oktober 2005 - 13:30 #11
Velbekomme. Håber du får det til at virke.
Avatar billede jkrons Professor
26. oktober 2005 - 13:31 #12
Accepter bare mit svar :-9
Avatar billede mim007 Nybegynder
26. oktober 2005 - 13:35 #13
hej igen. har du et smart forslag til, hvordan man kan kopiere den ned over 12000 navne og adresser, så en kopiere ned til den første rækker med data. Jeg kan jo ikke bare kopiere formlen og eks. 7 tomme rækker, når der er forskel på, hvor mange rækker hvert felt har - 6-8.
Avatar billede jkrons Professor
26. oktober 2005 - 13:38 #14
Nej, derfor kan du ikke umiddelbart bruge fyldhåndtaget. Eller retter det kan du, men så skal du bare bagefter slette en grusom masse rækker. Så den eneste løsning er, som jeg skrev ovenfor at kopiere formlen, og så indsætte den ud for første række i hver gruppe.
Avatar billede mim007 Nybegynder
26. oktober 2005 - 13:39 #15
tak
Avatar billede mim007 Nybegynder
26. oktober 2005 - 13:51 #16
hej igen
kom i tanker om følgende. kan man lave en makro, der går x-antal linier ned hver gang, der kommer en linie med teksten "født", så sletter den alt det ovenstående
Avatar billede jkrons Professor
26. oktober 2005 - 13:52 #17
Det kan man godt, men jeg har ikke tid til at se på det lige n.u sorry.
Avatar billede mim007 Nybegynder
26. oktober 2005 - 13:57 #18
har du evt. senere?
Avatar billede oyejo Nybegynder
26. oktober 2005 - 15:22 #19
dette må da være "macromat" :-)
Er det slik at alle opplysninger om en personen
avsluttes med : Født: dd.mm.yyyy ?
Avatar billede oyejo Nybegynder
27. oktober 2005 - 07:42 #20
Option Explicit
Option Base 1

'*** VIKTIG! OVERSKRIFER OG ANNEN TEKST SOM IKKE ER DATA, MÅ FJERNES FØRST.

Public Sub RensAdrData()
  Dim n As Long, i As Long, r As Long
  Dim counter As Long
  Dim c As Range
  Dim vdB() As Variant
  Dim lFirstRow As Long
  Dim vRowColOffst() As Variant
   
  Application.ScreenUpdating = False
 
  '** SETTER INN EN MIDLERTIDIG RAD ØVERST, TIL HEJLP FOR 1. POST
  Rows(1).Insert
  Cells(1, 1).Value = "Født:"
 
  '** SLETTER EVENTUELLE TOMME RADER
  r = Cells(Rows.Count, 1).End(xlUp).Row
  For n = r To 1 Step -1
    If IsEmpty(Cells(n, 1)) Then
      Cells(n, 1).EntireRow.Delete
    End If
  Next
   
  '** SETTER INN TOMME RADER FOR DATA SOM EVENTUELT MANGLER
  '** TESTER KUN PÅ STILLING OG STED
  '** SETTER INN 2 TOMME RADER ETTER HVER POST
  counter = -1 ' teller opp antall "Født:", må trekke for den i 1.rad
  r = Cells(Rows.Count, 1).End(xlUp).Row
  For n = r To 1 Step -1
    With Cells(n, 1)
      Trim (.Text)
      If Left(.Text, 5) = "Født:" Then
        counter = counter + 1
        If Left(.Offset(3).Text, 15) = "Statsborgerskab" Then
          Rows(.Offset(2).Row).Insert
        End If
        If Left(.Offset(7).Text, 5) = "Født:" Then
          Rows(.Offset(6).Row).Insert
        End If
        Rows(.Offset(1).Row & ":" & .Offset(2).Row).Insert
      End If
    End With
  Next
 
  '** SLETTER RADER SOM BLE SATT INN ØVERST
  '** ETTER DETTE BESTÅR HVER POST AV 10 RADER
  '** NY POST STARTER I RAD 1, 11, 21, 31 ....
  Range(Cells(1, 1), Cells(3, 1)).EntireRow.Delete
 
  '** FOR RADER MED STATSBORGERSKAP OG POSTNUMMMER
  '** TREKKER DATA UT FRA STRENG OG KOPIERER TIL KOLLONNE 3
  r = Cells(Rows.Count, 1).End(xlUp).Row
  For Each c In Range(Cells(1, 1), Cells(r, 1))
  If Left(c.Text, 15) = "Statsborgerskab" Then
    c.Offset(, 2).Value = Right(c.Text, Len(c.Text) - 17) 'NB! prøv16
    c.Offset(3, 2).Value = Left(c.Offset(3).Text, 4)
  End If
  Next
   
  '** FØRSTE POST STARTER PÅ RAD 1, NESTE POST PÅ RAD 11 , 21 OSV.
  lFirstRow = 1 'denne øker med 10 for hver post
 
  '** VISER I HVILKE CELLER DATA LIGGER I FORHOLD TIL lFirstRow
  '** NB! ØNSKES MERE DATA, ANGI HER HVOR DISSE DATA LIGGER
  vRowColOffst() = Array( _
            Array(0, 1, 2, 4, 6, 3), Array(0, 0, 0, 0, 2, 2))
 
  '** DIMMENSJONERER ARRAYET SOM DATA BLIR LAGT TIL
  ReDim vdB(counter, UBound(vRowColOffst(1), 1))
 
  '** DA ER DET BARE Å FYLLE ARRAYET MED DATA
  For n = 1 To counter
    For i = 1 To UBound(vRowColOffst(1), 1)
      vdB(n, i) = Cells(lFirstRow, 1).Offset( _
      vRowColOffst(1)(i), vRowColOffst(2)(i))
    Next
    lFirstRow = lFirstRow + 10 'neste post 10 rader ned
  Next
 
  '** SLETTER DE DATA SOM BLE KOPIERT TIL KOLLONNE 3
  Columns(3).ClearContents
 
  '** LEGGER TIL ET NYTT WORKSEET, SOM BLIR FYLT MED DATA
  '** FØRSTE CELLE SOM BLIR FYLT ER .Cells(RAD, KOLLONNE); HER Cells(2, 1)
  With ThisWorkbook.Worksheets.Add
    .Cells(2, 1).Resize(counter, UBound(vRowColOffst(1), 1)) = vdB
  End With
 
End Sub
Avatar billede mim007 Nybegynder
27. oktober 2005 - 09:21 #21
mange tak for det gode svar. Kan jeg bare kopiere det ind i en makro og slette dine tekster?
Avatar billede oyejo Nybegynder
27. oktober 2005 - 09:26 #22
ja du limer alt inn i en makro
du trenger ikke slette noe
Avatar billede oyejo Nybegynder
27. oktober 2005 - 09:26 #23
tekstene er merket ut som tekst i koden
Avatar billede mim007 Nybegynder
27. oktober 2005 - 09:32 #24
hvor i regnearket skal jeg stå, når jeg kører makroen og skal jeg bruge nogle af formlerne som jkrons har givet mig
Avatar billede oyejo Nybegynder
27. oktober 2005 - 09:35 #25
Du kan stå hvor som helst, men du må stå i arket med data
Husk det må kun være data i arket ingen overskrifter
Du trenger ingen formler
Avatar billede mim007 Nybegynder
27. oktober 2005 - 09:38 #26
tusind tak. Jeg prøver
Avatar billede mim007 Nybegynder
27. oktober 2005 - 09:40 #27
dumt spørgsmål, men hvor paster jeg din kode ind?
Avatar billede oyejo Nybegynder
27. oktober 2005 - 09:44 #28
ingen spørsmål er dumme :-) alle må begynne et sted
det letteste er å første lage en ny makro
Meny : Verktøy -makroer registrer ny makro
utfør så en enkel handlig som er merket en celle
stopp opptakeren (firkant)
igjen : Verktøy -makroer  makro
velg så rediger makro, du kommer til et vindu, ta bort absolutt all tekst i vinduet
lim så inn all tekst fra min kommentar
Avatar billede mim007 Nybegynder
27. oktober 2005 - 09:54 #29
hej
når jeg vil køre makroen siger den at linien "Option Explicit" er ivalid inside procedure
Avatar billede mim007 Nybegynder
27. oktober 2005 - 09:55 #30
Sub Makro1()
'
' Makro1 Makro
' Makro indspillet 27-10-2005 af Michael Holm
'
' Genvejstast:Ctrl+m
'
    Range("B2").Select
    Option Explicit
Option Base 1

'*** VIKTIG! OVERSKRIFER OG ANNEN TEKST SOM IKKE ER DATA, MÅ FJERNES FØRST.

Public Sub RensAdrData()
  Dim n As Long, i As Long, r As Long
  Dim counter As Long
  Dim c As Range
  Dim vdB() As Variant
  Dim lFirstRow As Long
  Dim vRowColOffst() As Variant
   
  Application.ScreenUpdating = False
 
  '** SETTER INN EN MIDLERTIDIG RAD ØVERST, TIL HEJLP FOR 1. POST
  Rows(1).Insert
  Cells(1, 1).Value = "Født:"
 
  '** SLETTER EVENTUELLE TOMME RADER
  r = Cells(Rows.Count, 1).End(xlUp).Row
  For n = r To 1 Step -1
    If IsEmpty(Cells(n, 1)) Then
      Cells(n, 1).EntireRow.Delete
    End If
  Next
   
  '** SETTER INN TOMME RADER FOR DATA SOM EVENTUELT MANGLER
  '** TESTER KUN PÅ STILLING OG STED
  '** SETTER INN 2 TOMME RADER ETTER HVER POST
  counter = -1 ' teller opp antall "Født:", må trekke for den i 1.rad
  r = Cells(Rows.Count, 1).End(xlUp).Row
  For n = r To 1 Step -1
    With Cells(n, 1)
      Trim (.Text)
      If Left(.Text, 5) = "Født:" Then
        counter = counter + 1
        If Left(.Offset(3).Text, 15) = "Statsborgerskab" Then
          Rows(.Offset(2).Row).Insert
        End If
        If Left(.Offset(7).Text, 5) = "Født:" Then
          Rows(.Offset(6).Row).Insert
        End If
        Rows(.Offset(1).Row & ":" & .Offset(2).Row).Insert
      End If
    End With
  Next
 
  '** SLETTER RADER SOM BLE SATT INN ØVERST
  '** ETTER DETTE BESTÅR HVER POST AV 10 RADER
  '** NY POST STARTER I RAD 1, 11, 21, 31 ....
  Range(Cells(1, 1), Cells(3, 1)).EntireRow.Delete
 
  '** FOR RADER MED STATSBORGERSKAP OG POSTNUMMMER
  '** TREKKER DATA UT FRA STRENG OG KOPIERER TIL KOLLONNE 3
  r = Cells(Rows.Count, 1).End(xlUp).Row
  For Each c In Range(Cells(1, 1), Cells(r, 1))
  If Left(c.Text, 15) = "Statsborgerskab" Then
    c.Offset(, 2).Value = Right(c.Text, Len(c.Text) - 17) 'NB! prøv16
    c.Offset(3, 2).Value = Left(c.Offset(3).Text, 4)
  End If
  Next
   
  '** FØRSTE POST STARTER PÅ RAD 1, NESTE POST PÅ RAD 11 , 21 OSV.
  lFirstRow = 1 'denne øker med 10 for hver post
 
  '** VISER I HVILKE CELLER DATA LIGGER I FORHOLD TIL lFirstRow
  '** NB! ØNSKES MERE DATA, ANGI HER HVOR DISSE DATA LIGGER
  vRowColOffst() = Array( _
            Array(0, 1, 2, 4, 6, 3), Array(0, 0, 0, 0, 2, 2))
 
  '** DIMMENSJONERER ARRAYET SOM DATA BLIR LAGT TIL
  ReDim vdB(counter, UBound(vRowColOffst(1), 1))
 
  '** DA ER DET BARE Å FYLLE ARRAYET MED DATA
  For n = 1 To counter
    For i = 1 To UBound(vRowColOffst(1), 1)
      vdB(n, i) = Cells(lFirstRow, 1).Offset( _
      vRowColOffst(1)(i), vRowColOffst(2)(i))
    Next
    lFirstRow = lFirstRow + 10 'neste post 10 rader ned
  Next
 
  '** SLETTER DE DATA SOM BLE KOPIERT TIL KOLLONNE 3
  Columns(3).ClearContents
 
  '** LEGGER TIL ET NYTT WORKSEET, SOM BLIR FYLT MED DATA
  '** FØRSTE CELLE SOM BLIR FYLT ER .Cells(RAD, KOLLONNE); HER Cells(2, 1)
  With ThisWorkbook.Worksheets.Add
    .Cells(2, 1).Resize(counter, UBound(vRowColOffst(1), 1)) = vdB
  End With
 
End Sub
Avatar billede oyejo Nybegynder
27. oktober 2005 - 09:57 #31
du må fjerne restene fra din makro inklusive navnet

dette må bort
Sub Makro1()
'
' Makro1 Makro
' Makro indspillet 27-10-2005 af Michael Holm
'
' Genvejstast:Ctrl+m
'
    Range("B2").Select
Avatar billede oyejo Nybegynder
27. oktober 2005 - 09:58 #32
din nye makro heter nå: Public Sub RensAdrData()
Avatar billede mim007 Nybegynder
27. oktober 2005 - 10:00 #33
tak. du fortjener point, men jeg gav dem ud i går
Avatar billede oyejo Nybegynder
27. oktober 2005 - 10:02 #34
pointene spiller ingen rolle ( du har ikke lov til å gi flere )
Jeg hadde en fin kveld foran pc-en i går kveld
med makrokode og en lille cognac :-)
(skjønner ikke de som spiller sudoku, når man kan gjøre dette )
Avatar billede oyejo Nybegynder
27. oktober 2005 - 10:03 #35
...men FUNGERTE DET SLIK DU ØNSKET ?
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
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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