15. juli 2011 - 10:34Der er
26 kommentarer og 1 løsning
Ændre / Slet data via Userform
Hej.... Jeg har en Userform, som laver et opslagt på nogle værdier som jeg har i et ark. Jeg vil høre om der er mulighed for, at man kan ændre de værdier som bliver opslået eller slette dem. Det er nok lidt nemmer at forklare det vha. et eksempel.
Kode op opslagsfunktionen:
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Dim counter As Integer Dim curcell As Range
Application.ScreenUpdating = False
For counter = 2 To Sheets("Køb").Range("A65536").End(xlUp).row Set curcell = Worksheets("Køb").Cells(counter, 1) If curcell.Text = UserForm4.TextBox1.Text Then UserForm4.TextBox26.Text = curcell.Offset(0, 1) UserForm4.TextBox2.Text = Format(curcell.Offset(0, 2), "dd. mmmm yyyy") UserForm4.TextBox3.Text = Format(curcell.Offset(0, 3), " #,##0.00") UserForm4.TextBox4.Text = Format(curcell.Offset(0, 4), " #,##0.00") UserForm4.TextBox5.Text = Format(curcell.Offset(0, 5), " #,##0.00") UserForm4.TextBox6.Text = Format(curcell.Offset(0, 6), " #,##0.00") UserForm4.TextBox25.Text = curcell.Offset(0, 0) Exit Sub End If Next Application.ScreenUpdating = True End Sub
Eksempel: Opslagsværdi er et bilagsnr. Opslagsværdien tastet ind i TextBox1, og befinder sig i arket "Køb" / Kolonne A.
På baggrund af opslagsværdien, bliver følgende vist i Userformen: - Dato (TextBox2 / Kolonne C) - Beholdning (TextBox3 / Kolonne D) - Værdi (TextBox4 / Kolonne E) - Omkostninger (TextBox6 / Kolonne F) - Renter (TextBox 7 / Kolonne G) - Bilagsnr. (TextBox 25 / Kolonne A) - Navn (TextBox26 / Kolonne B)
F.eks. hvis jeg laver et opslag på bilagsnr. 2001, bliver følgende vist: - Dato: 1. juni 2011 - Beholdning: 60.000 - Værdi: 100.000 - Omkostninger: 10.000 - Renter: 1.000 - Bilagsnr. 2001 - Navn: Nordea
Nu kunne jeg godt tænke mig, at man havde mulighed for at ændre i ovenstående værdier, som efterfølgende vil blive gemt/overskrevet i arket "Køb". Når man ændre værdierne, må tal værdierne gene vises "0,00" og dato "dd. mmmm åååå".
Det kunne også være super, hvis man havde mulighed for at slette ovenstående værdier i arket "Køb".
Med hensyn til at ændre værdier på dit Ark "Køb" via rettelser i dine textBoxe på din userform ... så prøv følgende:
1. I din Userforms properties, skal værdien "ShowModal" være FALSE for, at du kan få lov til at redigere i dit underliggende ark mens userformen er åben.
2. Flyt deklarationen Dim curcell As Range fra din textbox1 procedure ... ud i Userformens [b] generelle sektion [/b) - (øverst i kodevinduet) ... hvilket gør at andre procedurer også kan se/tilgå den aktuelle celle "curcell".
3. Under hver af dine textboxe, hvori du ønsker at kunne ændre værdier, kan du bruge nedenstående koder under textboxens Exit hændelse.
Eksempler ... forsæt selv rækken af textboxe.
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean) curcell.Offset(0, 1).Value = UserForm1.TextBox2.Value End Sub
Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean) curcell.Offset(0, 2).Value = UserForm1.TextBox3.Value End Sub
--------
Kan du bruge det ??
Jeg kigger lige på det med at slettet hele rækker ? Og så er der det med værdi formaterne, som jeg ikke helt forstår ...
Omkring det med formaterne ... er det så noget i retningen af nedenstående kode fra tidligere, blot tilrettet med Format funktionen.
Hermed burde Userformens texkboxe sende den formaterede værdi til cellerne i Køb arket. Koden holder bare ikke for om brugeren har tastet noget volapyk ind i textboxen ??
Det ideelle vil være, hvis de enkelte textboxe kunne tilbyde brugerne den ønskede formatering, så snart textboxene blev aktiveret ... men jeg har ikke kunnet finde en måde til dette ???
---------- Kode med format funktionen ...
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Kommentar til #2: Det virker som det skal. Er det dog muligt at tilføje en knap, som indholde koden, således at når brugeren først trykker på knappen, at ændringen bliver overført til arket fremfor det sker ligeså snart at man har ændret værdien i TextBox'en?
Det kunne være super, at vis ovenstående var muligt, at man også kunne tilføje en MsgBox, som kommer og fortæller brugeren, at ændringen er gennemført.
Lige nu kommer der også en fejl, når man direkte "hopper" ned i en af de tomme TextBox, inden man har søgt efter en værdi!
Mht. formatering menten jeg, at hvis man skulle ændre en talværdi f.eks. fra 1.000 til 2.000, så skulle teksteboksen vise 2.000,00 frem for 2000. Jeg har dog selv løst dette problem ved at indsætte følgende kode (markeret med fed):
Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean) curcell.Offset(0, 3).Value = UserForm4.TextBox3.Value TextBox3.Value = Format(CDbl(TextBox3.Value), " #,##0.00") End Sub
Kommentar til #3: Det virker super. Jeg har forsøgt at lave en MsgBox som advarer brugeren i at, man er ved at slette indholdet. Jeg får dog en fejl, måske du lige kunne hjælpe mig:
Private Sub CommandButton3_Click()
ans = MsgBox("Du er ved at slette købet. Bemærk at handlingen ikke kan fortrydes efterfølgende!" & vbCr & " " & vbCr & _ "Ønsker du at slette købet?", 32 + vbYesNoCancel, "Slet køb") If ans = vbYes Then
Vender stadig tilbage i aften med din knap. Men med hensyn til kommunikation med brugerne, så prøv at udskifte din msgbox med en inputbox ... Som jeg lige husker det ?
'..... forsæt selv nedad med dine textboxe, ark celler og formateringer ...
End If
MsgBox "Du har nu fortaget ændringer i bilagsnummer: " & curcell.Text, vbInformation
End Sub
Fejlen når der hoppes til en tom textbox: Fejlen der kommer, når man hopper ud af en tom textbox, skyldes, at den objektvariabel (curcell), som indeholder bilagsnummeret og som samtidig er reference i forhold til at levere data til textboxene, IKKE er erklæret, da der ikke er søgt på et bilagsnummer!
Fejlen kommer du udover, hvis du benytter ovenstående knap + sletter textboxenes EXIT hændelser (som indtil nu har sørget for at ændringerne sker i regnearket) ... Håber det gi´r mening ?? ... ellers spø´r :o)
Evt. forbedringsforslag Uden at vide, hvordan din applikation er skruet sammen, så har jeg måske en idé som du kan bruge.
Som det er nu, hvor brugeren kan søge efter et bilagsnummer og taste ENTER, styres selve søgningen ikke specielt, da der i princippet kan søges via fritekst = alle tegn, tal og bogstaver! Dertil kan det faktisk lade sig gøre ... efter søgningen er udført og de korrekte data fundet ... at slette bilagsnummeret i textboxen og taste på GEM ÆNDRINGER knappen, hvorved intet bliver ændret!
En måde at styre brugerinput på, kunne være at tilføje en liste på Userformen, hvori de enkelte bilagsnumre var til rådighed ... og kun dem = ingen mulighed for at skrive noget fritekst fikomdik ind :o)
Listen kan sættes om til at søge på 1. tal i bilagsnummeret eller på det eksakte bilagsnummer, så snart brugeren klikker i listen og begynder at skrive/søge. .... Når der rette bilagsnummer er fundet kan man tabulere ud af listen, hvorefter textboxene på userformen bliver fyldt med de tilhørende data.
Denne løsning sikrer bilagsnummer + minimerer eventuelle fejlmuligheder.
Kommentarer til #8: Så lykkedes det at tilføje en knap, således at ændringen først træder i kraft, når brugeren har trykket på knappen.
Det giver god meningen mht. fejlen.
Med hensyn til dit forbedringsforslag lyder det meget smart, men det ligger nok over hvad jeg kan finde ud af.
Vil da gerne oprette en opgave, så du kan få nogle yderligere point for dette, hvis du har mod på at hjælpe?
Kommentarer til #4: Var nok lidt for hurtig da jeg skrev at koden virkede.
Når man foretager ændringer, så bliver talværdierne formateret til tekst i arket "køb", således så det ikke er muligt at laven en sum (foregår over i et andet ark).
Hej Jacob Jeg kigger på det med formaterne i aften, når ungerne er gået kolde :0) Det du gerne vil, er det, at uanset hvad, så vil du ha' dine data ens både i ark og userform ?
Med hensyn til oprettelse af en liste, så laver jeg lige en test.
Prøv at gange de textbox værdier med 1, som du sender til arket Køb ?
Følgende kode fungerer hos mig ... Userformens TextBox3 værdi ganges med 1 og sendes til regnearket ... hvor arkets/cellens formatering klarer format og højrestilling. Oveni hatten modtager cellen værdien, som en værdi fremfor en tekststreng.
Kommentarer til #11: Nu fungerer det. Det er super :-)
Kommentarer til #12: Det er svært at sige. Pt. er der 50 bilag som står anført i kolonne A2:A51, anført i arket "Køb". Der kan dog godt kommme mange flere bilag til. Derfor skal liste meget gerne være dynamist, således så de kan udvides automatisk.
Listen Opret en listbox på din userform og døb den noget sigende. Min hedder: lstBilagsNr
kopier følgende markerede kode ind i Listboxens Change hændelse.
---------------
Private Sub lstBilagsNr_Change() Dim counter As Integer 'tælle variabel til cellerne i kolonne A på arket Køb
'for hver celle i kolonne A på arket Køb 'start i celle A2 For counter = 2 To Sheets("Køb").Range("A65536").End(xlUp).Row
'set curcell = den næste celle i kolonnen Set curcell = Worksheets("Køb").Cells(counter, 1)
'hvis den aktuelle celleværdi = værdien i testbox1 på userformen If curcell.Text = UserForm1.lstBilagsNr.Value Then
'sæt textbox1 = værdien i den aktuelle celle (bilagsnummer) UserForm1.TextBox1.Value = curcell.Text
'sæt textbox2 = værdien i cellen 1 til højre for den aktive celle 'formater værdien således: "dd. mmmm yyyy" UserForm1.TextBox2.Text = Format(curcell.Offset(0, 1), "dd. mmmm yyyy")
'sæt textbox3 = værdien i cellen 2 til højre for den aktive celle UserForm1.TextBox3.Text = Format(CDbl(curcell.Offset(0, 2)), " #,##0.00")
'..... fortsæt selv med dine resterende textboxe ....
'forlad proceduren Exit Sub
End If
'næste celle i kolonne A på arket Køb Next
End Sub
------------ Koden fylder userformens textboxe med de værdier fra arket Køb, som hører sammen med det, på listen, valgte bilagsnummer.
Textboxen med bilagsnumre Lås din textbox med bilagsnumre, så brugerne IKKE kan redigere i dem. I textboxens properties sættes Locked = true
Textboxe med double talværdier Skal formateringen forblive intakt efter eventuel rettelse i textboxen ? Kopier da følgende markerede kode ind i textboxens Exit hændelse.
Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean) UserForm1.TextBox3.Text = Format(CDbl(TextBox3.Text), " #,##0.00") End sub
"Slet en række knappen" Sletter du en række i arket køb, via knappen på Userformen ?, skal samme række (bilagsnummer) i listen også slettes. Kopier derfor følgende markerede kode ind i SLET knappens klik hændelse.
Private Sub cmdSletRække_Click() 'Hvis der ikke er valgt et bilagsnummer på listen If UserForm1.lstBilagsNr.ListIndex = -1 Then
Exit Sub
Else
'slet hele række, hvori den aktuelle celle findes curcell.EntireRow.Delete
'sæt tom linie som default UserForm1.lstBilagsNr.ListIndex = -1
End If
End Sub
Klargør listen og åbn Userformen Kopier følgende markerede kode ind i den hændelse der åbner din userform.
Private Sub cmdVisUserForm_Click() Dim a As Integer Dim c As Range
'fyld listen med bilagsnumre fra kolonne A på arket Køb For a = 2 To Sheets("Køb").Range("A65536").End(xlUp).Row
'set C = den næste celle i kolonnen Set c = Worksheets("Køb").Cells(a, 1)
UserForm1.lstBilagsNr.AddItem (c.Value)
Next
'giv listen fokus UserForm1.lstBilagsNr.SetFocus
'vis userformen UserForm1.Show 0
End Sub
Modal status ?? Hvis din userforms ShowModal er = false (se i userformens properties), betyder det, at der kan arbejdes udenfor userformen, mens denne er åben/aktiv. Dette betyder at der i princippet kan tilføjes/slettes rækker i regnearket, hvorfor listen på userformen skal holdes a'jour. Det kan gøres ved at kopiere følgende markerede kode ind i arket Køb´s (Worksheet) SelectionChange hændelse ...
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim a As Integer Dim c As Range
UserForm1.lstBilagsNr.Clear
'fyld listen med bilagsnumre fra kolonne A på arket Køb For a = 2 To Sheets("Køb").Range("A65536").End(xlUp).Row
'set C = den næste celle i kolonnen Set c = Worksheets("Køb").Cells(a, 1)
UserForm1.lstBilagsNr.AddItem (c.Value)
Next
End Sub
-------- For hver ændring der sker på arket Køb opdateres listen på userformen.
Det var vist alt ? ... og dog. Tjek endnu engang at alle dine navne på ark, userform, listboxe m.m. stemmer overens med de kopierede koder.
Et tip kunne være at lave en kopi at dit Excel ark, hvori du så kan rode rundt med ovenstående ... Så har du altid en version der virker, hvis der går fuldstændig ged i det :o)
Har dog nedenståenden kommentarer/forbedringsforslag.
Vedrørende listen Lige nu er det sådan, at når man åbner userformen, så fremgår alle bilagene i listboksen, hvilket også er fint nok. Jeg har en TextBox1, hvor det var meningen at man skulle kunne søge på et bilagsnummer.
Vil høre om det var muligt at kombinere TextBox1 og Listboksen, således så når Userformen åbnes vises alle bilagsnummerne i listboksen (hvilket også er gældende nu), men så kunne jeg godt tænke mig, at man ved at skrive en talværdi i Textbox1, vil listboksens valgmuligheder blive formindsket ift. den værdi man har tastet ind. Her er et lille eksempel:
I Listboksen ser anført nedenstående værdier: 100 101 102 103 200 201 300
I TextBox1 tastet der nu 3, hvorefter listboksen kun vil vise de værdier som starter med 3 - altså vil kun 300 blive vist, hvorefter brugeren kan kilkke på 300 i listboksen. Herefter vil de enkelte textboxe blive udfyldt med indhold fra arket "køb"
Jeg får en fejlmeddelses når jeg skal slette indholdet. Har følgende kode: (Har forsøgt at tilføje en MsgBox)
Private Sub cmdSletRækkeP1_Click()
'Hvis der ikke er valgt et bilagsnummer på listen If UserForm4.lstBilagsNr.ListIndex = -1 Then
Exit Sub
Else
ans = MsgBox("Du er ved at slette bilaget." & vbCr & _ "Bemærk at handlingen ikke kan fortrydes efterfølgende!" & vbCr & " " & vbCr & _ "Ønsker du at slette bilaget?", 48 + vbYesNo, "Slet køb")
If ans = vbYes Then
'slet hele række, hvori den aktuelle celle findes curcell.EntireRow.Delete
Hvis der ikke allerede er gjort ? så kan du i listens properties vælge om listen skal søge på første tegn, hele værdien eller slet ikke søge ... Når man klikker i listen og begynder at taste ....
I dit eksempel: Tastes der 1 ... Findes alle de værdier der starter med 1, hvis listen er sat op til at søge på første tegn.
Hvad punktet hedder i properties kan jeg ikke huske ... ? Da jeg pt. Sidder på min telefon.
Med hensyn til din fejlmeddelelse i slette koden, så tror jeg, at hunden ligger begravet i, at du benytter en msgbox ... Som kun er envejs kommunikation til brugerne ... Fremfor en inputbox, som kan modtage et svar fra brugerne og efterfølgende handle derpå.
Spørgsmål vedr. #18 Er ikke helt med på hvad du mener. Lige pt. så sker der intet, når jeg taster noget ind i textBox1, som var den textbox, som før blev brugt til at søge værdierne frem:
Jeg har indsat følgende kode ind:
Private Sub lstBilagsNr_Change()
'slå skærmopdatering fra Application.ScreenUpdating = False
Dim counter As Integer 'tælle variabel til cellerne i kolonne A på arket Køb
'for hver celle i kolonne A på arket Køb 'start i celle A2 For counter = 2 To Sheets("Køb").Range("A65536").End(xlUp).row
'set curcell = den næste celle i kolonnen Set curcell = Worksheets("Køb").Cells(counter, 1)
'hvis den aktuelle celleværdi = værdien i testbox1 på userformen If curcell.Text = UserForm4.lstBilagsNr.Value Then
'sæt textbox1 = værdien i den aktuelle celle (bilagsnummer) UserForm4.TextBox1.Value = curcell.Text
'sæt textbox3 = værdien i cellen 1 til højre for den aktive celle UserForm4.TextBox26.Text = curcell.Offset(0, 1)
'sæt textbox2 = værdien i cellen 2 til højre for den aktive celle 'formater værdien således: "dd. mmmm yyyy" UserForm4.TextBox2.Text = Format(curcell.Offset(0, 2), "dd. mmmm yyyy")
'sæt textbox3 = værdien i cellen 3 til højre for den aktive celle UserForm4.TextBox3.Text = Format(curcell.Offset(0, 3), " #,##0.00")
'sæt textbox4 = værdien i cellen 4 til højre for den aktive celle UserForm4.TextBox4.Text = Format(curcell.Offset(0, 4), " #,##0.00")
'sæt textbox4 = værdien i cellen 5 til højre for den aktive celle UserForm4.TextBox5.Text = Format(curcell.Offset(0, 5), " #,##0.00")
'sæt textbox4 = værdien i cellen 6 til højre for den aktive celle UserForm4.TextBox6.Text = Format(curcell.Offset(0, 6), " #,##0.00")
'sæt textbox4 = værdien i cellen 7 til højre for den aktive celle UserForm4.TextBox25.Text = curcell.Offset(0, 0)
'forlad proceduren Exit Sub
End If
'næste celle i kolonne A på arket Køb Next
'slå skærmopdatering til igen Application.ScreenUpdating = True
Min idé med at indlæse bilagsnumrene i en liste er, at brugerne kun skal ha´ mulighed for at søge på/vælge de numre der er til rådighed. Det skal ikke være muligt at søge via "fritekst", hvor alle mulige tegn i princippet er i spil!
I min verden gi´r det ikke mening, sideløbene med listen, at kunne søge i textbox1 ... så er vi jo lige vidt, hvad angår muligheden for "fritekst" sægning ??
Som jeg skriver i #18: Hvis der ikke allerede er gjort ? så kan du i listens properties vælge om listen skal søge på første tegn, hele værdien eller slet ikke søge ... Når man klikker i listen og begynder at taste ....
I dit eksempel: Tastes der 1 ... Findes alle de værdier der starter med 1, hvis listen er sat op til at søge på første tegn.
Punktet i listens properties hedder: MatchEntry
Med andre ord, så kan brugerne søge direkte i listen. Tastes der eksempelvis 1 vises Bilagsnummer 1 i userformes Textbox1 med tilhørende værdier i de resterende textboxe.
Tastes der 1 igen vises næste bilagsnummer startende med tallet 1 + de tilhørende værdier ... osv. osv.
Som skrevet i #17: Lås din textbox med bilagsnumre, så brugerne IKKE kan redigere i dem. I textboxens properties sættes Locked = true
Brug kun Textbox1 til at vise brugerne, at det er det bilagsnummer der er valgt.
Og så tilbage til starten ... Jeg er ikke helt med på, hvad der fungerer/ikke fungere hos dig ?
Årsagen til at jeg godt kunne tænke mig dette skyldes, at det skal være hurtigt at kunne tilpasse sin søgning, så brugeren ikke skal scroll en hel masse bilagsnummere igennem.
Selvfølgelig skal det være sådan, at hvis man taster forkert, så der ikke er noget match, så skal listboxen ikke foretage sig noget.
Jeg har beskyttet TextBox1 med følgende kode, så det kun er muligt at indtaste tal og ikke bogstaver:
Private Sub TextBox3_keypress(ByVal KeyAscii As MSForms.ReturnInteger) Select Case Key Case 44 To 57 Case Else KeyAscii = 0 End Select End Sub
Håber det gav et bedere billed af, hvad jeg godt kunne tænke mig :-)
Flyt din kode fra listboxens Change hændelse til listboxens Click hændelsen i stedet, da der ikke skal hentes værdier til textboxene under selve søgningen ... Men først når brugeren klikker på det ønskede bilagsnummer.
Derudover har jeg, for overskuelighedens skyld, oprettet et dedikeret søgefelt på min userform ... fremfor at benytte Textbox1 til samme formål, hvilket vil give anledning til en del forvirring om hvilket bilagsnummer der faktisk bliver vist ???
Så Textbox1 er "bare" en textbox, som alle de andre, der viser det aktuelle bilagsnummer ... Evt. Locked, så brugerne ikke kan slette/overskrive nummeret! ... Textbox1 har ingen underliggende kode.
Her er koden til søgefeltet som jeg har døbt txtSøgefelt ... og igen, må du lige koordinere diverse navne, så de passer med virkeligheden ...
Private Sub txtSøgefelt_Change() Dim a As Integer 'tællevariabel Dim c As Range 'objekt variabel Dim talstreng As String 'variabel til talstreng Dim talstrengsLængde As Variant 'variabel til længden på talstrengen Dim talstrengLeft As Variant 'variabel til talstrengen fra venstre mod højre Dim status As String 'txtSøgefelt status
'set status = værdien i textbox1 status = Me.txtSøgefelt.Text
'vælg udfra status Select Case status
'hvis txtSøgefelt er tom Case ""
'fyld listen med alle bilagsnumre fra kolonne A på arket Køb For a = 2 To Sheets("Køb").Range("A65536").End(xlUp).Row
'set C = den næste celle i kolonnen Set c = Worksheets("Køb").Cells(a, 1)
UserForm4.lstBilagsNr.AddItem (c.Value)
Next
'sæt tom linie som default UserForm4.lstBilagsNr.SetFocus
' !!!!! fortsæt selv med dine resterende textboxe !!!!!
End With
'hvis txtSøgefelt ikke er tom Case Else
'hele den aktuelle talstreng i txtSøgefelt talstreng = Me.txtSøgefelt.Text
'aktuel talstrengs længde i txtSøgefelt talstrengsLængde = Len(talstreng)
'aktuel talstreng fra venstre mod højre talstrengLeft = Left(talstreng, talstrengsLængde)
'ryd listen Me.lstBilagsNr.Clear
'fyld listen med bilagsnumre fra kolonne A på arket Køb For a = 2 To Sheets("Køb").Range("A65536").End(xlUp).Row
'set C = den næste celle i kolonnen Set c = Worksheets("Køb").Cells(a, 1)
'Tjek cifre fra venstre i den aktuelle celleværdi på arket Køb 'Hvis de matcher de indtastede cifre i txtSøgefelt på userformen If Left(c.Value, talstrengsLængde) = talstrengLeft Then
'tilføj den aktuelle celleværdi til listen UserForm4.lstBilagsNr.AddItem (c.Value)
End If
Next
'giv txtSøgefelt fokus Me.txtSøgefelt.SetFocus
End Select End Sub
Og slutteligt, så tester jeg ikke for korrekt input (= tal) i søgefeltet ... men mon ikke du kan bruge din egen kode fra tidligere ?
Jeg har faktisk opretet en lille ny opgave, vedr. Sum af to textboxe.
Hvis du har mod på det :)?
Hilsen Jacob
Synes godt om
Ny brugerNybegynder
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.