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 SubOnko 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 SubHeippa 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.