Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Jak zmienić format daty w textbox?

MarTeaM 03 Jan 2011 14:30 4817 15
  • #1
    MarTeaM
    Level 9  
    Mam Userform w którym mam textbox i w nim jest wpisywana data z tym że jak np. wpisze 11-2-2010 to w arkuszu excela pokazuje mi 2-11-2010 dlaczego? Miesiąc i dzień zamieniają się miejscami :|
    W textbox'ie mam tak:
    Code:

    Private Sub TextBox1_Change()
    Dim DNT
        DNT = TextBox1
        Range("'MTB 1'!A1") = DNT
    End Sub

    Domyślam się że gdzieś tutaj trzeba to wprowadzić ale nie wiem jak.
  • #2
    adamas_nt
    Moderator of Programming
    Format daty wyświetlanej w komórce zależy od formatu daty systemowej...

    Jeśli nie chcesz niczego zmieniać w systemie - dopisz linijkę z formatowaniem
    Code:
    .   DNT = TextBox1
    
        Range("'MTB 1'!A1") = DNT
        Range("'MTB 1'!A1").NumberFormat = "dd/mm/yyyy"
    Pokombinuj, bo nie wiemy czy chodzi o 11 lutego, czy 2 listopada :)
  • #3
    marcinj12
    Level 40  
    Dlatego, że Excel formatuje komórki z datą według przyjętych ustawień regionalnych. Jeżeli ustawisz format komórek na Data i wybierzesz mu np. ustawienia regionalne = Angielski (Stany Zjednoczone), to wtedy daty będą wyświetlane "po Angielsku" z miesiącem z przodu.
    Zawsze możesz wybrać format "niestandardowe" i narzucić jak daty mają być wyświetlane, np. w formacie: dd-mm-rrrr
  • #4
    MarTeaM
    Level 9  
    To nie działa bo teraz czyta to jako tekst i mam zamiast 11 luty to 11-2.
    I nie wiem jak to zrobić żeby w textbox'ie użyć więcej niż 5 znaków bo chcę wpisywać też rok.

    Dodano po 9 [minuty]:

    marcinj12: z tym jest wszystko OK. Sprawdziłem to wcześniej i jest ustawione na dd-mm-rrrr. Jak użyje tego co mi adamas_nt podał to też jest lipa nie mam pojęcia jak to zrobić.
  • #5
    marcinj12
    Level 40  
    MarTeaM wrote:
    To nie działa bo teraz czyta to jako tekst i mam zamiast 11 luty to 11-2.
    I nie wiem jak to zrobić żeby w textbox'ie użyć więcej niż 5 znaków bo chcę wpisywać też rok.

    TextBox ma właściwość MaxLength, domyślnie jest równa 0, musiałeś zmienić na 5 skoro robi ograniczenia długości....
    A żeby nie czytał jako tekst dokonaj konwersji na datę przed zapisaniem. Spróbuj w ten sposób:
    Code:
    Dim DNT as Date
    
    DNT = CDate(TextBox1.Text)
    Range("'MTB 1'!A1") = DNT


    ------
    Korekta:
    Zapomniałem, że powyższe działa, jeśli zastosujesz najbardziej "bezpieczny i uniwersalny" format, rozpoznawany we wszystkich lokalizacjach, i będziesz wpisywał datę w formacie rrrr-mm-dd.

    Jeżeli chcesz mieć ją w formacie dd-mm-rrrr, musisz dokonać złożenia daty do formatu rrrr-mm-dd z 3 części, bo Excel nie rozpozna formatu dd-mm-rrrr prawidłowo:
    Code:
    Dim DNT as Date
    
    DNT = CDate(Right(TextBox1.Text, 4) & "-" & Mid(TextBox1.Text, 4, 2) & "-" & Left(TextBox1.Text, 2))
    Range("'MTB 1'!A1") = DNT
  • #6
    MarTeaM
    Level 9  
    Niestety, nie działa. Mam błąd. Chciałbym mieć taki format: dd-miesiąc słownie ale wpisując do textbox'a muszę użyć też roku bo domyślnie wstawi mi 2011.
    Może przedstawię o co mi chodzi.
    Mam Userform na którym mam listview odczytujący dane z arkusza i w jednej kolumnie są same daty. Te daty w arkuszu są w formacie dd-miesiąc (słownie) a listview odczytuje je w formacie dd-mm-rrrr. No i teraz chcąc zmienić datę w arkuszu poprzez textbox'a chciałbym wpisywać datę w formacie dd-mm-rrrr. Zastanawiałem się nad użyciem Combobox'a który będzie brał daty z kalendarza który sam zrobię w drugim arkuszu ale nie chciałbym dodawać kolejnego arkusza z paroma tysiącami wierszy każdy z inną datą. Macie może jakiś pomysł jak to zrobić?
    Aha... Nie byłoby to tak ważne gdyby dane były tylko do odczytu bo listview odczytuje je jak wpisze je w formacie w textbox'ie dd-mm-rrrr ale w arkuszu one służą nie tylko jako sama data ale w kolejnej kolumnie ta data jest użyta do obliczenia i wtedy się pojawia problem.
  • #7
    marcinj12
    Level 40  
    A jaki konkretnie masz błąd i kiedy, bo kod jest poprawny i działa.
    Do wybierania dat możesz użyć pole tekstowe, comboboxa z listą dat, 3comboboxy: jeden z dniami 1...31, drugi z miesiącami 1...12, trzeci z latami, z których zbudujesz datę, albo - mój ulubiony sposób ;) - komponent Microsoft Date and Time Picker Control który można sobie dowolnie skonfigurować...
  • #8
    MarTeaM
    Level 9  
    No właśnie ComboBox wiem jak użyć z tym że nie wiem jak to zrobić przy pomocy trzech (dzień, miesiąc, rok). Chciałem to zrobić w jednym. Próbowałem też podzielić datę która jest w formacie amerykańskim na 3 części i później je złożyć do "kupy" ale wtedy jest odczytana jako TEKST i nie da się zmienić na datę.

    Błąd mi wyskakuje na tej linijce:
    Code:
    DNT = CDate(Right(TextBox1.Text, 4) & "-" & Mid(TextBox1.Text, 4, 2) & "-" & Left(TextBox1.Text, 2))



    A możesz mi pomóc z tym komponentem Microsoft Date and Time Picker Control?
  • #9
    marcinj12
    Level 40  
    Microsoft Date and Time Picker Control:
    tak jak dodawałeś ListView do listy kontrolek na toolboxie, dodaj element Microsoft Date and Time Picker Control (ja mam w wersji 6.0 (SP6)).
    Potem przeciągasz go na formę, nadajesz wymiar i ustawiasz parametry który chcesz mieć:
    Format - format w jakim wyświetlana jest data, użyej ShortDate albo 3-custom (wtedy w polu CustomFormat możesz podać np. dd-MM-yyyy albo dd-MMM-yyyy),
    Min date / Max date - możesz ustawić minimalną i maksymalną datę do wyboru w kontrolce,
    Value - tą wartość nadajesz albo odczytujesz, czyli:
    Gdzieś przy ładowaniu formy wstawiasz np.:
    Code:
    DTPicker1.Value = Date   'ustawia bieżącą datę

    a po wybraniu przez użytkownika odczytujesz:
    Code:
    Dim DTN as Date
    
    DTN= DTPicker1.Value
    Range("'MTB 1'!A1") = DNT
  • #10
    MarTeaM
    Level 9  
    Przepraszam Cię bardzo ale z tymi kodami to się pogubiłem. Wszystko od początku zrobiłem tak jak pisałeś ale jak te kody wpisuje to mam błąd.
    A mam tak (zastąpiłem tamtego TextBox'a):
    Code:

    Private Sub DTPicker1_CallbackKeyDown(ByVal KeyCode As Integer, ByVal Shift As Integer, ByVal CallbackField As String, CallbackDate As Date)
        Dim DNT As Date
        DNT = DTPicker1.Value
        Range("'MTB 1'!A1") = DNT
      End Sub

    A co z tym kodem:
    Code:

    DTPicker1.Value = Date  'ustawia biezaca date


    Bo ja go wpisałem najpierw w Userform_Initialize i lipa wyszła a teraz mam go w Show_Userform'ie tam gdzie otwieram swój UserForm:
    Code:

    Sub Show_UserForm1()
       
        UserForm1.MultiPage1.Value = 0
        UserForm1.Show
        DTPicker1.Value = Date  'ustawia biezaca date
    End Sub

    ...i też lipa.
    Pewnie nie zrozumiałem do końca tego co napisałeś :|
  • #11
    marcinj12
    Level 40  
    A dlaczego cały kod podpiąłeś do zdarzenia DTPicker1_CallbackKeyDown() ?
    Podepnij je do kliknięcia jakiegoś przycisku który masz na formie, coś w stylu:
    Code:
    Private Sub CommandButton1_Click()
    
        Dim DNT As Date
        DNT = DTPicker1.Value
        Range("'MTB 1'!A1") = DNT
    End Sub


    Jeżeli chodzi o kod
    Code:
    DTPicker1.Value = Date
    to musi być umieszczony na formie, w Private Sub UserForm_Initialize(). Sprawdź, czy ten komponent na pewno nazywa się DTPicker1, i czy jak wpiszesz DTP i wciśniesz CTRL+Spacja, to Ci się podpowie taka nazwa.
  • #12
    MarTeaM
    Level 9  
    OK. Fajnie wszystko działa tylko co jeśli chcę to zrobić na MultiPage'u z paroma zakładkami i na każdej zakładcę chcę DTPicker'a?
    Skopiowałem DTPicker'a na poszczególne zakładki i to samo zrobiłem z kodami (pozamieniałem numery stosownie do nich i do poszczególnych arkuszy w excelu) i mam error :| :

    An error occured in a call to the Windows Date and Time Picker control (35788)
    Jak to zrobić?
    DTPicker na UserForm'ie działa ale jak postawię drugi niestety ERROR!!!
    Jest na to jakieś rozwiązanie?
  • #13
    marcinj12
    Level 40  
    Faktycznie, też to mam. Wygląda na to że, zakładka z DTP musi być aktywna, kiedy przypisujesz do niego datę.
    Spróbuj tak:
    Code:
    MultiPage1.Value = 0
    
    DTPicker1.Value = Date

    MultiPage1.Value = 1
    DTPicker2.Value = Date

    MultiPage1.Value = 2
    DTPicker3.Value = Date
    '...etc
  • #14
    MarTeaM
    Level 9  
    No nic nie pomogło. Jest ten sam błąd. Rozumiem że ten kod mam wpisać w Show_UserForm1? Bo tam to wpisałem:
    Code:

        UserForm1.MultiPage1.Value = 0
        DTPicker1.Value = Date
        UserForm1.MultiPage1.Value = 1
        DTPicker2.Value = Date   ...etc

    ...UserForm1.Show

    A może trzeba zrobić to na zasadzie ENABLED = false(true)?
  • Helpful post
    #15
    marcinj12
    Level 40  
    Nie, w UserForm, w sekcji UserForm_Initialize:
    Code:
    Private Sub UserForm_Initialize()
    
        MultiPage1.Value = 0
        DTPicker1.Value = Date
       
        MultiPage1.Value = 1
        DTPicker2.Value = Date
       
        MultiPage1.Value = 2
        DTPicker3.Value = Date
    End Sub
  • #16
    MarTeaM
    Level 9  
    Sprostowanie!!!
    Działa idealnie :D
    Dziękuję marcinj12