Forumi


Povratak   PC Ekspert Forum > Računala > Software > Web dizajn, programiranje i ostalo
Ime
Lozinka

Odgovori
 
Uređivanje
Staro 02.09.2016., 10:50   #1
Vuco
Moderator
Moj komp
 
Vuco's Avatar
 
Datum registracije: Dec 2004
Lokacija: Zagreb, Tresnjevka
Postovi: 9,500
Visual studio + excel; korištenje funkcija excela unutar Visual Studia (MATCH)

Pozdrav,

Imam jedan glupi problem unutar Visual Studia 2015 kojeg ne mogu riješiti. Imam Excel tablicu koja se sastoji od 16 redova i dvije kolumne ("tip" i "id").



Unutar Visual Studia 2015 sam generirao kod koji treba uzeti podatke iz tablice i generirati jednostavan XML file.

Ono što me muči jest kako da iskoristim unutar VS-a funkciju MATCH iz Excela ? Puca mi na njemu kod, a ne znam di je problem ?
Uzmite u obzir da ne znam programirati, ali je silom prilika bilo potrebno da sam napišem softver za povezivanje 2 CAD softvera u 2 dana, pa je google radio punom parom i ima svega u kodu (različitih stilova programiranja ).

Error koji dobijem:


Code:
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        Dim excelApp As Application
        Dim wb As _Workbook
        Dim ws As _Worksheet


        ' Postavljanje varijable na My Documents path.
        Dim mydocpath As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)

        ' excel application referenca
        excelApp = New Application
        excelApp.Visible = True
        excelApp.ScreenUpdating = True

        ' Otvaranja excela
        wb = excelApp.Workbooks.Open(Path.Combine(mydocpath, "Book1.xlsx"))

        ' referenca na sheet broj 1
        ws = wb.Worksheets(1)

        'Traženje dimenzija tablice (koliko ima redova i kolumni)
        Dim LastCol As Long
        Dim LastRow As Long
        Dim i As Integer

        LastCol = ws.UsedRange.SpecialCells(XlCellType.xlCellTypeLastCell).Column
        LastRow = ws.UsedRange.SpecialCells(XlCellType.xlCellTypeLastCell).Row


        ' Napiši pocetni tekst u test.XML
        Dim startlines() As String = {"Ovo je početak XML-a",
            "Dalje slijede podaci iz excel tablice",
            ""}

        'Write the beginning fixed string array to a New file named "text.xml".
        Using outputFile As New StreamWriter(mydocpath & Convert.ToString("\test.xml"))
            For Each startline As String In startlines
                outputFile.WriteLine(startline)
            Next
        End Using


        'POČETAK DINAMIČKOG ZAPISIVANJA XML-a iz TABLICE!
        For i = 2 To LastRow
            Dim id As String
            Dim type As String


            'Povezivanje varijabli sa ćelijama u Excelu
            type = ws.Range("A" & i).Value.ToString
            id = ws.Range("B" & i).Value.ToString

            'template sklopova u "test.XML"
            If type = "sklop" Then
                Dim sklops() As String = {
               "<object>",
               "<type=""Sklop"" id=""" & id & """>",
               "  <Name>Sklop" & id & "</Name>",
               " </type>",
               " </object>"}

                'Zapisi sklopve u "test.xml".
                Using fs As StreamWriter = File.AppendText(mydocpath & Convert.ToString("\test.xml"))
                    For Each sklop As String In sklops
                        fs.WriteLine(sklop)
                    Next
                End Using

                Dim jot As Integer
                Dim TrenutniComponent As String
                Dim TrenutniId As String


                Dim brojpartova As Double

                brojpartova = excelApp.WorksheetFunction.Match("sklop", "A3:A16", 0)

                For jot = 1 To brojpartova

                    TrenutniComponent = excelApp.Cells(i + jot, 1).Value
                    TrenutniId = excelApp.Cells(i + jot, 2).Value

                    Dim parts() As String = {
               "<object>",
               "<type=""Part"" id=""" & id & """>",
               "  <Name>Part" & id & "</Name>",
               " </type>",
               " </object>"}

                    'Write additional info to "test.xml".
                    Using fs As StreamWriter = File.AppendText(mydocpath & Convert.ToString("\test.xml"))
                        For Each part As String In parts
                            fs.WriteLine(part)
                        Next
                    End Using
                Next
            End If
        Next
        excelApp.Quit()

    End Sub
MATCH Funkcija mi je dobrodošla i koristim je da mi nađe relativnu poziciju (naprema trenutnoj) sljedećeg sklopa u tablici, a time zapravo dobivam broj partova unutar jednog sklopa. Tehnički nisam mogao naći funkciju koja će mi dati broj istih ćelija za redom osim nje.

Kod nije do kraja napisan (iz razloga što se uvijek traži od A3:A16 MATCH a trebalo bi od Ai pa koliko treba). No ako prođe tu, onda ću znati i za ubuduće.

P.S. Naravno da sam kao prava noobara napravio gumbek koji to sve radi jer onda izgleda kod profesionalno

Sve imate u attachmentu! Book1.xlsx treba biti u My Documents folderu.

Hvala na pomoći i pozdrav


EDIT:
Jesam li ja to krivo koristio input za Range A3:A16 ? Nešto sam sad načačkao i prošlo je, odnosno dobio sam vrijednost ?
Naravno morao sam staviti i excelApp.Match bez WorksheetFunction između.
__________________
"Everything with a heartbeat can knock you down"

Zadnje izmijenjeno od: Vuco. 02.09.2016. u 11:05.
Vuco je offline   Reply With Quote
Staro 04.09.2016., 11:19   #2
rodney
only fool, not a horse
Moj komp
 
rodney's Avatar
 
Datum registracije: Apr 2008
Lokacija: near zgb
Postovi: 1,276
Citiraj:
Autor Vuco Pregled postova
EDIT:
Jesam li ja to krivo koristio input za Range A3:A16 ? Nešto sam sad načačkao i prošlo je, odnosno dobio sam vrijednost ?
Naravno morao sam staviti i excelApp.Match bez WorksheetFunction između.

Pretpostavljam da ide
excelApp.WorksheetFunction.Match("sklop", A3:A16, 0)


I još jedna sitnica, xml ti mora imat root element, i ne smije imati "naslov" ala ovo:
Citiraj:
"Ovo je početak XML-a", "Dalje slijede podaci iz excel tablice", ""
Trebas nešto kao
Code:
<root>
<naslov><\naslov>
<object........

<\root>
__________________
"I intend to live forever. So far, so good."

job security - example
rodney je offline   Reply With Quote
Oglasni prostor
Oglas
 
Oglas
Staro 11.09.2016., 21:43   #3
Vuco
Moderator
Moj komp
 
Vuco's Avatar
 
Datum registracije: Dec 2004
Lokacija: Zagreb, Tresnjevka
Postovi: 9,500
Hvala Rodney na odgovoru, malo sam ga kasno vidio.

Nemam posljednju verziju koda sad kod sebe, no mislim da se rješenje nije mijenjalo.

Obzirom na nedostatak znanja oko programiranja, snašao sam se na sljedeći način, tako da sam u Excelu količinu čelija koja se gleda, definirao sa dvije slične varijable:
rasponrng koja definira koje ćelije se trebaju gledati, kao string.
rng - samo je definiran kao Range varijabla unutar Excela-a
Code:
Dim rasponrng As String = "A" & i + 1 & ":A" & i + 20
Dim rng As Range = excelApp.ActiveSheet.Range(rasponrng)

Dim PozicijaSljedecegParta As Double
PozicijaSljedecegParta = excelApp.Match("Sklop", rng, 0)
S time da nisam siguran jesam li ostavio ovako, da gleda sljedećih 20 mjesta ili sam našao način da Range definira unedogled dokle god ne naiđe na vrijednost "Sklop" ?

Uglavnom, cilj je bio dobiti XML oblik datoteke, koja ima točno određenu strukturu inače je drugi softver neće pročitati nikako.
Kod je bio dosta bugovit sve dok nisam prestao koristiti ove "wb" i "ws" varijable koje su definirale dijelove Excel Interop Referencu unutar Visual Studio-a.
Code:
        ' Otvaranja excela
        wb = excelApp.Workbooks.Open(Path.Combine(mydocpath, "Book1.xlsx"))

        ' referenca na sheet broj 1
        ws = wb.Worksheets(1)
Sad moram naći rješenje kako da mi Excel dobro broji broj redaka u dokumentu, iz nekog razloga ponekad izbroji višak redova koji su prazni (tipa kad copy-paste napravim u postojeći xlsx dokument i pokrenem skriptu.

Skinuo sam si tutorial na HR za Visual Basic, barem da pohvatam osnove i počnem se koristiti bolje dokumentacijom. Smatram da je to must-have za baratanje objektnim programiranjem.
__________________
"Everything with a heartbeat can knock you down"
Vuco je offline   Reply With Quote
Oglasni prostor
Oglas
 
Oglas
Odgovori


Uređivanje

Pravila postanja
Vi ne možete otvarati nove teme
Vi ne možete pisati odgovore
Vi ne možete uploadati priloge
Vi ne možete uređivati svoje poruke

BB code je Uključeno
Smajlići su Uključeno
[IMG] kod je Uključeno
HTML je Isključeno

Idi na