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 SubKiitti 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 SubKoodissa 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 SubKiitoksia Nealle ja Hyckelle vinkeistä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.