Alkuperäinen kysymys löytyy tuolta:
https://www.ohjelmointiputka.net/keskustelu/
Kun räpläsin koodia tarpeeksi, löytyi sieltä mahdollisuus kaivaa noita Excelin kaavoja. Ongelmana on nyt kuitenkin se, että "Objektin viittaukseksi ei voi määrittää objektiesiintymää."
Tälleen olen asiaa yrittänyt:
Dim alku As Date Dim loppu As Date Dim paaoma As Double Dim korko As Double Dim aika As Long Dim kertynyt As Double Dim yht As Double Dim excel As Excel.WorksheetFunction If TxtKorko.Text > 0 And TxtAlkupvm.Text <> "" And TxtLoppupvm.Text <> "" Then paaoma = TxtSaatava.Text korko = TxtKorko.Text alku = TxtAlkupvm.Text loppu = TxtLoppupvm.Text aika = excel.Days360(alku, loppu) 'TÄSSÄ KOHTAA TULEE TUO VIRHEILMOITUS kertynyt = (paaoma * (korko / 100) / 360) * aika TxtKertynytK.Text = FormatNumber(kertynyt) yht = paaoma + kertynyt TxtYht.Text = FormatNumber(yht) End If End Sub
Onko vinkkejä vielä, miten tätä kannattaisi jatkaa?
Moikka Kia!
On olemassa kaksi eri tapaa pelata Excelillä VB.NET - 2005 ympäristössä
Käyttämällä hyväksi System.Runtime.Serialization nimitilaa saadaan käyttöön
"Old Style" COM-objektit jolloin voit periaatteesa hakea koko Excel'in yhdellä
kertaaa ohjelmaasi lisäämällä viittauksen Microsof Excel x.0 Object Library'n
(x = versio).
Elikä VB:ssä klikkaat: Project => References => valitse COM välilehti => tuplaklikkaa ylemmässä listassa nimeä Microsof Excel x.0 Object Library
(nimi tulee näkyviin alempaan listaan) => klikkaa OK.
Lisää Formin declare-osioon muiden Imports lauseiden sekaan lause:
Imports System.Runtime.Serialization
Mikäli haluat hyödyntää Microsoft Office PIAs (Primary Interop Assemblies) pakettia niin voit impata sen ilmaiseksi netistä. HUOM Office version mukaan! Asennettuasi PIAs-paketin voit hyödyntää projektissasi esim. nimitilaa Microsoft.Office.Interop.Excel. Mikäli assembly ei toimi suoraan Imports
lauseella viittaamalla niin...
VB:ssä klikkaat: Project => References => valitse CAG välilehti => tuplaklikkaa ylemmässä listassa nimeä Microsoft.Office.Interop.Excel ja klikkaa OK.
Lisäämällä Formin declare osioon Imports lauseen...
Imports excel=Microsoft.Office.Interop.Excel
voit viitata nimitilassa aivan mihin tahansa...(ja viitattavaa löytyyy)
Dim jotain As jotain = excel.jotain.jotain
Heippa taas Kia!
Jäi tossa edellisessä selittämättä se mikä koodissasi mahdollisesti mättää...
Testasin tämän Sharp Develop'lla joten pieniä eroja voi esiintyä VB:n nähden
"Old Style"
'Lisää vielä sinne formin declare-osioon seuraavat lauseet Imports Excel Imports System.Diagnostics 'ja sit Public Class Mainform ' tähän väliin... Public Shared WithEvents excel As Excel.Application Public Shared WithEvents xlbook As excel.Workbook Public Shared WithEvents xlSheet As excel.Worksheet '...nämä väliin jäävät Public Shared Sub Main Dim fMainForm As New MainForm 'ja tänne väliin... ' (Käynnistää Excel'n, ohjelma ei tule näkyviin) excel = New Excel.Application() 'Tässä luodaan objekti xlBook = Ctype(excel.Workbooks.Add(Type.Missing), Excel.Workbook) xlsheet = CType(xlBook.Worksheets(1), Excel.Worksheet) xlsheet.Application.Visible = False '...nämä väliin jäävät 'Sit muuta sun koodissa seuraavat... 'tämä TxtKertynytK.Text = FormatNumber(kertynyt) TxtKertynytK.Text = kertynyt.ToString() 'tähän 'tämä TxtYht.Text = FormatNumber(yht) TxtYht.Text = yht.ToString() 'tähän Private Sub MainFormClosing(sender As System.Object, e As System.ComponentModel.CancelEventArgs) 'ja sit vielä tänne väliin... '("Tappaa" kaikki kaikki käynnissä olevat Excel-prosessit) Dim i As Integer, pProcess As Process() pProcess = Process.GetProcessesByName("Excel") If Not pProcess Is Nothing Then For i = LBound(pProcess) To UBound(pProcess) Try pProcess(i).Kill() Catch ex As Exception End try Next i excel = nothing xlbook = nothing xlsheet = nothing End if '...nämä väliin jäävät End Sub
Heippa taas Kia!
iski väsähdys kirjoitellessani tota edellistä, joten vielä pikku lisäys...
jätä tämä vielä pois koodistasi: Dim excel As Excel.WorksheetFunction
ja vaihda noi .ToString() jutut .ToString("c") niin saat valuuttaa.
Kiitoksia Nea!
Aihe on jo aika vanha, joten et voi enää vastata siihen.