Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VBA: VB:n ja Excelin linkitys

Sivun loppuun

PeteX [21.11.2007 09:47:04]

#

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

neau33 [21.11.2007 18:29:07]

#

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

PeteX [21.11.2007 20:17:37]

#

Kiitti Nea.
Eka kyssä selkiinty kohtuullisesti mutta tuo koodinpätkä ei aukee ollenkaan. Viittisitkö vientää pikkasen rautalankaa tuohon esimerkkiin. =)

neau33 [21.11.2007 22:00:02]

#

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ä...

neau33 [21.11.2007 23:01:34]

#

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

PeteX [22.11.2007 00:35:47]

#

*kumartaa* ja alkaa kokeilemaan koodin pätkää. Taitaa mulla tulla pitkä yö ku alan tutkiin hieman tuota.

PeteX [22.11.2007 02:10:03]

#

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?

neau33 [22.11.2007 04:31:02]

#

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

neau33 [23.11.2007 03:28:30]

#

Moikka taas PeteX !

löytyikö 'ongelmaan' ratkaisu...?

PeteX [23.11.2007 15:24:10]

#

Ei vielä, mutta mietintämyssy on päässä.

Hycke [26.11.2007 11:47:07]

#

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.

PeteX [28.11.2007 06:40:23]

#

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ä.


Sivun alkuun

Vastaus

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

Tietoa sivustosta