Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET, VBA: Excelin kaavojen käyttäminen (jatkoa)

Kia [21.04.2007 17:27:56]

#

Alkuperäinen kysymys löytyy tuolta:
https://www.ohjelmointiputka.net/keskustelu/13675-vb-2005-express-excelin-kaavojen-käyttäminen

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?

neau33 [21.04.2007 19:34:55]

#

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

neau33 [22.04.2007 01:57:50]

#

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

neau33 [22.04.2007 04:13:49]

#

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.

Kia [22.04.2007 18:13:42]

#

Kiitoksia Nea!

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta