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
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
Myö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.