• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

automatisch namen tussen pipes

Status
Niet open voor verdere reacties.

wieter

Terugkerende gebruiker
Lid geworden
26 jun 2009
Berichten
1.128
Wanneer in kolom A , een naam wordt ingetikt, zou die naam automatisch tussen pipes moeten verschijnen.
Dus Jan intikken, in de cel moet dan |Jan| verschijnen.
Met de onderstaande code krijg ik er gratis een honderdtal pipes extra bij.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:A10", "C1:C10")) Is Nothing And Target.Value <> "" Then
Target.Value = "|" & Target.Value & "|"
End If
End Sub
Wat is er fout?
 

Bijlagen

De pipes toevoegen triggert het change event keer op keer. Events dus uit en inschakelen :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:A10", "C1:C10")) Is Nothing And Target.Value <> "" Then
    Application.EnableEvents = False
    Target.Value = "|" & Target.Value & "|"
    Application.EnableEvents = True
End If
End Sub
 
Of met een aangepaste opmaak:
Opmaak.jpg
 
Of eerst controleren of er al pipes instaan:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:A10", "C1:C10")) Is Nothing And Target.Value <> "" And Not Target.Value Like "|*|" Then
Target.Value = "|" & Target.Value & "|"
End If
End Sub
 
Dan gaat 'ie nog steeds meerdere keren die functie uitvoeren waardoor je stack problemen kan krijgen.
Dus die Application.EnableEvents = False hoort er gewoon in als je de waarde van Target aanpast.
Daarnaast zal je nog moeten controleren op Target.Count, die moet 1 zijn omdat je anders bij het selecteren van de range en bijvoorbeeld op Delete drukt, fout 13 zal krijgen.

De aangepaste cel eigenschap is in deze veel handiger, dan heb je daar allemaal geen omkijken naar.
 
Met die stack problemen zal het wel meevallen; wat jij meerdere keren noemt, noem ik maximaal twee keer.
Bovendien zouden er ook nog andere events in kunnen hangen, die dan tijdelijk niet getriggerd worden.
 
Laatst bewerkt:
2 is nog steeds meer dan 1 ;)
 
Cel eigenschappen aanpassen lijkt het gemakkelijkst.
Bedankt allen voor de reacties.
Grtn wieter.
 
Hallo ed,
Cel eigenschappen > aangepast > |#|
Lukt bij mij niet( excel 2010). De naam wordt toch zonder pipes weergegeven.
Ook de toevoeging van Target.Count = 1 blijft Fout 13 geven.
De toevoeging van [On Error Resume Next] lost dit op, maar eigenlijk is dat een fout verdoezelen.
Heb je zin en tijd om me verder te helpen?
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:A10", "C1:C10")) Is Nothing And Target.Value <> "" [COLOR="#FF0000"][B]And Target.Count = 1[/B][/COLOR] Then
    Application.EnableEvents = False
    Target.Value = "|" & Target.Value & "|"
    Application.EnableEvents = True
End If
End Sub
Waarom een naam tussen pipes?
In het echte bestand moet met de functie "Find" naar een naam gezocht worden.
De functie "Find" ziet echter geen verschil tussen bij voorbeeld AN en ANN.
Een naam tussen pipes lost dit probleem op.
 
Even voor je getest in Excel 2010 en daar lijkt het inderdaad niet te werken. Het eerdere plaatje komt van Excel 2016.
Wat de functie betreft, doe het eens zo:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count = 1 Then
        If Not Intersect(Target, Range("A1:A10", "C1:C10")) Is Nothing And Target.Value <> "|*|" Then
            Application.EnableEvents = False
            Target.Value = "|" & Target.Value & "|"
            Application.EnableEvents = True
        End If
    End If
End Sub

NB:
Bij de Find in vba kan je Lookat:=xlWhole gebruiken.
Dan zal hij alleen AN vinden en niet ANN.
 
Laatst bewerkt:
Dat werkt perfect Ed. Bedankt!!!
Toch zit ik nog met een probleem:
Code:
If Not Intersect(Target, [COLOR="#FF0000"][B]Range("A1:A10", "C1:C10")) [/B][/COLOR]Is Nothing And Target.Value <> "|*|" Then
Ik dacht dat de actie alleen zou uitgevoerd worden in Range("A1:A10") en in Range("C1:C10")
Maar nu blijkt dat de waardes in ("B1:B10") ook tussen pipes gezet worden.
Dus de syntax: Range("A1:A10", "C1:C10") is fout om het juiste gebied af te bakenen.
Hoe schrijf ik de code, dat alleen In kolom A en kolom C de pipes gezet worden?
 
Zo?
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count = 1 Then
        If Not Intersect(Target, Range("A1:A10")) Is Nothing Or _
           Not Intersect(Target, Range("C1:C10")) Is Nothing And Target.Value <> "|*|" Then
            Application.EnableEvents = False
            Target.Value = "|" & Target.Value & "|"
            Application.EnableEvents = True
        End If
    End If
End Sub
 
Bedankt Conseclusie en Edmoor hiermee is alles opgelost.
Beiden bedankt!!!!
Grtn wieter
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan