Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

VBA odczyt danych z XMLa do stringa lub danej liczbowej

krzysiek1007 31 Sty 2018 17:57 414 9
  • #1 31 Sty 2018 17:57
    krzysiek1007
    Poziom 9  

    Witam
    Mam problem z odczytem danych z XMLa
    Próbuję odczytać energię z pliku XML programem SCADA iFIX który to ma VBA.
    Niestety nie chce mi to działać.
    próbuję używać polecenia "open nazwa_pliku for input as #1"
    niestety ale skrypt mi się wysypuje, wygląda tak jakby cały XML był zapisany w jednej linii.
    czy istnieje możliwość importu tego pliku linia po linii jako sting lub odczytu konkretnej danej w formie liczbowej?
    w zasadzie interesują mnie ze 3 dane z pliku.

    Pozdrawiam
    Krzysiek

    Kod: txt
    Zaloguj się, aby zobaczyć kod

    0 9
  • #2 31 Sty 2018 18:02
    JacekCz
    Poziom 35  

    XML jest ważnym (prawidłowym) plikiem z podziałem na linie lub bez, z ładnym formatowaniem lub brzydkim. Choćby wszystko było w jednej linii.
    Operując z XML używamy pojęć elementu, atrybutu itd a nie linii, wiersza.
    Nalezy je "gryźć" właściwymi narzędziami do XML, dodatkowo zabezpieczają przez znakami specjanymi w danych. Może się to nazywać XML Reader, XML Parser albo podobnie

    0
  • #3 31 Sty 2018 18:55
    krzysiek1007
    Poziom 9  

    Oj kolego pojechałeś ostro, niestety przemiatam już różne skrypty, ale na razie bez efektów. Chyba mnie to trochę przerasta. :-(

    0
  • #4 31 Sty 2018 23:31
    lanzul
    Poziom 23  

    Jaka tam składnia jest, jeśli chodzi o opcje dostępu do plików ?

    Czy jest, np.:
    Line Input #filenumber, varname ?
    Input #filenumber, varlist ?
    LOF(filenumber), EOF(filenumber) ?

    oraz do dzielenia tekstu na części ?

    Split(expression, delimiter, limit, compare) ?
    Mid(string, start, length) ?
    Left(string, length), Right(string, length) ?
    InStr(start, string1, string2, compare), InstrRev(stringcheck, stringmatch, start, compare) ?

    Jeśli są, to powinno się udać ... chyba ... ?

    0
  • #5 01 Lut 2018 04:20
    JacekCz
    Poziom 35  

    lanzul napisał:
    Jaka tam składnia jest, jeśli chodzi o opcje dostępu do plików ?

    Czy jest, np.:
    Line Input #filenumber, varname ?
    Input #filenumber, varlist ?
    LOF(filenumber), EOF(filenumber) ?

    oraz do dzielenia tekstu na części ?

    Split(expression, delimiter, limit, compare) ?
    Mid(string, start, length) ?
    Left(string, length), Right(string, length) ?
    InStr(start, string1, string2, compare), InstrRev(stringcheck, stringmatch, start, compare) ?

    Jeśli są, to powinno się udać ... chyba ... ?


    To nie są środki do sprawnego czytania XML-a.
    Nie wiem jakąś wersję VBA tam masz (i czy to naprawdę jest VBA, po powszechnie na elektrodzie Basici sa mylone)
    Tu masz przykład czegoś w stylu o jakim mówię
    http://www.java2s.com/Code/VBA-Excel-Access-W...XML/RetrievingInformationfromElementNodes.htm

    0
  • #6 01 Lut 2018 13:29
    krzysiek1007
    Poziom 9  

    Kolego jakie referencje musza być podpięte żeby zaczęło działać? Wywala mi błąd "User-defined type not defined"
    Mam zaznaczone Microsoft XML 6.0.

    0
  • #7 01 Lut 2018 16:07
    lanzul
    Poziom 23  

    krzysiek1007 napisał:
    Wywala mi błąd "User-defined type not defined"
    Mam zaznaczone Microsoft XML 6.0.

    Jeśli to odniesienie do www zapodanego przez JacekCz, to masz pewnie dobrą dll zaznaczoną.
    Spróbuj z deklaracji zmiennych "MSXML2.DOMDocument50" i reszty kodu usunąć tę "50"-tkę na końcu, czyli pozostaw "MSXML2.DOMDocument" i sprawdź czy ruszy (możesz też spróbować zmienić to na "60" i sprawdzić zachowanie).
    No i spróbuj zapoznać się z jakąś dokumentacją (jeśli masz do niej dostęp) na temat tego vba w 'SCADA iFIX'.
    W jakim środowisku to 'vba' jest osadzone, bo piszą przy jej opisach, że jest tam również "obsługa .NET, obsługa kontrolek .NET" (?).

    0
  • #8 01 Lut 2018 17:38
    krzysiek1007
    Poziom 9  

    Bez zmian czy bez 50 czy z 60 efekt taki sam.
    Teoretycznie jet to Microsoft Visual Basic 6.3

    0
  • #9 01 Lut 2018 21:51
    lanzul
    Poziom 23  

    "Teoretycznie" ta cyfra na końcu powinna odpowiadać wersji dll, ale widać tylko teoretycznie ...

    0
  • #10 12 Lut 2018 21:53
    krzysiek1007
    Poziom 9  

    Witam wszystkich
    poddałem się z uruchomieniem obróbki XMLa w moim sofcie.
    Obecnie plik XML wygląda następująco

    Cytat:

    <DATA_ARRAYS BRIDGE_TITLE="Aleks" FST_XML_VERSION="1.00" MAX_INDEX="9">
    <DATA_ARRAY FORMAT="Float" INDEX="1" LENGTH="1" NAME="6234180Energia">
    <DATA DATA_AGE="0:00:19:03.000s" OFFSET="0" STATUS="0">42894.0000000000</DATA>
    </DATA_ARRAY>
    <DATA_ARRAY FORMAT="Float" INDEX="2" LENGTH="1" NAME="78544575Energia">
    <DATA DATA_AGE="0:00:19:01.000s" OFFSET="0" STATUS="0">1262.4000000000</DATA>
    </DATA_ARRAY>
    <DATA_ARRAY FORMAT="Float" INDEX="3" LENGTH="1" NAME="78542928Energia">
    <DATA DATA_AGE="0:00:19:01.000s" OFFSET="0" STATUS="0">2093.0000000000</DATA>
    </DATA_ARRAY>
    <DATA_ARRAY FORMAT="Float" INDEX="4" LENGTH="1" NAME="69242267Energia">
    <DATA DATA_AGE="0:00:19:03.000s" OFFSET="0" STATUS="0">304.2500000000</DATA>
    </DATA_ARRAY>
    <DATA_ARRAY FORMAT="Float" INDEX="5" LENGTH="1" NAME="69191730Energia">
    <DATA DATA_AGE="0:00:19:03.000s" OFFSET="0" STATUS="0">270.8000000000</DATA>
    </DATA_ARRAY>
    <DATA_ARRAY FORMAT="Float" INDEX="6" LENGTH="1" NAME="78224478Energia">
    <DATA DATA_AGE="0:00:04:00.000s" OFFSET="0" STATUS="0">6883.2000000000</DATA>
    </DATA_ARRAY>
    <DATA_ARRAY FORMAT="Float" INDEX="7" LENGTH="1" NAME="78008908Energia">
    <DATA DATA_AGE="0:00:19:03.000s" OFFSET="0" STATUS="0">1228.0000000000</DATA>
    </DATA_ARRAY>
    <DATA_ARRAY FORMAT="Float" INDEX="8" LENGTH="1" NAME="6337900Energia">
    <DATA DATA_AGE="0:12:34:03.000s" OFFSET="0" STATUS="0">17993.0000000000</DATA>
    </DATA_ARRAY>
    <DATA_ARRAY FORMAT="Float" INDEX="9" LENGTH="1" NAME="78102136Energia">
    <DATA DATA_AGE="0:00:04:03.000s" OFFSET="0" STATUS="0">73.3800000000</DATA>
    </DATA_ARRAY>
    </DATA_ARRAYS>

    Da się go zaczytać poleceniem tekstowym niestety wszystko ładuję się do jednej linii.
    chciałbym teraz zrobić coś takiego żeby do kolejnych zmiennych typu string przypisywały mi się fragmenty np: >42894.0000000000</DATA>
    >1262.4000000000</DATA> itd oczywiście liczniki pomiędzy znakami > < będą się zmieniały, do tego mają różną ilość znaków
    Jak mógłbym to zrobić

    Edit 1
    Witam temat rozwiązałem już mam w zmiennych licznik1 42894.0000000000, licznik2 1262.4000000000 itd.
    mam teraz problem z konwersją na floata(doubla) próbuję konwertować używając:
    licznik1f = CDbl (licznik1)
    i wywala mi błąd "Run tome erroe '13' Type mismatch" licznik1 zadeklarowany jako string, licznik1f jako double.

    Gdzie popełniam błąd?



    Edit 2
    Witam sprawa rozwiązana chodziło o ustawienia regionalne czyli kropka i przecinek



    Pozdrawiam
    Krzysiek

    0