Moro gurut,
tarvisin hieman neuvoa probleemaan.
Pitäisi linkittää VB ja excel.
Ongelma on seuraavanlainen. Mulla on VB:llä tehty "lotto arvonta" ohjelma ja pitäisi saada arvotut tulokset jotka on VB:n labeleissa siirrettyä automaattisesti excelin taulukkoon joka on suunnilleen tälläinen: arvontapäivä, 1.numero, 2. numero, jne. Ongelma on paha kun tälläinen noobie ei osaa/ei ole kuullutkaan miten sellainen tehdään. Olen kokeillut OLE systeemiä mutta ei ei ei se pelaa tai en vaan osaa.
Kysymykset siis ovat:
1. Kuinka linkitetään VB ja excel?
2. Kuinka VB:n label ja excel:n solu linkitetään?
Kiitos jo etukäteen
Moikka PeteX!
Yksinkertaisimmillaan:
Avaa Excel & VB, Activoi Excel & tallenna työkirja -> aktivoi solu, jonka haluat linkittää -> valitse Muokkaa ja Kopio -> aktivoi VB & Label johon haluat linkittää -> vlitse Edit & Paste Link. Tutki nyt Properties ikkunassa Labelin LinkItem, LinkMode, LinkTimeout & LinkTopic asetuksia. Labelin sisällön lähettäminen Excelin soluun tapahtuu LinkPoke komennolla.
pikku esimerkki:
Private Sub Command1_Click() Dim ctl As Control For Each ctl In Form1.Controls With ctl If InStr(.Name, "Label") > 0 Then If .LinkItem <> "" Then .Caption = Str(Val(.Caption) + 1) .LinkMode = 1 'Manual .LinkPoke End If End If End With Next End Sub
Kiitti Nea.
Eka kyssä selkiinty kohtuullisesti mutta tuo koodinpätkä ei aukee ollenkaan. Viittisitkö vientää pikkasen rautalankaa tuohon esimerkkiin. =)
Moikka taas PeteX!
elikä kopioit ja liität ton koodin ohjelmasi siihen aliohjelmaan & heti sen koodinpätkän perään jossa labellit saa arvonsa (lottonumerot) ja poistat rivin:
.Caption = Str(Val(.Caption) + 1)
sit teet juuri, kuten edellä neuvoin ton linkittämisen suhteen (solu/labelli). Jos ei ala toimimaan niin vika ei ole ainakaan tässä päässä...
Moikka taas PeteX!
tässä toinen hauska tapa siirtää kaamaa Excelin & VB:n välillä...
edelliseen jutskaan verrattuna tässä on etuna se, ettei Excel ole avoinna silloin, kun VB-ohjelmaa suoritetaan...
Excelissä: kirjoittele Taul1:n ekarivin soluhin sarakkeisiin A - G: 1. nro jne. sekä soluihin I ja J: 1. vara jne... ja tokarivin vastaavien sarakkeiden soluihin - (miinus) sekä poista muut taulut. Sit avaa Excelin VB-Editori, tuplakilkkaa ThisWorkbook ja kopioi&liitä vastaaviin aliohjelmiin seuraavat koodinpätkät
Private Sub Workbook_BeforeClose(Cancel As Boolean) Cells.Range("A2:" & _ Replace(Cells.SpecialCells(xlCellTypeLastCell) _ .Address, "$", "")).Select Dim solu For Each solu In Cells.Range("A2:" _ & Replace(Cells.SpecialCells(xlCellTypeLastCell) _ .Address, "$", "")) With solu If Not IsEmpty(.Value) Then .Value = "-" End With Next ActiveWorkbook.Save Saved = True End Sub
& tallenna työkirja
VB:ssä: Formille 9 Indeksoitua (0 - 8) Labelia, Komentonappi & Data-kontrolli. Aktivoi Data1 ja siirry Properties-ikkunaan -> klikkaa Connect ja aseta arvoksi: Excel8.0 -> klikkaa DatabaseName - etsi ja valitse tallentamasi työkirja -> klikka RecordSource - Taul1$ -> aktivoi jokainen Labelli vuorollaan -> palaa Properties ikkunaan -> klikkaa DataSource - Data1 -> klikkaa DataField - 1# nro jne... & kopioi&liitä seuraavat koodinpätkät:
Private Sub Command1_Click() Dim i As Integer, version As Integer Dim BaseFolder As String, xlFolder As String version = 8: BaseFolder = "C:\Ohjelmatiedosto\" xlFolder = "Office" For i = 0 To 8 Label1(i).Caption = Val(Label1(i).Caption) + i + 1 Next i Data1.Refresh CheckExcelState Ret: On Error GoTo ErrorHandler Shell (BaseFolder & "Microsoft Office\" & _ xlFolder & "\Excel.exe " & Chr(34) & _ Data1.DatabaseName & Chr(34)), vbMaximizedFocus End Exit_Proc: Exit Sub ErrorHandler: Select Case Err Case 76 Err.Clear BaseFolder = "C:\Program files\" Resume: GoTo Ret Case Else End Select Err.Clear version = version + 1 xlFolder = "Office" & CStr(version) If version = 16 Then MsgBox "Exceliä ei löydy Microsoft Officen" & _ " oletusasennushakemistosta" _ , vbExclamation, "Viestiloota" GoTo Exit_Proc End If Resume: GoTo Ret End Sub Sub CheckExcelState() 'referenssi: Microsoft WMI Scripting V1.2 Library '(C:\WINDOWS\system32\wbem\wbemdisp.TLB) Dim wmiService As SWbemObjectSet Dim wmiProcess As SWbemObject Set wmiService = GetObject _ ("winmgmts:{impersonationLevel=impersonate}") _ .InstancesOf("Win32_process") For Each wmiProcess In wmiService With wmiProcess If LCase(.Name) = "excel.exe" Then .Terminate End If End With Next Set wmiService = Nothing End Sub
*kumartaa* ja alkaa kokeilemaan koodin pätkää. Taitaa mulla tulla pitkä yö ku alan tutkiin hieman tuota.
hmmm... Nea, mistä tuo "Excel8.0" tulee? Onko se "wanhan" excel:n versio (office2003)? Kun painan RecordSource:sta (data1 aktiivinen) tulee seuraavanlainen virhe: Couldn't find installable ISAM. Voisko tuo johtua tosta "Excel 8.0" valinnasta kun mulla on uusin office(2007) ja VB6.0 ei osaa kommunokoida sen tiedostoiden kanssa?
Moikka taas PeteX!
Epäilyksesi osuu sikäli oikeaan, että johtuu Office 2007. Mitä voit yrittää tehdä on tutkia minkä versioiden tiedostomuotojen tallennusta Excelisi tukee elikä -> Tallenna nimellä -> selaa Tallennusmuoto: boxin sisältö. Jos löytyy Esim. 'Excel97 - Excel2003 ja Excel 5.0/95 -työkirja (*.xls)' niin vaitse se ja tallenna työkirja uudestaan. Jos ei auta voit koitaa ladata ja asentaa tämän
Moikka taas PeteX !
löytyikö 'ongelmaan' ratkaisu...?
Ei vielä, mutta mietintämyssy on päässä.
tästä voisi olla ehkä apua.
lisää projektiin referenssi(VB6:ssa Project/references) Microsoft Excel XX Object library. XX on luultavasti uusimmassa officessa 12.0 tai 13.0
Private Sub Command1_Click() Dim xlApp As New Excel.Application Dim xlBook As New Excel.Workbook Dim xlSheet As New Excel.Worksheet Set xlApp = CreateObject("excel.application") Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) 'tehdään otsikot xlSheet.Range("a1").Value = "päivämäärä" xlSheet.Range("b1").Value = "numero1" xlSheet.Range("c1").Value = "numero2" 'jnejne.... 'luodaan 'dataa' xlSheet.Range("a2").Value = "11.11.2007" xlSheet.Range("b2").Value = "5" xlSheet.Range("c2").Value = "5" 'jnejne 'näytetään excel xlApp.Visible = True 'tallennetaan excel 'xlSheet.SaveAs ("c:\temp\tiedosto.xls") 'xlApp.Quit End Sub
Koodissa luodaan uusi excel työkirja lisätään muutamaan soluun tietoa ja tuodaan työkirja näkyville.
Jees. Sain pelittään homman. Laitoin tollasta koodin pätkää ohjelman perään.
Private Sub avaa_excel_1() Set excelsheet = GetObject("d:\koulujuttui\visual basic\harkkatyö\lotto.xls") excelsheet.application.Visible = False excelsheet.Parent.windows(1).Visible = True Call tallenna_lotto_tulokset_exceliin ' Kutsutaan aliohjelma_tallenna_lotto_tulokset End Sub Sub tallenna_lotto_tulokset_exceliin() Dim sarake As Integer Dim rivi As Integer ' etsitään seuraava vapaa rivi sarake = 1 rivi = 6 Do Until excelsheet.application.cells(rivi, sarake) = "" rivi = rivi + 1 Loop '--------------------------------------- ' tallennetaan henkilön tiedot taulukkoon excelsheet.application.cells(rivi, 1) = Now() excelsheet.application.cells(rivi, 2) = lottonumero(0) excelsheet.application.cells(rivi, 3) = lottonumero(1) excelsheet.application.cells(rivi, 4) = lottonumero(2) excelsheet.application.cells(rivi, 5) = lottonumero(3) excelsheet.application.cells(rivi, 6) = lottonumero(4) excelsheet.application.cells(rivi, 7) = lottonumero(5) excelsheet.application.cells(rivi, 8) = lottonumero(6) excelsheet.application.cells(rivi, 9) = lottonumero(7) excelsheet.application.cells(rivi, 10) = lottonumero(8) excelsheet.application.cells(rivi, 11) = lottonumero(9) Call tallenna_excel End Sub Private Sub tallenna_excel() excelsheet.application.displayalerts = False excelsheet.saveas "d:\koulujuttui\visual basic\harkkatyö\lotto.xls" excelsheet.application.quit Set excelsheet = Nothing End Sub
Kiitoksia Nealle ja Hyckelle vinkeistä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.