Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET, VBA: [VB2008]Excelin sulkeminen

timo80 [30.12.2008 08:59:44]

#

Moro,

Taas olisi Excel -probleema. Eli nyt onnistuu kahden eri Excelin avaus samanaikaisesti ohjelmalla ja samalla tiedon haku, mutta entäpäs oikea oppinen sulkeminen.

Toinen Excel lisäksi kysyy avautuessaan "This workbook contains links to other data sources. -To update all linked information, click Yes. - To keep the existing information, click No." Eli tämä tulisi pystyä kiertämään kokonaan (ja valinnalla "No"). Excelin avauduttua ohjelma hakee tietoja kummankin Excelin kentistä ja siirtää ne ohjelmaan, koko ajan Excelin ollessa Hide:inä, mutta sitten Excelit jäävät auki taustalle kummittelemaan ja lopulta konetta suljettaessa eteen pomppaa parikymmentä Exceliä kyselemään halutaanko tallentaa muutoksia (joita ei siis haluta tallentaa koskaan).

Tässä koodini sekä Excelin avaukseen, sekä sulku yritykseen, joka ei siis toimi tällä hetkellä:

'Muuttujapätkä, jolla hoidetaan halutun Excel tiedoston avaaminen.
    Public Sub Avaa(ByVal strTykirja As String)
        xlapp = CType(CreateObject("Excel.Application"), Excel.Application)
        xlbook = CType(xlapp.Workbooks.Add(strTykirja), Excel.Workbook)
        xlsheet = CType(xlbook.Worksheets(1), Excel.Worksheet)
        xlsheet.Application.Visible = True
    End Sub

   'Muuttujapätkä, jolla aktivoidaan haluttu Excel sivu.
    Public Sub AktivoiSivu(ByVal strSivu As String)
        Try
            CType(xlbook.Worksheets(strSivu), Excel.Worksheet).Activate()
            xlsheet = CType(xlbook.ActiveSheet, Excel.Worksheet)
        Catch ex As Exception
        End Try
    End Sub

   'Muuttujapätkä, jolla luetaan haluttua Excel kenttää.
    Public Function LueSolu(ByVal x As Integer, ByVal y As Integer) As String
        LueSolu = CStr(CType(CType(xlbook.ActiveSheet, Excel.Worksheet).Cells(x, y), Excel.Range).Value)
    End Function

'Ja Excelin sulku yritys, jota en saanut toimimaan

  Private Sub Form1_FormClosing(ByVal Sender As Object, _
    ByVal e As System.Windows.Forms.FormClosingEventArgs) _
    Handles MyBase.FormClosing
        xlApp.Quit() : xlSheet = Nothing
        xlBook = Nothing : xlApp = Nothing
    End Sub

Eli miten saada Excelit sulkeutumaan toimivasti ja kiertämään Excelin (avautuessa) linkitys kysymykset sekä (sulkiessa) tallennus ehdotukset (kielteisenä kaikkiin)?

-Timo

neau33 [30.12.2008 18:45:44]

#

No moro timo80!

ekaks - mistä ihmeestä olet saanut päähäsi, että lause- tai funktioaliohjelma olisi jotain, jonka voisi määritellä: "'Muuttujapätkä, ..." ?

tokaks:

Public Sub Avaa(ByVal strTykirja As String)

   'allaoleva rivi kannattaa sijoittaa Form_Load tapahtumaan
    xlApp = CType(CreateObject("Excel.Application"), Excel.Application)
   'koska Application-objektista ole mitään järkeä luoda uutta
   'instanssia joka kerta, kun avataan tai luodaan työkirja...
   '(yksi Application-objekti riittää)...

   'tilanteessa jossa Excel sattuisikin olemaan käynnissä ennen
   'Form_Load tapahtumaa voitaisiin xlApp-objekti määritellä näin:
   'xlApp = CType(GetObject(, "Excel.Application"), Excel.Application)

   'tällä avaataan olemassaoleva työkirja-tiedosto...
    xlBook = CType(xlApp.Workbooks.Add(strTykirja), Excel.Workbook)
   'Huom! jos parametrin 'strTykirja' arvo on esim.
   '"C:\Testi.xls" niin Application-objekti luo ko. tiedostosta uuden
   'instanssin ja nimeää sen automaattisesti nimellä: Testi1
   'jos koodiksi laittaa seuraavan pätkän...
   'xlBook = (CType(xlApp.Workbooks.Open(strTykirja), Excel.Workbook))
   '...niin Application-objekti avaa alkuperäisen tiedoston.
   'mikäli ennen riviä jolla xlBook-objekti luodaan olisi koodinpätkä:
   'xlApp.DisplayAlerts = False
   'niin avattaessa työkirjaa kyselyikkunat eivät välttämättä pomppaa
   'esiin, mutta mikään ei takaa, että automaattinen valinta on: No...
   'kun xlBook-objekti on luotu kannattaa ehkä palauttaa viesti-
   'ikkunoiden näyttäminen takaisin voimaan eli:
   'xlApp.DisplayAlerts = True

   'tällä määritellään xlSheet-objekti (työkirjan.taulu)
   xlSheet = CType(xlbook.Worksheets(1), Excel.Worksheet)

   xlSheet.Application.Visible = True

End Sub

Private Sub Form1_FormClosing(ByVal Sender As Object, _
ByVal e As System.Windows.Forms.FormClosingEventArgs) _
Handles MyBase.FormClosing

    'tämä lauserakennelma käy silmukassa läpi kaikki
    'avoimet Excelistä luodun instanssin (xlApp) työkirjat
    'yksitellen kunkin vuorollaan...
    For Each xlbk As Excel.Workbook In xlApp.Workbooks
       With xlbk
          .Saved = "True" 'tällä pätkällä saadaan Excel uskomaan,
                          'että kulloinkin vuorossa oleva työkirja
                          'on jo tallennettu, vaikkei olisikaan...

          .Close 'tämä pätkä taas sulkee kulloinkin
                 'vuorossa olevan työkirjan
       End with
    Next

    'tämä pätkä sulkee Excelistä luodun instanssin (xlApp)
    xlApp.Quit()

    'allaolevilla määritelmillä "tapetaan" luodut
    'objektit pois muistista kummittelemasta ...
    xlSheet = Nothing: xlBook = Nothing: xlApp = Nothing

End Sub
'mikäli haluat varmistaa, ettei ainuttakaan Excel-instanssia
'jää pyörimään ohjelmasi sulkemisen jälkeen niin käytä tätä...
Private Sub Form1_FormClosing(ByVal Sender As Object, _
ByVal e As System.Windows.Forms.FormClosingEventArgs) _
Handles MyBase.FormClosing

   Dim prosessi() As System.Diagnostics.Process = _
   System.Diagnostics.Process.GetProcessesByName("EXCEL")

   If Not prosessi Is Nothing Then
     For i As Integer = 0 To _
     prosessi.GetUpperBound(0)
         Try
           prosessi(i).Kill
         Catch ex As Exception
         End Try
      Next
   End If
   prosessi = Nothing

End Sub

timo80 [31.12.2008 08:48:48]

#

Myönnetään, nimeämiseni on, noh, omalaatuista. Ei siitä sen enempää :)
Mutta jälleen kerran, suur kiitokset Nealle täydellisestä vastauksesta!

Vastaus

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

Tietoa sivustosta