vbamania.pl
login:
hasło:
 
  *Rejestracja *Zapomniane hasło
 Dziś jest sobota, 18 maja 2024 roku.
Ustaw jako stronę startową Ulubione Napisz
PowrótPowrót do serwisu  RegulaminRegulamin rssRSS

  tytuł wątku:
Wątki dyskusji

EXCEL/VBA: kontrola poprawności danych - brak pustych wierszy w liście rozwijalnej, ciekawe rozwiązanie. Prośba o pomoc.


otwartyotwarty rozpoczął: Betinka postów: 6



napisał: Betinka
postów: 4


umieszczony:
6 października 2010
22:27

  
cóż mogę powiedzieć ............. wielkie dzięki Rycho!!
napisał: Rycho
postów: 291


umieszczony:
5 października 2010
14:06

  
nazwa pliku rozmiar
lista wyboru.zip 12.98 kB

Ok,
w załączonym pliku są dwie listy.

Dodatkowo zmieniłem w kodzie, by lista po raz pierwszy tworzyła się automatycznie a nie ręcznie jak było wcześniej oraz dopisałem by listy uaktualniały się nie tylko po zamianie zawartości komórki ale także 'przy wejściu' do komórki.

Powodzenia.
napisał: Betinka
postów: 4


umieszczony:
4 października 2010
22:33

  
dzięki Rycho

możesz załączyć jakiś plik excelowski z tym przykładem ?

pzdr
Beata
napisał: Rycho
postów: 291


umieszczony:
4 października 2010
14:19

  
Hej,
zmieniłem ten kod wg własnych upodobań.

Procedura z parametrami, która zmodyfikuje właściwą nazwę:
Sub Utworz_Nazwe_Dla_Listy(zrodlowa As Range, pomocnicza As Range, nazwa As _
    String)
  'Parametry:
  'zrodlowa - pierwsza KOMÓRKA kolumny źródłowej
  'pomocnicza - pierwsza KOMÓRKA kolumny pomocniczej
  'nazwa - NAZWA dla zakresu komórek

  'Procedura na podstawie kolumny (listy nieposortowanej
  'i niecągłej, utworzy, w pomocniczym arkuszu, listę (nazwany
  'zakres) do wykorzystania w sprawdzaniu poprawności.

  'skasowanie poprzedniej listy
   On Error GoTo Utworz_Nazwe_Dla_Listy_Error

  pomocnicza.EntireColumn.ClearContents

  'kopiowanie kolumny źródłowej do pomocniczej
  With zrodlowa.Parent
    .Range(zrodlowa, .Cells(Rows.Count, _
        zrodlowa.Column).End(xlUp)).AdvancedFilter CopyToRange:=pomocnicza, _
        Action:=xlFilterCopy, Unique:=True
  End With

  'sortowanie listy w arkuszu pomocniczym
  With pomocnicza.Parent
    .Range(pomocnicza, .Cells(Rows.Count, pomocnicza.Column).End(xlUp)).Sort _
        Key1:=pomocnicza, Order1:=xlAscending, Header:=xlYes
  End With

  'utworzenie/'odnowienie' nazwy dla zakresu
  pomocnicza.Parent.Range(pomocnicza(2), pomocnicza.End(xlDown)).Name = nazwa

Utworz_Nazwe_Dla_Listy_Exit:
   On Error GoTo 0
   Exit Sub

Utworz_Nazwe_Dla_Listy_Error:

  MsgBox "Error " & Err.Number & " (" & Err.Description & _
      ") in procedure Utworz_Nazwe_Dla_Listy of Module Module1"
  Resume Utworz_Nazwe_Dla_Listy_Exit

End Sub



Oraz przykładowe wykorzystanie jej w module arkusza:
- lista o nazwie 'Lista1"
- żródłem jest kolumna F w Arkusz1
- obszar tymczasowy listy jest w arkuszu 'TMP' w kolumnie B:
Private Sub Worksheet_Change(ByVal Target As Range)

  On Error GoTo Worksheet_Change_Error

  If Not Intersect(Target, Range("A:A")) Is Nothing Then

    Utworz_Nazwe_Dla_Listy _
        Worksheets("Arkusz1").Range("F1"), _
        Worksheets("TMP").Range("B1"), _
        "ListaA"

  End If

Worksheet_Change_Exit:
  On Error GoTo 0
  Exit Sub

Worksheet_Change_Error:
  MsgBox "Lista wyboru nie może być utworzona!", _
         vbCritical, " B Ł Ą D"

  Resume Worksheet_Change_Exit
End Sub

napisał: Betinka
postów: 4


umieszczony:
4 października 2010
07:55

  
nikt nie pomoże?
napisał: Betinka
postów: 4


umieszczony:
29 września 2010
22:52

  
cześć forum!

Jakiś czas temu miałam problem z excelowską opcją do "sprawdzania poprawności danych".

Chodziło o to że jeśli chciałam w danej komórce wybierać tylko wartości z listy rozwijalnej, a lista rozwijalna była robiona z jakiegoś duuuuużego zakresu to potem na tej liście rozwijalnej też pojawiały się te puste pola do wyboru, co spowalniało nierzadko wybór konkretnej wartości, jeśli miałam do wyboru np 50 wartości (przepraszam za te zdanie wielokrotnie złożone).

Rozwiązanie znalazłam na angielskim forum w postaci załączonego pliku. Rozwiązanie polega na tym, ktoś napisał kod VBA który "czyści" puste wartości w liście rozwijalnej.
Na arkuszu 1 są dane źródłowe do listy rozwijalnej która pojawia się w komórce D2. "Arkusz 2" jest arkuszem pomocniczym na którym tworzony jest "zakres" niepowtarzających się wartości bez pustych wartości (Val_List), które są potem wykorzystywane w liście rozwijalnej. Poza tym jest tutaj jakiś fajny kod, który uruchamia makro jeśli tylko komórki w kolumnie A w arkuszu 1 zostaną zmienione.
Ten kod to prawdopodobnie:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, Range("A:A")) Is Nothing Then

    Call Create_Val_List
    
End If

End Sub



Kod odpowiedzialny za tworzenie Val_list to pewnie:

Option Explicit

Sub Create_Val_List()
    
    With Sheets("Arkusz2")
    
        .Range("A:A").ClearContents
    
        Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row).AdvancedFilter _
            Action:=xlFilterCopy, CopyToRange:=Range("Filt_Dest"), Unique:=True
    
        .Range("A1:A" & .Cells(Rows.Count, 1).End(xlUp).Row).Sort Key1:=.Range("A1"), _
            Order1:=xlAscending, Header:=xlYes
            
        .Range("A2:A" & .Cells(Rows.Count, 1).End(xlUp).Row).Name = "Val_List"
        
    End With
    
End Sub




Moja prośba do was to wytłumaczenie mi co robią poszczególne linijki kodu VBA. Potrzebuje tego żeby sobie swobodnie manipulować tym programem do swoich potrzeb, bo jak zmienią się nazwy arkuszy to ten kod nie będzie działał pewnie. Niestety nie znam się prawie w ogóle na programowaniu, ale jak będę wiedziała gdzie trzeba zminić nazwę arkusza (to jest akurat łatwe) albo nazwy kolumn to będzie mi łatwiej. A jak jeszcze będę wiedziała co robią poszczególne linijki kodu to w ogóle będzie suuuper. Teraz np nie wiem czy jak w kodzie jest:
.Range("A2:A")


to czy jest to kolumna A w arkuszu 2 czy jest to kolumna A w arkuszu 2 począwszy od drugiego wiersza.

Wiem, że trudno może to być wytłumaczyć laikowi ale będę wdzięczna za każdą pomoc


pzdr
Beata


<-wstecz  1  dalej->
wszystkich stron: 1


Sortuj posty: z