2012-10-12 17 views
7

Obecnie mam do czynienia z problemem, który bardzo mnie niepokoi. Mam nadzieję, że ktoś mi pomoże. Pracuję dla dużej firmy, w której używane są zarówno Office 2007 (32bit) i Office 2010 (64 bit). Pisanie makr do kompatybilności przez całą firmę było dla mnie trudnym zadaniem (nigdy wcześniej nie programowałem w VBA - w rzeczywistości to forum bardzo mi pomogło). Moim zadaniem jest utrzymanie jednego dużego stołu we współużytkowanym arkuszu Excela. Istnieje kilka makr i kilka postaci użytkowych. Teraz krótko opiszę problem: Arkusz zawiera dwie kolumny z formatem daty (data rozpoczęcia i data zamknięcia). Obie wartości są importowane do kolumn z pól tekstowych userform (przycisk poleceń MsCal -exported to class-, który wypełnia te pola tekstowe datą). Potrzebuję tylko formatu daty w mm/dd/rrrr w obu kolumnach, aby wykonać filtrowanie i inne operacje. Kiedy te wartości są aktualizowane przez pracownika korzystającego z innej lokalizacji niż angielska data USA jest wprowadzana jako dd.mm.rrrr. To sprawia, że ​​prawidłowe filtrowanie na podstawie daty jest niemożliwe. Próbowałem zmienić formatowanie przez:Ten sam format daty w kilku lokalizacjach

UserForm1.TextBox10.Value = Format(Calendar1.Value, "mm/dd/yyyy") 

ale ten fragment kodu źle się trzyma. Na niektórych komputerach działa, na niektórych nie działa. I to daje mi ból głowy. Jak powinienem kontynuować teraz? Czy istnieje sposób zmuszenia programu Excel do używania tego samego formatu daty w arkuszu i zignorowania ustawień lokalizacji w systemie Windows? Pracownicy nie chcą zmieniać lokalizacji na angielski w USA, ponieważ są albo przyzwyczajeni do ich formatu, albo potrzebują go do innych aplikacji. Czy istnieje sposób tymczasowej zmiany lokalizacji tylko po otwarciu tego arkusza? Każda rada zostanie zaakceptowana. Dzięki z gory Peter

+0

Data w komórce programu Excel powinna być datą, a nie łańcuchem. Jeśli ustawisz format komórki na format daty poprzedzony gwiazdką * (co zwykle jest pierwszymi 2 opcjami w opcji Formatuj komórki/datę), wówczas data zmieni się na lokalne formatowanie daty użytkownika. Podstawową komórką jest jednak nadal numer dateserial, który powinien być użyteczny niezależnie od formatu. Jeśli chcesz wpisać daty w polu tekstowym lub przekonwertować ciągi na daty, to jest to inna sprawa i wymagana jest dodatkowa obsługa. Zobacz http://stackoverflow.com/questions/12495504/how-to-convert-a-string-into-date/12497237#12497237 – user3357963

+0

@PeterT. W tabeli kolumna dat jest sformatowana jako tekst lub jako daty? – CaBieberach

+0

Utworzony jako Data – PeterT

Odpowiedz

1

Najlepsze, co możesz zrobić, to NIGDY nie przekształcać zmiennej daty w tekst.

Wewnętrznie dla programu Excel data jest po prostu kolejnym numerem (w lewo od separatora dziesiętnego są dni, a od separatora dziesiętnego są to godziny). Na przykład: 10 czerwca 2012 roku, dla programu Excel jest . Ta wartość daty jest niezależna od formatu daty ustawionego na komputerze.

Teraz, gdy chodzi o reprezentowanie dat (dla ludzi do wizualizacji), Excel sformatuje tę wewnętrzną wartość w Ciąg o formacie ustawionym na komputerze. Tak więc, na przykład, jeśli masz amerykański format daty na swoim komputerze, data 41188 zostanie sformatowana jako 6/10/2012.

Wielkim wyzwaniem związanym z datami jest wpisanie daty we właściwym formacie.Po wprowadzeniu daty jako ciągu znaków ("6/10/2012") program Excel zinterpretuje ją w zależności od formatu daty ustawionego na komputerze. Jeśli masz format US, to pokaże pierwszy kod jako miesiąc, drugi jako dzień, a ostatni jako rok. Jeśli masz format niemiecki, będzie on czytał pierwszy jako dzień, następny jako miesiąc i ostatni jako rok. Tak więc to samo wejście ("6/10/2012") dla formatu US Format Excel będzie odczytywane 10 czerwca, ponieważ dla formatu niemieckiego program Excel będzie czytał 6 października.

W twoim przypadku NIE powinieneś formatować daty wewnątrz pola tekstowego10. W przypadku formatu US Excel nie ma problemu, ale jeśli masz inny format daty, w którym pierwsza cyfra jest dniem zamiast miesiąca, otrzymasz nieprawidłowe wartości: Sprawdź ten przykład. dane wprowadzane przez użytkownika 10 czerwca w formacie Excel niemiecki (dd.mm.rrrr)

  1. Calendar1.Value pobiera wartość daty()
  2. Format(Calendar1.Value, "mm/dd/yyyy") przekształca wartość daty na ciąg znaków „06/10/2012 "
  3. Podczas używania daty sformatowanej (STRING) program Excel będzie musiał interpretować datę. Ponieważ format daty komputera jest niemiecki, będzie czytać Dzień: 06, Miesiąc: 10, Rok: 2012. będzie używana dni zamiast

Jeśli Calendar1.Value pobiera zmienną Data i podać tę datę zmiennej w kolumnie Data sformatowany, będziesz zawsze dobrze się prawidłowe dale w kolumnie i będziesz potrafi poprawnie filtrować i sortować daty, niezależnie od formatu daty ustawionego w komórkach kolumny lub formatu ustawionego na komputerze użytkownika.


Teraz, w przypadku najlepiej byłoby przypisać bezpośrednio do Calendar1.Value do żądanej komórce. Coś jak:

ThisworkBook.WorkSheets("Sheet1").Range("C3").Value= Calendar1.Value 

nadal można asign Calendar1.Value do TextBox10 dla użytkownika, aby zobaczyć jego wybór, ale wyłączyć TextBox10 tak, że jedynym rozwiązaniem jest kontrola edycja kalendarza. A kiedy pracujesz z datą, to istwe wyskakuje to z TextBox10, biorąc to bezpośrednio od Calendar1.Value.

Jeśli nadal chcesz wyświetlić wybraną wartość z kalendarza 1 w polu tekstowym, NIE formatuj daty w polu tekstowym. Zamiast tego, zastosowanie:

UserForm1.TextBox10.Value = Cstr(Calendar1.Value) 

W ten sposób użytkownik będzie zobaczyć datę w DATEFORMAT że został ustawiony w swoim komputerze i do którego jest przyzwyczajony.

+0

Dziękuję bardzo. Tego rodzaju odpowiedzi szukałem. – PeterT

0

Jednym z rozwiązań jest, aby nie używać formatu liczb data ale raczej używać tylko formatu niestandardowego dla wszystkich swoich dat komórkowych gdzie można określić "mm/dd/yyyy" jako ciąg formatowania. Jednak z mojego doświadczenia wynika, że ​​jeśli ustawienia regionalne twojego komputera są ustawione na użycie "mm/dd/yyyy", to jeśli spróbujesz utworzyć niestandardowe formatowanie komórek z tym samym ciągiem znaków, pozostaniesz jako dawca połączony z ustawieniami komputera, więc to nie pomoże. Sposób, w jaki to robiłem, polegał na zmianie formatu daty na moim komputerze, a następnie sformatowaniu komórek jako niestandardowych "mm/dd/rrrr" i zapisaniu (a następnie zmianie ustawień komputera z powrotem do ich wyglądu). Teraz, mimo że program Excel wciąż twierdzi, że są komórkami daty, zobaczysz, że zmiana ustawień na komputerze nie zmienia wartości w komórce.

Innym sposobem jest zawsze mieć komórkę obok komórki daty, która wywołuje funkcję TEKST. Więc jeśli masz datę w A1, to w innej komórce =TEXT(A1, "mm/dd/yyyy") i odnosisz się tylko do tej nowej komórki. Ale to może bardzo zabrudzić twój arkusz kalkulacyjny.

Domyślam się, że najlepszym rozwiązaniem jest uzyskanie działu IT, aby ustawić każdy w ustawieniach daty firmy na używanie tych samych formatów.

+0

Dan, dziękuję za odpowiedź. Chodzi o to, że zmiana formatu komórki na niestandardową spowodowałaby wadliwe działanie innego makra, które jest używane do obliczania metryk, osi obrotu itd. To makro wymaga ustawienia formatu komórki na datę. To makro odbywa się na innej stronie.Ponadto cały plik jest zdalnie aktualizowany słabo bazowo przez program, który ustawia komórki w stanach domyślnych (ustawione przez program). Jeśli nic nie pomoże, myślę, że będę musiał skontaktować się z działem IT, o czym wspomniałeś. Ale szczerze mówiąc, chciałbym uniknąć tego scenariusza. – PeterT

+0

Podsumowując, nie mogę zmieniać tabeli (dodawać/usuwać kolumn/wierszy, zmieniać formatu itp.). Mogę tylko zmienić kod VBA, który zapisuje dane w tabeli. – PeterT

+0

co z tego: UserForm1.TextBox10.Value = Worksheetfunction.Text (Calendar1.Value, "mm/dd/yyyy") – Dan