Avatar billede Slettet bruger
20. maj 2007 - 14:57 Der er 8 kommentarer og
1 løsning

VBA - find navnet på named range via list Worksheet_Change event

Hej VBA gutter,

Vidensbehov:

Hver gang en celle's værdi ændres, skal der kontrolleres hvilket navn, indenfor en navngivet range, cellen tilhører.

Dette virker fint, sålænge lister ikke benyttes.

Jeg har problemer med at finde ud om en celle er indenfor et navngivet range, når man benytter sig af liste, med reference til en anden navngivet range i en anden kolonne.

- Jeg har givet min range et navn via indsæt -> navn -> definér
Navnet hedder minliste og kilden er =Ark1!$E$4:$E$7

- Jeg har derefter lavet en liste på en celle, som skal indeholde værdierne i "minliste" via Data -> DataValidering og lavet tillad liste, kilde: =minliste

Følgende VBA kode:

Sheet level:
---------------------------------------------------------

Private Sub Worksheet_Change(ByVal Target As Range)
        MsgBox "Værdier kommer fra Named Range: " & NameOfParentRange(Target)
End Sub

---------------------------------------------------------

Herefter har jeg defineret følgende som module:

---------------------------------------------------------

Function NameOfParentRange(Target As Range)
       
    Dim Nm As Name   
   
    For Each Nm In ThisWorkbook.Names
       
        If Target.Parent.Name = Nm.RefersToRange.Parent.Name Then
         
            If Not Application.Intersect(Target, Nm.RefersToRange) _
                Is Nothing Then
                    NameOfParentRange = Nm.Name
                Exit Function
            End If
        End If
       
    Next Nm
    NameOfParentRange = "NONE"
End Function

---------------------------------------------------------

Koden kan fint finde navnet på "inline named ranges, dvs hvis en værdi ændres som "plain-text" indenfor et named range.

Hvad skal der til for at finde ud af navnet på den range en listeværdi "peger på", når en liste værdi ændres?

Tusind tak for hjælpen!
Avatar billede kabbak Professor
21. maj 2007 - 00:31 #1
Finder navnet på den liste der bruges i den datavalidering

Function NameOfDataliste(Target As Range)
Dim A As String
    A = Mid(Target.Validation.Formula1, 2, 99)
    NameOfParentRange = A
End Function

NB giver fejl, hvis den IKKE har datavalidering
Avatar billede Slettet bruger
21. maj 2007 - 20:09 #2
Hej Kabbak,

Virker fint med ren liste med datavalidering! :-D - Men så fejler min test med named range "inline-text".

Spgm 1:
Kan den ovenstående funktion kombineres med din, således at den virker i alle situationer?

Spgm 2:
Nu er jeg ikke VB koder, så hvad ligger til grund for:

Mid(Target.Validation.Formula1, 2, 99)

Gider du uddybe? :-)

Tusind tak!
Avatar billede Slettet bruger
21. maj 2007 - 21:21 #3
Bare glem spørgsmålene - har lurret hvorfor :-)

Til gengæld så har jeg forsøgt at lave funktionen, så den virker i alle scenarier. Men gør den nu også det?

Kode:
----------------------------------------------------
Function NameOfParentRange(Target As Range)
       
  Dim isNamedRange As String
   
  'if a validation has NOT been set in the Target cell, an error occurs
  'so trap that error with this
 
  On Error Resume Next

  If Target.Validation.Type = xlValidateList Then
       
    isNamedRange = Target.Validation.Formula1
   
  Else
       
    isNamedRange = vbNullString
   
  End If
   
  'If the target refer to a named range list, find named range for that list
       
  If Not isNamedRange = vbNullString Then
       
    NameOfParentRange = Mid(Target.Validation.Formula1, 2, 99)
   
    Exit Function
   
  End If
       
  For Each Nm In ThisWorkbook.Names
           
    If Target.Parent.Name = Nm.RefersToRange.Parent.Name Then
           
      If Not Application.Intersect(Target, Nm.RefersToRange) _
        Is Nothing Then
                       
          NameOfParentRange = Nm.Name
                   
          Exit Function
               
      End If
           
    End If
       
    Next Nm
         
    'if no named range found return "NONE"
    NameOfParentRange = "NONE"
   
End Function

----------------------------------------------------

Endnu engang tak!
Avatar billede kabbak Professor
22. maj 2007 - 00:03 #4
jeg håber at du finder ud af om den virker på alle scenarier.
;-))
Avatar billede Slettet bruger
22. maj 2007 - 22:14 #5
Ah okey... det var måske nok lige ambitiøst nok spurgt! :-P

Den fejler hvis validationlist ikke er navngivet, for så har den jo ikke et navn. Dette er nu rettet.

Følgende virker upåklageligt i forhold til vidensbehovet for spørgsmålet:

--------------------------------------------------

Function NameOfParentRange(Target As Range)
       
    Dim isValidationList As String
       
    'if a validation has NOT been set in the Target cell, an error occurs
    'so trap that error with this
   
    On Error Resume Next
   
        If Target.Validation.Type = xlValidateList Then
   
            isValidationList = Target.Validation.Formula1
       
        Else
           
            isValidationList = vbNullString
       
        End If
               
        'If the target refer to a named range list, find the name for the validation list
           
        If Not isValidationList = vbNullString Then
           
            Dim testVal As String
           
            'extract the name
            testVal = Mid(Target.Validation.Formula1, 2)
         
            Dim name As name

            For Each n In ActiveWorkbook.Names

                If n.name = testVal Then
                   
                    NameOfParentRange = n.name
                   
                    Exit For
           
                End If

            Next
               
        End If
   
    'Catched errors here
    If Err.Number <> 0 Then

        Select Case Err.Number
            Case 9
                MsgBox "Requested chart does not exist.", _
                    vbExclamation, "No Such Chart"
            Case Else
                MsgBox "Im down.", _
                    vbExclamation, "What was that!?"
        End Select
       
    End If
   
    NameOfParentRange = "NONE"

End Function
--------------------------------------------------


Eneste udfordring tilbage er nu:

Hvis du ændrer i en Validationlist bygget på baggrund af et named range OG selve validationlist er indenfor et ANDET named range... - Hvordan finder man så DET navn? - via noget parent range noget?

Tak for hjælpen Kabbak, du fik mig på rette spor.
Avatar billede kabbak Professor
22. maj 2007 - 22:32 #6
nu er du vist langt ude, hvad i alverden skal du bruge det til :-))
Avatar billede kabbak Professor
22. maj 2007 - 23:02 #7
En oplysning, du måske kan bruge.

Stop koden under udførsel, der er 2 måder
1. skriv stop på en linje
2. klik ude i bjælken til venstre, ud for den linje du vil stoppe ved, så kommer der en bordeaux farvet prik  og linjen er markeret med samme farve, det stopper også koden, hvis den gennemløber linjen.

Når så koden stopper, så vælg View, > Locals Vindow

Nu kan du se alle variablers værdier, og hvad der findes under Parent
Avatar billede Slettet bruger
22. maj 2007 - 23:27 #8
Jeg skal bruge navnet på ranges til blandt andet at styre baggrundsfarver på et mega excel ark. Udfra navnene på validationlist kan jeg så tyre dem ind i et array og nulstille celler efter behov. Forskellige ranges kan være vilkårligt rundt omkring i sheetet, så derfor vil jeg bruge navne over array iteration til farver, nulstilling til default værdier ved deaktivering mv. :-)

Sidste udfordring på funktionen er nu bare, at finde de ranges som er "main" ranges, dvs. dem som kommer til at afgrænse de overordnede områder for validation-listerne :-)

Tak for info, det vil jeg prøve :-)
Avatar billede supermand5230 Nybegynder
28. maj 2007 - 18:18 #9
hej vba gutter....i ser ud til at i har bedre styr på vba end mig...har en masse forskellige alder.der er ca 4000 forskellige alder..disse alder skal deles ind på flere aldersgruppe...18-29,30-50, 50- eks..

hvordan laver man det via vba...alderne skal inddeles og derfter skal der vises en graf over inddelingen

hjælp mig gutter.
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
Kurser inden for grundlæggende programmering

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