Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 64382 Skopiuj do schowka Automatyczne sprawdzanie formatu daty
Autor Wiadomość
marcin93 
forumowicz


Wersja: Win Office 365
Posty: 13
Wysłany: 10-03-2019, 20:03   Automatyczne sprawdzanie formatu daty

Witam wszystkich!
Proszę o pomoc w zadaniu z którym kompletnie sobie nie radzę. Przeszukałem już wszystkie możliwe fora i niestety nigdzie nie mogę znaleźć pomocy :( Zadanie które muszę wykonać polega na tym, że w Excelu po uruchomieniu programu wybieram plik w którym są zapisane daty, następnie program automatycznie musi ustalić w jakim formacie zapisana jest data("dd.mm.rrrr" itp itd)
Dodam że jestem totalnie zielony w vba i jak dotąd udało mi się napisać jedynie kod który pobiera dane z pliku txt:
Kod:
Sub zadanie()

Dim myfile As String, textData As String, textRow As String, fileNo As Integer, x As Double
myfile = Application.GetOpenFilename()
fileNo = FreeFile

textRow = 1
Open myfile For Input As #fileNo
Do While Not EOF(fileNo)
Line Input #fileNo, textData
Cells(textRow, 1) = textData
textRow = textRow + 1
Loop
Close #fileNo
End Sub


Błagam was o pomoc! Z góry dziękuję wszystkim :)

Edit: dm
Proszę stosować znaczniki [code] przy wstawianiu kodów makr, kwerend i formuł, Regulamin 3.1


vba.PNG
Plik ściągnięto 329 raz(y) 11 KB

  
ID posta: 363928 Skopiuj do schowka
 
 
Marecki 
Excel Expert



Wersja: Win Office 2019
Pomógł: 2084 razy
Posty: 6880
Wysłany: 10-03-2019, 23:05   

W tym zadaniu raczej nie chodzi o ustalenie formatu daty tylko o ustalenie pozycji dnia miesiąc i roku.
Na format daty składają się 3 w/w części plus separator, który u Ciebie zawsze jest ukosnikiem.
Podstawowe pytanie czy daty są zapisane zawsze w formacie polskim, bo jak nie to będzie problem.
Czytaj:
W Stanach Zjednoczonych obowiązuje zapis daty w formacie miesiąc/dzień/rok. Gdy zapisze się 3 czerwca 2009 roku w postaci 03.06.2009, nasza data może być odczytana tam jako 6 marca 2009 roku.
W Polsce jest dzień miesiąc i rok choć czasami może być odwrotnie rok miesiąc i dzień.
Jeśli daty są polskie to ustalenie pozycji to pikuś.
Więc jak jest z tymi datami?
_________________
Hardware - ta część komputera, którą można kopnąć kiedy software przestanie funkcjonować.

Szkolenia z Excela , FB
Office 2019 Professional Plus , Windows 10 x64
Pozdrawiam, były mkkk23 teraz Marecki.
  
ID posta: 363936 Skopiuj do schowka
 
 
ąćęłńóś
ExcelSpec


Pomógł: 186 razy
Posty: 843
Wysłany: 11-03-2019, 00:13   

marcin93 napisał/a:
ustalić w jakim formacie zapisana jest data

Jeśli robisz to w Macu, zgodnie z fiszką wersji, to i tak "popularne" rozwiązania na PCeta mogą nie działać ... separatory dat, przestankowe, obsługa systemu katalogów, itd., tam wszystko jest jakieś takie ... inne ... albo nie działa ...
  
ID posta: 363939 Skopiuj do schowka
 
 
marcin93 
forumowicz


Wersja: Win Office 365
Posty: 13
Wysłany: 11-03-2019, 07:56   

Marecki napisał/a:

W Polsce jest dzień miesiąc i rok choć czasami może być odwrotnie rok miesiąc i dzień.
Jeśli daty są polskie to ustalenie pozycji to pikuś.
Więc jak jest z tymi datami?


Daty są polskie. Poprawiłem screena, ponieważ błędnie wstawiłem tam "/". Chyba masz racje, tutaj chodzi o ustalenie pozycji, tzn dd.mm.rrrr lub rrrr.mm.dd. Problem pojawia się niestety przy pobieraniu danych, ponieważ excel automatycznie ustawia datę na dd.mm.rrrr :-(

excel.PNG
Plik ściągnięto 307 raz(y) 5.66 KB

ID posta: 363943 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 2016
Pomógł: 1230 razy
Posty: 4214
Wysłany: 11-03-2019, 11:16   

Jeśli daty są w takim formacie, że Excel rozpoznaje je jako daty, to po wczytaniu tych danych, format komórek zmieni się automatycznie na format daty, a ten można odczytać z komórki odczytując właściwość NumberFormatLocal, np.
Kod:
Range("B1") = Range("A1").NumberFormatLocal
ID posta: 363955 Skopiuj do schowka
 
 
marcin93 
forumowicz


Wersja: Win Office 365
Posty: 13
Wysłany: 11-03-2019, 21:01   

Dzięki za pomoc, jak ten kod "wkleić" do mojego programu? Przyznam się że nie bardzo to rozumiem :/ Czy w takim razie jeżeli Excel wszędzie wstawi mi format daty taki jaki jest domyślnie ustawiony w systemie, to kod który wkleiłeś również wszędzie wyświetli mi np dd.mm.rrrr?
ID posta: 363972 Skopiuj do schowka
 
 
Marecki 
Excel Expert



Wersja: Win Office 2019
Pomógł: 2084 razy
Posty: 6880
Wysłany: 11-03-2019, 21:06   

Skoro importujesz dane do arkusza za pomocą metody Open file for, to już tam wklej sprawdzenie czy data - w tym przypadku string zaczyna sie
się od roku(czyli czterema cyframi) czy od dnia.
W sprawdzeniu pomoże Ci operator like lub wyrażenia regularne.
Jak już będziesz to wiedział, to wystarczy tylko wyłuskać z takiego stringu znak seperatora i już będziesz wszystko wiedział - czyli jaki format ma data w txt.
_________________
Hardware - ta część komputera, którą można kopnąć kiedy software przestanie funkcjonować.

Szkolenia z Excela , FB
Office 2019 Professional Plus , Windows 10 x64
Pozdrawiam, były mkkk23 teraz Marecki.
ID posta: 363973 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 2016
Pomógł: 1230 razy
Posty: 4214
Wysłany: 12-03-2019, 09:42   

marcin93 napisał/a:
Czy w takim razie jeżeli Excel wszędzie wstawi mi format daty taki jaki jest domyślnie ustawiony w systemie, to kod który wkleiłeś również wszędzie wyświetli mi np dd.mm.rrrr?
Jeżeli taki masz format daty w systemie i Excel rozpozna wprowadzone dane jako datę, to tak. Jeśli nie rozpozna, to format pozostanie taki jak był, czyli prawdopodobnie Ogólny.
A jeśli zależy Ci na określeniu postaci danych, niezależnie od tego, czy będą rozpoznane jako data, to wykorzystaj propozycję Mareckiego.
ID posta: 363992 Skopiuj do schowka
 
 
marcin93 
forumowicz


Wersja: Win Office 365
Posty: 13
Wysłany: 12-03-2019, 19:48   

Niestety kompletnie sobie z tym nie radzę. Udało mi się dopisać taką linijkę:
Kod:
ActiveSheet.Cells.NumberFormat = "General"

Myślałem, że wtedy każda data wklei się w formacie w którym została zapisana w pliku txt, niestety tak się nie stało. Marecki Twój pomysł wydaje się być dokładnie tym o co chodzi, czy mógłbyś pomóc mi napisać chociaż kawałek kodu? Czytam fora i niestety nic z tego nie rozumiem :/ Byłbym bardzo wdzięczny za pomoc.
ID posta: 364060 Skopiuj do schowka
 
 
Marecki 
Excel Expert



Wersja: Win Office 2019
Pomógł: 2084 razy
Posty: 6880
Wysłany: 13-03-2019, 13:31   

Zobacz tak czy się sprawdzi ?
Kod:
Sub zadanie()

    Dim myfile         As String
    Dim textData       As String
    Dim op             As String
    Dim textRow        As Long
    Dim fileNo         As Long

    myfile = Application.GetOpenFilename()
    fileNo = FreeFile
   
    Open myfile For Input As #fileNo
    Do While Not EOF(fileNo)
        Line Input #fileNo, textData
        textRow = textRow + 1
        If textData Like "[0-9][0-9][0-9][0-9]?[0-9][0-9]?[0-9][0-9]" Then
            op = VBA.Mid$(textData, 5, 1)
            Cells(textRow, 1) = "'" & textData
            Cells(textRow, 2) = "rrrr" & op & "mm" & op & "dd"
        ElseIf textData Like "[0-9][0-9]?[0-9][0-9]?[0-9][0-9][0-9][0-9]" Then
            op = VBA.Mid$(textData, 3, 1)
            Cells(textRow, 1) = "'" & textData
            Cells(textRow, 2) = "dd" & op & "mm" & op & "rrrr"
        Else
            Cells(textRow, 1) = "'" & textData
            Cells(textRow, 2) = "Format nierozpoznany"
        End If
       
    Loop
    Close #fileNo
End Sub
_________________
Hardware - ta część komputera, którą można kopnąć kiedy software przestanie funkcjonować.

Szkolenia z Excela , FB
Office 2019 Professional Plus , Windows 10 x64
Pozdrawiam, były mkkk23 teraz Marecki.
ID posta: 364115 Skopiuj do schowka
 
 
marcin93 
forumowicz


Wersja: Win Office 365
Posty: 13
Wysłany: 13-03-2019, 16:27   

Dokładnie o to chodziło, działa idealnie! Nie wiem jak Ci dziękować, uratowałeś mi życie :-D Dziękuje bardzo wszystkim za pomoc!
ID posta: 364142 Skopiuj do schowka
 
 
marcin93 
forumowicz


Wersja: Win Office 365
Posty: 13
Wysłany: 16-03-2019, 22:58   

Jednak okazało się że nie o to chodzi :/ Dostałem wiadomość "napisać funkcję, która potrafi podczas
importu danych ustalić jednoznacznie w jakim formacie jest data". Czy jest jakaś prosta funkcja która to sprawdza?
ID posta: 364363 Skopiuj do schowka
 
 
ąćęłńóś
ExcelSpec


Pomógł: 186 razy
Posty: 843
Wysłany: 17-03-2019, 00:00   

marcin93 napisał/a:
1. wybieram plik w którym są zapisane daty
2. automatycznie musi ustalić w jakim formacie zapisana jest data("dd.mm.rrrr" itp itd)

Załącz taki plik (z większą ilością danych), dane nie muszą być prawdziwe ... powinny być odpowiednie

marcin93 napisał/a:
3. Daty są polskie

"polskie" ... tzn. jakie (?) ... z kropkami, myślnikami, ukośnikami ? ... z napisem "made in poland" ? Tyle dat "polskich" ile możliwości ich zapisu, bowiem ludzie tak się trzymają konwenansów, jak utracjusza gotówka ...

marcin93 napisał/a:
4. tutaj chodzi o ustalenie pozycji, tzn dd.mm.rrrr lub rrrr.mm.dd
marcin93 napisał/a:
5. napisać funkcję, która potrafi podczas importu danych ustalić jednoznacznie w jakim formacie jest data

Konia z rzędem temu, który jednoznacznie ustali format daty w takim zapisie:
01/01/01, 03/01/12, 12/01/03, 10/10/2001, 01/12/2014, itd. (dd/mm/rr, rr/dd/mm, mm/dd/rr, mm/dd/rrrr, dd/mm/rrrr)
Czy nawet, biorąc pod uwagę pkt 3. można powiedzieć, że będzie to jednoznaczne, tzn. owa zamiana, znając skłonności excela do zamieniania "wszystkiego na coś tam" według swojskiego excelowego: widzi misię / widzę misie / widzę misię / widzi misie / widzim isie / widzim isię ?

Podaj szczegóły, czy daty w tych plikach będą się trzymać jakichkolwiek reguł, czy chodzi o to, że właśnie nie trzymają się one żadnych reguł i stąd kłopot ?
  
ID posta: 364367 Skopiuj do schowka
 
 
marcin93 
forumowicz


Wersja: Win Office 365
Posty: 13
Wysłany: 17-03-2019, 00:31   

Problem w tym, że te daty nie trzymają się żadnych reguł, tzn wysłałem program wykładowcy i dostałem odpowiedź "Na jakiej podstawie określił pan pierwsza datę d-m-r. Moim zdaniem to format amerykański m-d-r". Pliku z datami tak na prawdę nie ma, po prostu można stworzyć zwykły txt, wpisać tam daty i zaimportować. Jak dla mnie też jest to dziwne, bo nie mam zielonego pojęcia jak rozróżnić format daty tak jak napisałeś np 01/01/01. Polskie, miałem na myśli oczywiście europejski format :-D Czytam właśnie o funkcji XlColumnDataType, czy to może jakoś pomóc? Problemem jest też sam excel, który każdą datę automatycznie zmienia na domyślny format.
ID posta: 364368 Skopiuj do schowka
 
 
ąćęłńóś
ExcelSpec


Pomógł: 186 razy
Posty: 843
Wysłany: 17-03-2019, 01:13   

Czyli wróżenie z fusów i odróżnianie pietruszki od pasternaku ...

Można by spróbować definiować na zasadzie częstości, regularności i przyrostu - jeśli dajmy na to 10 kolejnych dat ma postać: 04/01/01, 05/01/01, 06/01/01 ... 12/01/01, 13/01/01 to domniemywać można na podastawie częstości pojawiania się, że jest to data przyrostowa dni w miesiącu danego roku, najczęściej bowiem taką operujemy, częściej niż przyrostowym rokiem.
Część dat będzie ewidentnie dd/mm/rrrr i jeśli wykluczymy ewentualny "sabotaż", kogoś kto te daty płodził, typu, że w ciągu dat 01/04/2011 do 30/04/2011, data 12/04/2011 to będzie akurat 04 grudnia 2011, to sprawa stanie się łatwiejsza, ale nie jednoznaczna, jeśli jest postawiona w ten sposób ... dowolnie dowolny ... anarchiczny.
ID posta: 364370 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe