logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Excel VBA - jak ustawić uniwersalny format daty dla różnych lokalizacji?

JaroFon 09 Sie 2015 09:09 3138 42
Najlepsze odpowiedzi LABEL_AI_GENERATED

Jak zapisywać i odczytywać daty w VBA tak, żeby działały poprawnie na różnych lokalizacjach systemu, bez błędów związanych z formatem daty?

Najlepiej nie zapisywać daty jako tekstu w lokalnym formacie, tylko jako liczbę Excela, czyli serial daty, bo sama data jest taka sama niezależnie od wersji językowej systemu [#14908560][#14910510] Jeśli masz osobno dzień, miesiąc i rok, użyj `DateSerial(danY, danM, danD)`, a do komórki wpisz wartość liczbową przez `CDbl(DateSerial(...))`; wtedy w komórce zostanie np. `42225`, a nie sformatowany tekst daty [#14908661][#14908723] Komórkę ustaw na format `General`, np. `Range("A1").NumberFormat = "General"`, żeby Excel nie próbował automatycznie wyświetlać jej jako daty [#14978306] Unikaj `DateValue()` do uniwersalnego parsowania jednego pola tekstowego, bo ono zależy od ustawień regionalnych i na różnych komputerach może dawać błąd [#14908870][#14908900] Jeśli datę trzeba tylko wyświetlić, format stosuj dopiero na końcu; w obliczeniach pracuj na `Year()`, `Month()` i `Day()` [#14908560]
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA
  • #1 14908172
    JaroFon
    Poziom 23  
    Posty: 1631
    Pomógł: 11
    Ocena: 355
    Witam. Mam prośbę o pomoc. Jaką prawidłową formę daty mam zastosować aby poniższy kod działał poprawnie? Problem w tym że pracuję w Czechach i poniższy kod na czeskim komputerze działa jak najbardziej poprawnie. Niestety na polskim w tym kodzie wywala błąd. Jaką zastosować formę tego kodu aby poprawnie zadziałała na każdym PC niezależnie od lokalizacji?

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #3 14908194
    JaroFon
    Poziom 23  
    Posty: 1631
    Pomógł: 11
    Ocena: 355
    Niestety ale w tym wypadku też wywala błąd:

    Excel VBA - jak ustawić uniwersalny format daty dla różnych lokalizacji?
  • Pomocny post
    #4 14908208
    PRL
    Poziom 41  
    Posty: 6944
    Pomógł: 953
    Ocena: 905
    W momencie wystąpienia błędu sprawdź wartość zmiennej 'i' i potem sprawdź komórkę o wartości wiersza zmiennej 'i' w kolumnie 'L'.
    Chodzi o zmienną 'dan4' - tutaj tkwi problem.
    Pomogłem? Kup mi kawę.
  • #5 14908228
    JaroFon
    Poziom 23  
    Posty: 1631
    Pomógł: 11
    Ocena: 355
    Już widzę gdzie jest błąd. Problem w tym że w czeskiej lokalizacji forma daty to "d.m.yyyy" a polskiej tp "yyyy-mm-dd", więc muszę to trochę inaczej rozwiązać już przy samym dodawaniu daty do kolumny L. Jeśli kolumnę L sformatuję jako "ogólną" a w kodzie dam coś takiego:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    ...to działa poprawnie. Czy takie rozwiązanie będzie prawidłowe? Pytam ponieważ opcji z datami w moim pliku mam sporo i nie chciałbym napotkać po drodze na inne problemy związane z datami.
  • #6 14908430
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    W instrukcji warunkowej sprawdź sobie ustawienia narodowe systemu (Np Application.International(xlDateSeparator) i w zależności od wyniku ustaw właściwe formatowanie lub podstaw (Replace) jedynie separator. Kod będzie działał zarówno "po polsku" i "po czesku"...

    P.S. Czy nie mieliśmy tego (lata temu) przy okazji "szychtownicy" (urodziny)?
  • #7 14908464
    JaroFon
    Poziom 23  
    Posty: 1631
    Pomógł: 11
    Ocena: 355
    Już to było ale z tym separatorem nie mogę sobie poradzi jak to zrobić. Ogólnie widzę że jest problem już przy samym dodawaniu daty do kolumny "L". W pierwszej kolejności od tego muszę zacząć. Do tej pory wszystko robiłem na czeskim komputerze i wszystko było ok. Teraz dość często pracuję również na polskim komputerze i niestety moje pliki nie działają poprawnie gdzie kody mają związek z datami. W jaki sposób prawidłowo dodawać datę do arkusza aby poprawnie wszystko działało na Pl iCZ komputerze? Na chwilę obecną datę dodaję jak w poniższy sposób, niestety poprawnie działa to po stronie czeskiej, po stronie polskiej data w takim formacie nie jest widziana przez Excel jako data.

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #8 14908560
    PRL
    Poziom 41  
    Posty: 6944
    Pomógł: 953
    Ocena: 905
    Zacznijmy od tego, ze data jest liczbą. Taką samą obojętnie w jakiej wersji językowej.

    Jedynie format jej przedstawienia różni się.
    Operuj w kodzie funkcjami Year(), Month() i Day(). Wtedy nie będziesz miał problemów. Format możesz sobie stosować na końcu obliczeń do odpowiedniego przedstawienia.

    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    42224 dni minęły od 1900-01-01 do dzisiaj.
    Pomogłem? Kup mi kawę.
  • REKLAMA
  • #9 14908608
    JaroFon
    Poziom 23  
    Posty: 1631
    Pomógł: 11
    Ocena: 355
    Zrobiłem dodanie daty jak poniżej , gdzie danY to rok danM to miesiąc a danD to dzień. Data się dodaje ale dlaczego jak wpiszę do TextBoxów datę 9.8.2015 to do komórki dodaje się data 1905-01-08? I czy mogę datę dodać tylko z jednego TextBoxa?

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #10 14908625
    PRL
    Poziom 41  
    Posty: 6944
    Pomógł: 953
    Ocena: 905
    Jak w moim opisie... zapraszam na PW i Teamviewer.

    Stosujesz Year(Rok)?
    Nie tak...
    Nie od rok, a od daty.
    Pomogłem? Kup mi kawę.
  • #12 14908673
    JaroFon
    Poziom 23  
    Posty: 1631
    Pomógł: 11
    Ocena: 355
    ok a jak zrobić aby po dodaniu daty data nie była sformatowana i miała postać np. dzisiejsza 42225
  • #13 14908696
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    w komorce 'Ogólny' format
  • #14 14908702
    JaroFon
    Poziom 23  
    Posty: 1631
    Pomógł: 11
    Ocena: 355
    Ok, jeśli komórka ma format "Ogólny" i do takiej komórki dodam datę z kodu VBA to tak komóra automatycznie zostanie sformatowana do postaci daty a chciałbym żeby się nie formatowała ponieważ potem nie mam możliwości ręcznego zmieniania formatu komórki.
  • REKLAMA
  • #16 14908745
    JaroFon
    Poziom 23  
    Posty: 1631
    Pomógł: 11
    Ocena: 355
    Dzięki bardzo, działa wyśmienicie :) . Ale jeszcze jedno pytanko. Teraz mój kod wygląda jak poniżej ale jak zrobić to samo tylko z jednej komórki TextBox? Tak aby do TextBoxu dodać datę w postaci "d.m.yyyy" i aby do komórki data została dodana w niesformatowanej postaci?

    Excel VBA - jak ustawić uniwersalny format daty dla różnych lokalizacji?

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #17 14908756
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    =cdbl(datevalue(TextBox1.Text))
  • #18 14908762
    PRL
    Poziom 41  
    Posty: 6944
    Pomógł: 953
    Ocena: 905
    Żebyś się nie męczył z różnymi datami wprowadzanymi przez użytkownika, proponuję 3 pola tekstowe dal roku, miesiąca i dnia.
    Pomogłem? Kup mi kawę.
  • #19 14908823
    JaroFon
    Poziom 23  
    Posty: 1631
    Pomógł: 11
    Ocena: 355
    PRL napisał:
    Żebyś się nie męczył z różnymi datami wprowadzanymi przez użytkownika, proponuję 3 pola tekstowe dal roku, miesiąca i dnia.


    Może i było by to dobre rozwiązanie jak była by to tylko jedna data do dodawania ale w moim przypadku jest tego sporo i musiałbym za dużo zmieniać, dlatego chciałbym się ograniczyć tylko do jednego TextBoxu do każdej daty jaka jest w moim przypadku.
  • REKLAMA
  • #20 14908838
    PRL
    Poziom 41  
    Posty: 6944
    Pomógł: 953
    Ocena: 905
    Czegoś nie rozumiem.
    Jeżeli masz pole tekstowe do wpisania daty przez użytkownika, to Polak wpisze '2015-08-09', a Amerykanin '08/09/2015', Czech pewnie '09/08/2015' itd.
    To Ty musisz, na podstawie danej wejściowej, zadbać o odpowiednią interpretację danych.
    Pomogłem? Kup mi kawę.
  • #21 14908870
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    Na to jest DateValue(), jak argument idzie nawet "09 Sie 2015"
  • #22 14908895
    JaroFon
    Poziom 23  
    Posty: 1631
    Pomógł: 11
    Ocena: 355
    Nie. Te daty będę wpisywał tylko JA, i z przyzwyczajenia będę wpisywał je zawsze w postaci d.m.yyyy i taką tylko formą muszę się posługiwać. Dlatego jak do komórki dodać datę która jest wpisana w TextBoxie w formacie d.m.yyyy ?

    Kod: text
    Zaloguj się, aby zobaczyć kod


    JRV napisał:
    Na to jest DateValue(), jak argument idzie nawet "09 Sie 2015"


    Zadanie funkcji DateValue() wywala mi błąd
  • #23 14908900
    PRL
    Poziom 41  
    Posty: 6944
    Pomógł: 953
    Ocena: 905
    JRV, nie wiem, jak u Ciebie, ale w PL jest błąd:

    Kod: VBScript
    Zaloguj się, aby zobaczyć kod


    Uważam, że najlepiej jest przetworzenie danej wejściowej przez programistę i ją odpowiednio zastosować w zależności od potrzeb...
    Pomogłem? Kup mi kawę.
  • #24 14908906
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    Dla DateValue argument jest String(default)
    cytat: "date argument is normally a string expression representing a date"
    "If date is a string that includes only numbers separated by valid date separators, DateValue recognizes the order for month, day, and year according to the Short Date format you specified for your system"

    Dodano po 6 [minuty]:

    Ten sam wynik w trzech przypadkach:
    [c3]=datevalue("9.8")
    [c2]=datevalue("9.8.15")
    [c1]=datevalue("2015-8-9")


    Wprowadź datę
    Załączniki:
    • Data_proba.xls (23 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #25 14909034
    JaroFon
    Poziom 23  
    Posty: 1631
    Pomógł: 11
    Ocena: 355
    Ostatecznie rozwiązanie z trzema polami TextBox dla jednej daty byłoby najlepszym rozwiązaniem i działa naprawdę wyśmienicie, jednak jak widać na załączonym screenie w moim przypadku tych dat zaznaczonych na czerwono jest sporo i musiałbym dużo zmieniać aby dla każdej daty zrobić trzy pola TextBox. Dlatego byłbym za zastosowaniem jednego TextBoxu dla każdej daty ale żeby działały tak samo poprawnie jak dla trzech TextBoxów. Z tych wszystkich opisów w dalszym ciągu nie wiem jak to zrobić :(

    Excel VBA - jak ustawić uniwersalny format daty dla różnych lokalizacji?
  • Pomocny post
    #26 14909145
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    Przyjąłbym czeski wariant rozwiązania, odporny na wpisywanie "-" i z głowy. Przykład z załącznika działa w PL, należałoby sprawdzić (teoretycznie powinien) czy zadziała w CZ.

    :arrow: JRV - No to masz sporo problemów z głowy. W wersji PL + polski Windows takie coś nie przejdzie :(
    I gdzie tu sprawiedliwość? ;)
    Załączniki:
    • jFon.xls (47 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #27 14909568
    JRV
    Specjalista - VBA, Excel
    Posty: 2724
    Pomógł: 805
    Ocena: 455
    adamas_nt napisał:
    No to masz sporo problemów z głowy

    Nie wiem czy sobie sprawę, ale z każdej sytuacji jest nie mniej niż dwa wyjśćia.
    Jak by miałem plik, następnie znaleźć rozwiązanie.
  • #28 14910398
    JaroFon
    Poziom 23  
    Posty: 1631
    Pomógł: 11
    Ocena: 355
    adamas_nt napisał:
    Przyjąłbym czeski wariant rozwiązania, odporny na wpisywanie "-" i z głowy. Przykład z załącznika działa w PL, należałoby sprawdzić (teoretycznie powinien) czy zadziała w CZ.

    :arrow: JRV - No to masz sporo problemów z głowy. W wersji PL + polski Windows takie coś nie przejdzie :(
    I gdzie tu sprawiedliwość? ;)


    Twoje rozwiązanie jest naprawdę fajne i teraz wykorzystałem je u siebie. Jednak w dalszym ciągu nie robi tego czego chcę. Twoje rozwiązanie dodaje datę jako text, a z tego nie wyciągnę daty bez komplikowania sobie kodów VBA, chodzi mi aby data dodawała się w postaci niesformatowanej do daty tylko jako cyferki, coś jak na screenie. Jak na podstawie Twojego rozwiązania zrobić coś takiego? Z tych cyferek niezależnie od lokalizacji zawsze wyciągnę datę i to w takiej formie w jakiej mi się spodoba i nigdy nie będzie problemu czy kod VBA zadziała na komputerze PL czy CZ

    Excel VBA - jak ustawić uniwersalny format daty dla różnych lokalizacji?
  • Pomocny post
    #29 14910510
    adamas_nt
    VIP Zasłużony dla elektroda
    Posty: 5320
    Pomógł: 1508
    Ocena: 659
    Może po prostu zapisywać jako liczbę? Sprawdź jak zadziała w CZ.
    Załączniki:
    • Test1.xls (38.5 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #30 14910609
    JaroFon
    Poziom 23  
    Posty: 1631
    Pomógł: 11
    Ocena: 355
    adamas_nt napisał:
    Może po prostu zapisywać jako liczbę? Sprawdź jak zadziała w CZ.


    Dzięki wielkie, o to mi właśnie chodziło :) Teraz jeszcze zostaje kwestia sprawdzenia poprawności działania na komputerze czeskim ale to dopiero za tydzień bo mam urlop. Ale myślę że na czeskiej lokalizacji będzie taka samo jak na PL
    Czy kwestia wyświetlania poprawnego słowa "lat", "lata" jak widać na screenie było by skomplikowane?

    Excel VBA - jak ustawić uniwersalny format daty dla różnych lokalizacji?

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono problem ustawienia uniwersalnego formatu daty w Excel VBA, który działałby poprawnie niezależnie od lokalizacji systemu operacyjnego. Użytkownik zauważył, że kod działający w Czechach generuje błędy na polskim komputerze z powodu różnic w formacie daty. Proponowane rozwiązania obejmowały użycie funkcji Year(), Month() i Day() do obliczeń oraz formatowanie daty jako liczby, co pozwala na uniknięcie problemów z lokalizacją. Użytkownicy sugerowali również sprawdzenie ustawień narodowych systemu oraz użycie funkcji DateValue() do konwersji daty z formatu tekstowego. Ostatecznie, użytkownik zdecydował się na zapis daty jako liczby, co miało zapewnić poprawne działanie na różnych lokalizacjach.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA