Dinamično določanje validacije

Pomoč pri izdelavi makrov
Odgovori
GoldZ
Prispevkov: 137
Pridružen: Če Sep 01, 2005 10:20 am

Dinamično določanje validacije

Odgovor Napisal/-a GoldZ »

Pozdravljeni!

Najbrž sem se srečal z neprijetno omejitvijo... :x

Moj problem:

Glede na izbrano vrednost v celici, v drugi celici zvezka s pomočjo VBA kode nastavljam validacijo seznam. Vse lepo špila, potem pa pridem do primera, ko je teh elementov malo več in mi jih potem v spustnem seznamu ne prikaže vseh. V primerih, ko je manj elementov, lepo dela.

Elemente polnim v spremenljivko seznam, tipa String.

Koda: Izberi vse

Sub napolni_CC()

Dim celica As Range
Dim seznam As String
Dim test As Range

seznam = ""

'označim šifrant CC
Application.Goto Reference:="CC"


i = 1
department_oznaka = Worksheets("interface").Range("c2").Value
If department_oznaka <> "" And department_oznaka <> "Salaries" Then
For Each celica In Selection
    'napolnim tekstovno polje
    If celica.Value = department_oznaka Then
        seznam = seznam + celica.Offset(0, 1).Value + ","
        i = i + 1
    End If
    
Next
'Worksheets("List1").Range("c3").ClearContents
'Worksheets("List1").Range("c3").Value = seznam
'MsgBox i
'nastavimo validacijo
Worksheets("interface").Range("c3").ClearContents
Worksheets("interface").Range("c3").Validation.Delete
Worksheets("interface").Range("c3").Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, _
Formula1:=seznam 'polnim seznam
Worksheets("interface").Activate
Range("c3").Select

ElseIf department_oznaka = "" Then
    Worksheets("interface").Activate
    Range("c2").Select
    MsgBox "Najprej izberi Department"
    Else
    'MsgBox "sala"
   ' Dim novi As String
 '   Dim celica1 As Range
  '  j = 0
  '  'Application.Worksheets.Add
    'Application.Goto Reference:="CC"
   ' For Each celica1 In Range("cc")
    ''MsgBox celica.Address
    ' If celica1.Value = "Salaries" Then
   ' MsgBox celica1.Row
   ' Worksheets("podatki").Activate
'Range(Selection, Selection.End(xlDown)).Select
'odmik = Range(Selection, Selection.End(xlDown)).Count
'a = celica1.Row
        'j = j + 1
        'b = celica1.Row + j - 1
        'End If
       ' ActiveWorkbook.Names.Add Name:="aa", RefersToR1C1:="=podatki!R" & a & "C5:R" & b & "C5"
   ' Worksheets("interface").Activate
    
    'Next
    'nastavimo validacijo
Worksheets("interface").Range("c3").ClearContents
Worksheets("interface").Range("c3").Validation.Delete
Worksheets("interface").Range("c3").Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, _
Formula1:="=SAL" 'polnim seznam
Worksheets("interface").Activate
Range("c3").Select

End If

End Sub 
Kaj se dogaja? Je to omejitev validacije ali ročnega vnosa?

LP!
Življenje je enostavno, če poznaš "The Secret".
GoldZ
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

POzdravljeni,

Če kodo vsaj malce uredite, jo je precej lažje brati:

Koda: Izberi vse

Option Explicit

Sub napolni_CC()
    Dim celica As Range
    Dim seznam As String
    Dim test As Range
    Dim i, department_oznaka
    
    seznam = ""
    
    'označim šifrant CC
    Application.Goto Reference:="CC"
    
    i = 1
    department_oznaka = Worksheets("interface").Range("c2").Value
    If department_oznaka <> "" And department_oznaka <> "Salaries" Then
        For Each celica In Selection
            'napolnim tekstovno polje
            If celica.Value = department_oznaka Then
                seznam = seznam + celica.Offset(0, 1).Value + ","
                i = i + 1
            End If
        Next
        
        Worksheets("interface").Range("c3").ClearContents
        Worksheets("interface").Range("c3").Validation.Delete
        Worksheets("interface").Range("c3").Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                                            Operator:=xlBetween, Formula1:=seznam ' polnim seznam
        Worksheets("interface").Activate
        Range("c3").Select
    ElseIf department_oznaka = "" Then
        Worksheets("interface").Activate
        Range("c2").Select
        MsgBox "Najprej izberi Department"
    Else
        Worksheets("interface").Range("c3").ClearContents
        Worksheets("interface").Range("c3").Validation.Delete
        Worksheets("interface").Range("c3").Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                                            Operator:=xlBetween, Formula1:="=SAL" 'polnim seznam
        Worksheets("interface").Activate
        Range("c3").Select
    End If
End Sub
Še lažje bi bila koda razumljiva, če bi IF stavek malce obrnili in rekli:

Koda: Izberi vse

If department_oznaka = "" Then
    ...
ElseIf department_oznaka <> "Salaries" Then
    ...
Else
    ...
End If
Kar pa se tiče vašega povsem konkretnega vprašanja pa vam je odgovor že znan. V spustni seznam pač ne morete natlačiti "neskončno" možnosti... Pa saj to niti ni smiselno, kajne :wink:?

PS: Koliko elmentov pa želite stlačiti noter?
lp,
Matjaž Prtenjak
Administrator
GoldZ
Prispevkov: 137
Pridružen: Če Sep 01, 2005 10:20 am

Odgovor Napisal/-a GoldZ »

Pozdravljeni!

Priznam, koda je zgledala res nepregledno... gužva dela svoje in sem se med tem že "poboljšal" :wink:

Motilo me je naslednje:
  • če sem označil poljubno število celic in nastavil validacijo ročno, ni bilo nobenih omejitev za prikaz;
    če pa sem jo nastavljal z VBA, pa mi je na določenem mestu začel elemente odrezovati s prikaza. Bili so sicer vpisani v validacijo, samo prikazal ji nih vseh
Zaradi te nevšečnosti sem validacijo vrgel ven in uporabil klasični combobox. Zdaj pa lepo dela.

:D

P.S. Zanima me, kako bi lahko z VBA označeno območje poimenoval (kot poimenovan obseg), da bi ga potem lahko uporabil v delovanju, ob naslednjem klicu procedure pa ga pobrišem in nastavim novega?

Lep pozdrav!
Življenje je enostavno, če poznaš "The Secret".
GoldZ
admin
Site Admin
Prispevkov: 3687
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Hm,

ne vem če vas pravilno razumem, toda, v VBA-ju neko območje poimenujete na ta način:

Koda: Izberi vse

ActiveWorkbook.Names.Add Name:="imeMojegaObmocja", RefersToR1C1:="=List1!R8C3:R18C5"
Uporabite pa na ta način

Koda: Izberi vse

Range("imeMojegaObmocja").<nekaj> = ...
lp,
Matjaž Prtenjak
Administrator
Odgovori