|
|||||||||||
|
|
#1 |
|
Moderator
Datum registracije: Dec 2004
Lokacija: Zagreb, Tresnjevka
Postovi: 9,505
|
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
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. |
|
|
|
|
|
#2 | ||
|
only fool, not a horse
Datum registracije: Apr 2008
Lokacija: near zgb
Postovi: 1,281
|
Citiraj:
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:
Code:
<root> <naslov><\naslov> <object........ <\root> |
||
|
|
|
|
|
|
|
Oglas
|
|
|
|
#3 |
|
Moderator
Datum registracije: Dec 2004
Lokacija: Zagreb, Tresnjevka
Postovi: 9,505
|
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)
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)
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" |
|
|
|
|
|
|
|
Oglas
|
|
![]() |
|
|