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 SubEli miten saada Excelit sulkeutumaan toimivasti ja kiertämään Excelin (avautuessa) linkitys kysymykset sekä (sulkiessa) tallennus ehdotukset (kielteisenä kaikkiin)?
-Timo
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 SubMyönnetään, nimeämiseni on, noh, omalaatuista. Ei siitä sen enempää :)
Mutta jälleen kerran, suur kiitokset Nealle täydellisestä vastauksesta!
Aihe on jo aika vanha, joten et voi enää vastata siihen.