2011-08-02 13 views
6

Niektóre tła: Dla projektu, nad którym pracuję (tworzenie XML DOM z arkusza kalkulacyjnego Excela danych klienta), muszę mieć możliwość odczytania zawartości komórka z datetime w nim. Ta komórka zawiera "7/22/2011 0:00", a kiedy kliknę prawym przyciskiem myszy-> formatuj komórki, oznacza to, że kategoria jest "Niestandardowa" (nie w standardowej kategorii daty), a typ "m"/d/rrrr h: mm. " Jednak po wybraniu komórki okienko formuły wyświetla ją jako "27.02.2011 12:00:00." Więc wszystkie trzy próby kategoryzacji typów danych nie pasują do siebie.Problem z odczytaniem komórek Excel zawierających datetime w języku VBA

problem: Kiedy wyświetla zawartość komórek za pomocą ActiveWorkbook.ActiveSheet.Cells (x, y) w MsgBox dla celów diagnostycznych, tylko wykazuje 22.07.2011 (odcięcie czasu). Nie może to być przerwa między datą i godziną, która je wyrzuca, ponieważ z powodzeniem czytam komórki z spacji w nich w innym miejscu arkusza kalkulacyjnego.

Czy ktoś może mi powiedzieć, dlaczego tak się dzieje, lub wskazać mi właściwą drogę dla metody VBA/Excel, która nie robi tej dziwnej rzeczy, którą robi Sheet.Cells (x, y)? Dzięki. Gdybym tylko miał grosza za każdym razem datatypes datetime powodował problemy dla mnie ..

+1

Może występować różnica między wartością komórki a tym, co jest wyświetlane. Jeśli wartość komórki została wprowadzona jako tylko 27.02.2011 (bez komponentu czasu), ale komórka jest sformatowana tak, aby pokazywała czas, to miałoby to sens. W scenariuszu skrzynki wiadomości nie robisz żadnego formatowania, a jedynie patrzysz na "surową" wartość, więc dostajesz właśnie datę ... Jeśli chcesz wyświetlić wyświetloną wartość, użyj ActiveSheet.Cells (x, y) .Text –

Odpowiedz

11

Wewnętrznie Excel przechowuje daty jako liczby. Nie implementuje typu daty. Liczba jest liczbą dni od pewnego momentu w przeszłości (1900 lub 1904, w zależności od systemu operacyjnego, z pewnymi błędami w odniesieniu do lat przestępnych). Czas jest reprezentowany jako ułamkowa część liczby.

Aby wyglądać jak data dla użytkownika, należy przypisać komórce format daty. Następnie liczba jest wyświetlana jako data w komórce. (Excel przypisuje format daty automatycznie jeśli wpiszesz latków że wygląda terminie do programu Excel.)

Podczas korzystania ActiveWorkbook.ActiveSheet.Cells(x,y) można utworzyć Range obiekt i wywołać jej domyślną właściwość, która jest Value. Value ma wiele wbudowanych magii. W twoim przypadku sprawdza on format komórki i - widząc format daty - przekształca wewnętrznie zapisaną liczbę w datę podtypu na Variant. Po wyświetleniu go za pomocą okna komunikatu następuje kolejna sztuczka. Jeśli czas jest 0:00, data jest konwertowana na ciąg bez czasu. Jeśli czas był inny niż 0:00, byłby konwertowany na ciąg znaków z datą i godziną. Format daty jest pobierany z ustawień użytkownika. Jest niezależny od formatu daty przypisanego do komórki Excel.

Jeśli używasz Value2 zamiast Value (np za pomocą pola Wiadom wyświetlać ActiveWorkbook.ActiveSheet.Cells(x,y).Value2), wtedy zobaczysz wewnętrzną reprezentację daty, a mianowicie liczby.

Podczas edycji komórki program Excel używa jeszcze innego formatu daty, aby można było wyświetlić i edytować wszystkie części daty: rok, miesiąc, dzień i ewentualnie godzinę, minuty i sekundy. Dzieje się tak dlatego, że format daty komórki może być ograniczony tylko do nazwy miesiąca.

Kolejna złożoność jest dodana przez internacjonalizację. Niektóre formaty dat nie są stosowane bezpośrednio, ale stanowią wskazówkę do używania formatu daty z ustawień bieżącego użytkownika.Dlatego format jest najpierw zastępowany innym formatem daty, a następnie stosowany. Ponadto niektóre części formatu daty i czasu zależą od ustawień użytkownika. I wreszcie, wzory formatu daty są tłumaczone (po angielsku, yyyy oznacza rok, po niemiecku jjjj). Gdy arkusz kalkulacyjny programu Excel jest zapisywany, formaty te są przechowywane w formularzu angielskim, aby umożliwić otwarcie arkusza przez instalacje użytkownika i programu Excel w dowolnym języku. W twoim przypadku internacjonalizacja prawdopodobnie wpływa na format daty używany podczas edycji komórki (wstawianie miesiąca przed dniem i używanie 12-godzinnego wyświetlacza z AM/PM wygląda jak Ameryka Północna).

Nie do końca rozumiem, dlaczego program Excel wyświetla "7/22/2011 12:00:00" (zamiast "7/22/2011 0:00:00 AM"). Jestem pewien, że twoja data/czas ma część czasu "0:00". Ale wewnętrzny numer (jak ujawnia Value2) powie Ci na pewno.

+1

+ 1 dla jasnego wyjaśnienia. –

+0

Świetne wyjaśnienie i dokładnie to, czego szukałem, przetestowałem to, wprowadzając inną datetime z komponentem czasu i skończyło się na wyświetleniu dobrze, więc nie było problemu po wszystkim haha. Po prostu skracał czas północy, ponieważ przypuszczam, że to zera. Dzięki! –

3

To jak formuła, w komórce wyświetli wynik, na pasku formuły pokaże formułę. Komórka, którą możesz sformatować, pasek formuły, którego nie możesz. Możesz zmienić format komórki tak, jak chcesz.

Tak więc, jeśli chcesz sformatować msgbox wtedy trzeba wykonać następujące czynności:

MsgBox (Format(ActiveWorkbook.ActiveSheet.Cells(x,y), "m/d/yyyy h:mm") 
Powiązane problemy