Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

[Excel] vba a xml - pytań kilka

Idź do strony 1, 2, 3  Następny

 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Oprogramowanie biurowe
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Buks



Dołączył: 28 Maj 2008
Posty: 45

PostWysłany: Czw Maj 07, 2009 8:48 pm      Temat postu: [Excel] vba a xml - pytań kilka Odpowiedz z cytatem Pisownia

Nigdy jeszcze nie "bawiłem" się z korzystania plików xml'owych podczas programowania, z programowaniem w vba także mam niewielkie doświadczenie... w każdym razie muszę najpierw na podstawie danych z pliku xml'owego coś ustalić, i na podstawie tych ustaleń zmienić kilka zawartych w nich wartości. Do excel'a da sie importować pliki xml'owe, ale hmm jest kłopot z ich późniejszym exportem... Ten plik który mam jest rozbudowany, a obsługa xml'a w excelu jest chyba zrobiona dosyć pobieżnie. Czy jest w ogóle sens z bawieniem się w pośredniczenie excela? Czy da się zaimportować plik, zmienić interesujące nas dane i wyeksportowanie z powrotem pliku xml, tak aby różnił się od tego pierwotnego tylko zmienionymi danymi?

Jaki algorytm polecacie w wyszukiwaniu danych w pliku xml, przy założeniu, że w pliku jest wiele elementów o takich samych nazwach (dla przykładu paczka zamówień, w paczce wiele zamówień, które dzielą się na podzamówienia konkretnych produktów, zmieniana ma być prowizja od sprzedaży tych produktów).

Sam osobiście myślałem nad czymś takim:

Po kolei wczytuję po linii i szukam początku całego zamówienia np. <zamówienie>
Następnie szukam lini z numerem zamówienia i sprawdzam czy jest to, to które mnie interesuje.
Dalej szukam (przykładowo) linii z polem <produkt> </produkt>, dalej pola z prowizją. Podczas natrafienia na znacznik </zamowienie> wychodzę z powyższych pętli i zaczynam szukać od nowa aż do EOF

Czy coś takiego ma sens? Znacie lepsze sposoby?

Jak sobie poradzić z wyłuskiwaniem informacji spomiędzy znaczników? Obcinać z prawej i lewej strony znaczniki (np funkcjami excelowymi right i left)??

_________________
Sport, muzyka. sprzęt komputerowy i audio, IT
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
karolinavb
Site Admin


Dołączył: 25 Maj 2005
Posty: 7270

PostWysłany: Pią Maj 08, 2009 11:10 am      Temat postu: Odpowiedz z cytatem Pisownia

Proszę załączyć xml.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Buks



Dołączył: 28 Maj 2008
Posty: 45

PostWysłany: Pią Maj 08, 2009 5:41 pm      Temat postu: Odpowiedz z cytatem Pisownia

Mogę załączyć jedynie plik tekstowy, w którym jednakże myślę, że zobrazowałem najważniejsze aspekty tego pliku xml'owego. Oryginału zamieścić nie mogę - dane osobowe (bardzo obszerny, ich wykasowanie zajęłoby mi mnóstwo czasu).

Mam jeszcze pytanie dotyczące funkcji

getopenfilename()

Mam coś takiego:
Kod:

filtr = "Pliki arkusza kalkulcyjnego Excel (*.xls),*.xls" & _
"Pliki tekstowe (*.txt),*.txt," & _
"Pliki arkusza kalkulacyjnego firmy Lotus (*.prn),*.prn," & _
"Pliki używające przecinka jako separatora (*.csv),*.csv," & _
"Pliki ASCII (*.asc),*.asc," & _
"Wszystkie pliki (*.*),*.*"


pliki = Application.GetOpenFilename(FileFilter:=filtr, FilterIndex:=1, Title:="wybierz wszystkie pliki z paczki", MultiSelect:=True)



I mi nie działa. Co konkretnie oznacza filterindex? Co tam powinien wstawić? Czy jest możliwość filtrowania pokazywanych plików nie tylko po rozszerzeniu, ale także po nazwie? Jeżeli tak, to w jaki sposób napisać taki filtr?



1.txt
 Opis:

Pobierz
 Nazwa pliku:  1.txt
 Wielkość pliku:  2.37 KB
 Pobierano:  65 raz(y)


_________________
Sport, muzyka. sprzęt komputerowy i audio, IT
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
losmac



Dołączył: 25 Maj 2005
Posty: 1551
Skąd: Białystok

PostWysłany: Pią Maj 08, 2009 6:20 pm      Temat postu: Odpowiedz z cytatem Pisownia

Buks napisał:
Mam jeszcze pytanie dotyczące funkcji

getopenfilename()

Mam coś takiego:

filtr = "Pliki arkusza kalkulcyjnego Excel (*.xls),*.xls" & _
"Pliki tekstowe (*.txt),*.txt," & _
"Pliki arkusza kalkulacyjnego firmy Lotus (*.prn),*.prn," & _
"Pliki używające przecinka jako separatora (*.csv),*.csv," & _
"Pliki ASCII (*.asc),*.asc," & _
"Wszystkie pliki (*.*),*.*"


pliki = Application.GetOpenFilename(FileFilter:=filtr, FilterIndex:=1, Title:="wybierz wszystkie pliki z paczki", MultiSelect:=True)


I mi nie działa. Co konkretnie oznacza filterindex? Co tam powinien wstawić? Czy jest możliwość filtrowania pokazywanych plików nie tylko po rozszerzeniu, ale także po nazwie? Jeżeli tak, to w jaki sposób napisać taki filtr?


Ale co nie działa???
Filterindex oznacza, domyślny typ rozszerzenia, który będzie poszukiwany przez okno dialogowe "Otwórz..."
Co masz na myśli pisząc o filtrze wg nazwy? Może chodzi Ci o wylistowanie plików z konkretnego katalogu...

_________________
książka o VBA dla Office'a
źródło wiedzy o programowaniu w VBA
UWAGA! Nie odpowiadam na PW, jeżeli wcześniej nie zostało to ze mną ustalone w ramach konkretnego wątku!
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
Buks



Dołączył: 28 Maj 2008
Posty: 45

PostWysłany: Pią Maj 08, 2009 6:52 pm      Temat postu: Odpowiedz z cytatem Pisownia

No nie działa, to znaczy wywala mi błąd podczas próby uruchomienia kodu.

Jeżeli chodzi o filtrowanie po nazwach... to np. nazwy plików, które będa wczytywane mają odgórnie ustalany format nazw:

nazwaPaczki_numerPaczki_coto.xml

np. produkty2008_00255_BB.xml
produkty2008_00256_BB.xml itd.

"NazwaPaczki" jest wartością stałą, od "coto" zależą konkretnie podejmowane działania, zmienia się generalnie tylko numer.

czyli n logikę taki filtr mógłby wyglądać tak:

"Pliki arkusza kalkulcyjnego Excel (*.xls),produkty2008*BB.xls"

Niestety nie działa (w każdym razie u mnie).

Chciałbym coś takiego zrobić co by użytkownicy nie wybierali sobie innych plików i tym samym co bym ja nie musiał pisać rozbudowanego kodu sprawdzającego poprawność struktury plików (nikt o zdrowych zmysłach nie nada takiej nazwy plikowi, a te pliki, które użytkownik będzie dostawał będą generowane automatycznie przez jakąś aplikację).

_________________
Sport, muzyka. sprzęt komputerowy i audio, IT
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
OShon



Dołączył: 28 Lis 2006
Posty: 1681
Skąd: VBATools.pl

PostWysłany: Pią Maj 08, 2009 9:03 pm      Temat postu: Odpowiedz z cytatem Pisownia

Oto kod z uzupełnionym komentarzem: może otworzy ci troszkę oczy
Kod:
Private Sub Wskarz_Click()
    Dim Filt As String
    Dim FilterIndex As Integer
    Dim FileName As Variant
    Dim Title As String
    
'   Zdefiniowanie listy filtrów plików
    Filt = "Pliki arkusza kalkulacyjnego Excel (*.xls),*.xls," & _
            "Pliki tekstowe (*.txt),*.txt,"
          
'   Domyślnie wyświetlany jest filtr *.*
    FilterIndex = 1
'   Zdefiniowanie tytułu okna dialogowego
    Title = "Wybierz plik do zaimportowania"
'   Pobranie nazwy pliku
    FileName = Application.GetOpenFilename( _
        FileFilter:=Filt, _
        FilterIndex:=FilterIndex, _
         Title:=Title)
'   Zakończenie pracy, jeśli w oknie dialogowym zostanie
'   kliknięty przycisk Anuluj
    If FileName = False Then
        MsgBox "Nie wybrano żadnego pliku."
        Exit Sub
    End If
'   Wyświetlenie pełnej ścieżki i nazwy pliku
    MsgBox FileName
End Sub


Jeśli chodzi o filtrowanie to nie metodą GetOpenFilename.
Najlepiej pobrać wartości plików do kontrolki (np listview), z której wskażesz interesujący cie plik.
Poniższy kod pozwoli ci to zrealizować.
Kod:
Sub czytaj_pliki_katalogu_zaczynajace_sie_na_lit_A()
Dim pliki As String
Dim Buf As String
Buf = Dir("C:\Moje dokumenty\*.xls")
With Application
      .DisplayStatusBar = True
      .ScreenUpdating = False
Do While Len(Buf)
   If Buf Like "A*.xls" Then pliki = pliki + Buf & vbCr
Buf = Dir
Loop
   .StatusBar = False
   .ScreenUpdating = True
End With
MsgBox pliki
End Sub

Inna metoda to po prostu po wyświetleniu klików metodą GetOpenFilename jest ręczne wpisanie A*.xls

Sprawa dotycząca XMLa i wyszukania informacji.
Najlepiej użyć gotowej kontrolki Phaser MSXML*.dll
poczytaj o tym w internecie.
Dobrze jest to esportować do TreeView. Można tak ją ustawić aby w niej modyfikować z wizualizowane dane a następnie już metodą exportu do txt wysłać zmodyfikowane dane.
Zachęcam dlatego że nie popełnisz błędu w łańcuchach.
Oczywiście jeśli nie musisz pokazywać danych ale tylko zmodyfikować wartość (marży czy czego tam chciałeś) to wystarczy zwykła pętelka i parę iffów, bez jakichkolwiek kontrolek.

_________________
MVP Office system, MCC, Moderator Outlook.pl | Excelforum.pl | WSS.pl | CodeGuru.pl | MSDN dz VBA
Business Developer Veracomp SA, Dodatki do Office VBATools
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora
Buks



Dołączył: 28 Maj 2008
Posty: 45

PostWysłany: Sob Maj 09, 2009 10:05 am      Temat postu: Odpowiedz z cytatem Pisownia

Zrezygnowałem tymczasowo z tego filtru.
_________________
Sport, muzyka. sprzęt komputerowy i audio, IT
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
OShon



Dołączył: 28 Lis 2006
Posty: 1681
Skąd: VBATools.pl

PostWysłany: Sob Maj 09, 2009 1:03 pm      Temat postu: Odpowiedz z cytatem Pisownia

Eno nie poddawaj sie.
To naprawde fajny temat.
Opanowanie odczytu i obróbki XMLa to wstęp do komunikacji wszelkiego rodzaju wtyczek.

Generalnie polecam.

_________________
MVP Office system, MCC, Moderator Outlook.pl | Excelforum.pl | WSS.pl | CodeGuru.pl | MSDN dz VBA
Business Developer Veracomp SA, Dodatki do Office VBATools
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora
Buks



Dołączył: 28 Maj 2008
Posty: 45

PostWysłany: Sob Maj 09, 2009 1:21 pm      Temat postu: Odpowiedz z cytatem Pisownia

Generalnie poprzedni post byłby łuższy, ale miałem problemy z prądem oraz internetem (nie mogłem przez kilka godzin dodać postu)

Nie poddałem się z edycją pliku xml'owego, tylko odłożyłem na kiedy indziej (albo i na zawsze) próbę stworzenia okienka, w którym widzialne byłyby tylko pliki o danym rozszerzeniu i nazwie.

Dodane przez moderatora (łączenie postów)

Znalazłem kod dotyczący funkcji win api getopenfilename, w którym dało się taki filtr utworzyć jaki chciałem, tyle że funkca zwracała wartość bool (bodajże czy udało się dany plik otworzyć). Ja jako osoba mająca wcześniej styczności z bibliotekami win api nie rozumiałem całego kodu. Był tam również kod odpowiedzialny za zwrócenie nazwy, ale jako string, a nie variant bądź tablica - toteż po wybraniu kilku plików nic się w tej zmiennej nie zapisywało. Dodatkowo kod tego programu miałem... już nie mam ponieważ podczas awarii prądu straciłem go, a teraz nie chce mi się już tracić czasu na ponowne szukanie go w sieci.

EDIT: nie wiem dlaczego ale nie mogę dodawać postów dłuższych niż kilkadziesiąt wyrazów :/ - za każdym razem wyskakuje mi okienko "zapisz plik *php jako"

Dodane przez moderatora (łączenie postów)

Niemniej mam kolejne pytanie w jaki sposób otworzyć nowy dokument word'woski za pomoca vba dla excela? W jaki sposób można manipulować obiektami worda? Chcę zrobić tabelkę z częścią danych z tego pliku xml'owego. A może lepiej byłoby to napisać w VBA dla MS word?


Proszę moderatora o złączenie moich ostatnich postów.

_________________
Sport, muzyka. sprzęt komputerowy i audio, IT
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
OShon



Dołączył: 28 Lis 2006
Posty: 1681
Skąd: VBATools.pl

PostWysłany: Sob Maj 09, 2009 3:35 pm      Temat postu: Odpowiedz z cytatem Pisownia

Generalnie łatwiej poruszacc sie po obiektach w Excelu.
Oczywiscie ważny jest cel. Jeśli chcesz prezentowac dane, to Word jest ok. Weź tylko poprawkę na to iż późniejsza obróbka danych na plikach Wordowskich będzie sporym wyzwaniem (zwłaszcza w kwestii wizualizacji takich ramek)

_________________
MVP Office system, MCC, Moderator Outlook.pl | Excelforum.pl | WSS.pl | CodeGuru.pl | MSDN dz VBA
Business Developer Veracomp SA, Dodatki do Office VBATools
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Oprogramowanie biurowe Wszystkie czasy w strefie CET (Europa)
Idź do strony 1, 2, 3  Następny
Strona 1 z 3

 
Skocz do:  
Możesz pisać nowe tematy
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
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.34533 sekund, zapytan = 13
contact

| Darmowe programy i porady Jelcyna | VB4all | Tansze zakupy w Helionie | MS Office Blog |