Menetelmät tietojen siirtämiseksi Exceliin Visual Basicista
Yhteenveto
Tässä artikkelissa käsitellään useita tapoja tietojen siirtämiseksi Microsoft Exceliin Microsoft Visual Basic -sovelluksestasi. Tässä artikkelissa esitellään myös kunkin menetelmän edut ja haitat, jotta voit valita parhaiten toimivan ratkaisun.
Lisätietoja
Tietojen siirtäminen Excel-työkirjaan on yleensä automaatiomenetelmä. Automaation avulla voit määrittää mahdollisimman joustavasti tietojesi sijainnin työkirjassa sekä mahdollisuuden muotoilla työkirjaa ja tehdä erilaisia asetuksia suorituksen aikana. Automaation avulla voit siirtää tietoja usealla eri tavalla:
- Siirrä tietosolu solun mukaan
- Siirrä matriisin tiedot solualueeseen
- Siirrä ADO-tietuejoukon tietoja solualueeseen Käyttämällä CopyFromRecordset-menetelmää
- Sellaisen Excel-laskentataulukon kyselytaulukon luominen, joka sisältää ODBC- tai OLEDB-tietolähteeseen tehdyn kyselyn tuloksen
- Siirrä tietoja leikepöydälle ja liitä leikepöydän sisältö Excel-laskentataulukkoon
On myös olemassa menetelmiä, joilla voit siirtää exceliin tietoja, jotka eivät välttämättä edellytä automaatiota. Jos käytössäsi on sovelluspalvelin, tämä voi olla hyvä tapa ottaa suurin osa tietojen käsittelystä pois asiakkaistasi. Seuraavia menetelmiä voidaan käyttää tietojen siirtämiseen ilman automaatiota:
- Siirrä tiedot sarkaimella tai pilkuin eroteltuun tekstitiedostoon, jonka Excel voi myöhemmin jäsentää laskentataulukon soluiksi
- Tietojen siirtäminen laskentataulukkoon ADO:n avulla
- Tietojen siirtäminen Exceliin DDE:n (Dynamic Data Exchange) avulla
Seuraavissa osioissa on lisätietoja kustakin näistä ratkaisuista.
Huomautus Kun käytät Microsoft Office Excel 2007:ää, voit käyttää uutta Excel 2007 -työkirjan (*.xlsx) tiedostomuotoa, kun tallennat työkirjat. Voit tehdä tämän etsimällä seuraavan koodirivin seuraavista koodiesimerkeistä:
oBook.SaveAs "C:\Book1.xls"
Korvaa tämä koodi seuraavalla koodirivillä:
oBook.SaveAs "C:\Book1.xlsx"
Lisäksi Northwind-tietokanta ei ole oletusarvoisesti mukana Office 2007:ssä. Voit kuitenkin ladata Northwind-tietokannan Microsoft Office Onlinesta.
Automaation avulla voit siirtää tietosoluja soluittain
Automaation avulla voit siirtää tietoja laskentataulukkoon yksi solu kerrallaan:
Dim oExcel As Object
Dim oBook As Object
Dim oSheet As Object
'Start a new workbook in Excel
Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Add
'Add data to cells of the first worksheet in the new workbook
Set oSheet = oBook.Worksheets(1)
oSheet.Range("A1").Value = "Last Name"
oSheet.Range("B1").Value = "First Name"
oSheet.Range("A1:B1").Font.Bold = True
oSheet.Range("A2").Value = "Doe"
oSheet.Range("B2").Value = "John"
'Save the Workbook and Quit Excel
oBook.SaveAs "C:\Book1.xls"
oExcel.Quit
Tietosolun siirtäminen solun mukaan voi olla täysin hyväksyttävä menetelmä, jos tietojen määrä on pieni. Voit sijoittaa tietoja joustavasti mihin tahansa työkirjan kohtaan ja muotoilla soluja ehdollisesti suoritushetkellä. Tätä menetelmää ei kuitenkaan suositella, jos sinulla on paljon tietoja siirrettäväksi Excel-työkirjaan. Jokainen Range-objekti, jonka hankit suorituksen aikana, johtaa liittymäpyyntöön, jotta tietojen siirtäminen tällä tavalla voi olla hidasta. Lisäksi Microsoft Windows 95:llä ja Windows 98:lla on 64K-rajoitus liittymäpyynnöissä. Jos saavutat tai ylität tämän 64k:n raja-arvon liittymäpyynnöille, automaatiopalvelin (Excel) saattaa lakata vastaamasta tai näyttöön saattaa tulla virheitä, jotka ilmaisevat muistin loppumista.
Jälleen kerran tietosolun siirtäminen solun mukaan on hyväksyttävää vain pienissä tietomäärissä. Jos haluat siirtää suuria tietojoukkoja Exceliin, harkitse jotakin myöhemmin esitetyistä ratkaisuista.
Lisätietoja Excelin automatisoinnissa käytettävästä mallikoodista on artikkelissa Microsoft Excelin automatisoiminen Visual Basicista.
Automaation avulla voit siirtää tietomatriisin laskentataulukon alueeseen
Tietomatriisi voidaan siirtää usean solun alueelle kerralla:
Dim oExcel As Object
Dim oBook As Object
Dim oSheet As Object
'Start a new workbook in Excel
Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Add
'Create an array with 3 columns and 100 rows
Dim DataArray(1 To 100, 1 To 3) As Variant
Dim r As Integer
For r = 1 To 100
DataArray(r, 1) = "ORD" & Format(r, "0000")
DataArray(r, 2) = Rnd() * 1000
DataArray(r, 3) = DataArray(r, 2) * 0.7
Next
'Add headers to the worksheet on row 1
Set oSheet = oBook.Worksheets(1)
oSheet.Range("A1:C1").Value = Array("Order ID", "Amount", "Tax")
'Transfer the array to the worksheet starting at cell A2
oSheet.Range("A2").Resize(100, 3).Value = DataArray
'Save the Workbook and Quit Excel
oBook.SaveAs "C:\Book1.xls"
oExcel.Quit
Jos siirrät tietojasi käyttämällä matriisia solun sijaan, voit ymmärtää valtavan suorituskyvyn tuoton, kun tietoja on paljon. Harkitse seuraavaa riviä yllä olevasta koodista, joka siirtää tietoja 300 soluun laskentataulukossa:
oSheet.Range("A2").Resize(100, 3).Value = DataArray
Tämä rivi edustaa kahta liittymäpyyntöä (toinen Range-menetelmän palauttamalle Range-objektille ja toinen Range-objektille, jonka Koon muuttaminen -menetelmä palauttaa). Toisaalta tietosolun siirtäminen solun mukaan edellyttäisi pyyntöjä 300 liittymästä Range-objekteihin. Aina kun mahdollista, voit hyötyä tietojen siirtämisestä joukkona ja liittymäpyyntöjen määrän vähentämisestä.
ADO-tietuejoukon siirtäminen laskentataulukkoalueeseen automaation avulla
Excel 2000 esitteli CopyFromRecordset-menetelmän, jonka avulla voit siirtää ADO (tai DAO) -tietuejoukon laskentataulukon alueelle. Seuraava koodi havainnollistaa, miten voit automatisoida Excel 2000:n, Excel 2002:n tai Office Excel 2003:n ja siirtää Northwind-mallitietokannan Orders-taulukon sisällön KopioiTietuejoukosta-menetelmällä.
'Create a Recordset from all the records in the Orders table
Dim sNWind As String
Dim conn As New ADODB.Connection
Dim rs As ADODB.Recordset
sNWind = _
"C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb" conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _ sNWind & ";"
conn.CursorLocation = adUseClient
Set rs = conn.Execute("Orders", , adCmdTable)
'Create a new workbook in Excel
Dim oExcel As Object
Dim oBook As Object
Dim oSheet As Object
Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Add
Set oSheet = oBook.Worksheets(1)
'Transfer the data to Excel
oSheet.Range("A1").CopyFromRecordset rs
'Save the Workbook and Quit Excel
oBook.SaveAs "C:\Book1.xls"
oExcel.Quit
'Close the connection
rs.Close
conn.Close
Huomautus Jos käytät Northwind-tietokannan Office 2007 -versiota, sinun on korvattava seuraava koodirivi koodiesimerkissä:
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _ sNWind & ";"
Korvaa tämä koodirivi seuraavalla koodirivillä:
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _ sNWind & ";"
Excel 97 sisältää myös CopyFromRecordset-menetelmän, mutta voit käyttää sitä vain DAO-tietuejoukon kanssa. CopyFromRecordset ja Excel 97 eivät tue ADO:a.
Lisätietoja ADO:n ja CopyFromRecordset-menetelmän käyttämisestä on artikkelissa Tietojen siirtäminen ADO-tietuejoukosta Exceliin automaation avulla.
Laskentataulukon kyselytaulukon luominen automaation avulla
QueryTable-objekti edustaa taulukkoa, joka on muodostettu ulkoisesta tietolähteestä palautetuista tiedoista. Kun automatisoit Microsoft Exceliä, voit luoda kyselytaulukon yksinkertaisesti antamalla yhteysmerkkijono OLEDB- tai ODBC-tietolähteelle YHDESSÄ SQL-merkkijonon kanssa. Excel ottaa vastuun tietuejoukon luomisesta ja lisäämisestä laskentataulukkoon määrittämässäsi sijainnissa. Kyselytaulukoiden käyttäminen tarjoaa useita etuja CopyFromRecordset-menetelmään verrattuna:
- Excel käsittelee tietuejoukon luomisen ja sen sijoittamisen laskentataulukkoon.
- Kysely voidaan tallentaa kyselytaulukon kanssa, jotta se voidaan päivittää myöhemmin päivitetyn tietuejoukon saamiseksi.
- Kun uusi kyselytaulukko lisätään laskentataulukkoon, voit määrittää, että laskentataulukon soluissa jo olevat tiedot siirretään uusien tietojen mukaan (katso lisätietoja RefreshStyle-ominaisuudesta).
Seuraava koodi näyttää, miten voit automatisoida Excel 2000:n, Excel 2002:n tai Office Excel 2003:n uuden kyselytaulukon luomiseksi Excel-laskentataulukkoon Northwind-mallitietokannan tietojen avulla:
'Create a new workbook in Excel
Dim oExcel As Object
Dim oBook As Object
Dim oSheet As Object
Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Add
Set oSheet = oBook.Worksheets(1)
'Create the QueryTable
Dim sNWind As String
sNWind = _
"C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb"
Dim oQryTable As Object
Set oQryTable = oSheet.QueryTables.Add( _
"OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
sNWind & ";", oSheet.Range("A1"), "Select * from Orders") oQryTable.RefreshStyle = xlInsertEntireRows
oQryTable.Refresh False
'Save the Workbook and Quit Excel
oBook.SaveAs "C:\Book1.xls"
oExcel.Quit
Leikepöydän käyttäminen
Windowsin Leikepöytää voidaan käyttää myös mekanismina tietojen siirtämiseen laskentataulukkoon. Jos haluat liittää tietoja useisiin laskentataulukon soluihin, voit kopioida merkkijonon, jossa sarakkeet erotetaan sarkainmerkkien mukaan ja rivit rivinvaihdoilla. Seuraava koodi havainnollistaa, miten Visual Basic voi käyttää Leikepöytä-objektiaan tietojen siirtämiseen Exceliin:
'Copy a string to the clipboard
Dim sData As String
sData = "FirstName" & vbTab & "LastName" & vbTab & "Birthdate" & vbCr _ & "Bill" & vbTab & "Brown" & vbTab & "2/5/85" & vbCr _
& "Joe" & vbTab & "Thomas" & vbTab & "1/1/91"
Clipboard.Clear
Clipboard.SetText sData
'Create a new workbook in Excel
Dim oExcel As Object
Dim oBook As Object
Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Add
'Paste the data
oBook.Worksheets(1).Range("A1").Select
oBook.Worksheets(1).Paste
'Save the Workbook and Quit Excel
oBook.SaveAs "C:\Book1.xls"
oExcel.Quit
Luo eroteltu tekstitiedosto, jonka Excel voi jäsentää riveiksi ja sarakkeiksi
Excel voi avata sarkaimella tai pilkuin eroteltuja tiedostoja ja jäsentää tiedot oikein soluiksi. Voit hyödyntää tätä ominaisuutta, kun haluat siirtää suuren määrän tietoja laskentataulukkoon ja käyttää vain vähän, jos lainkaan, automaatiota. Tämä voi olla hyvä tapa asiakaspalvelinsovellukselle, koska tekstitiedosto voidaan luoda palvelinpuolelle. Voit sitten avata tekstitiedoston asiakasohjelmassa käyttämällä automaatiota tarvittaessa.
Seuraava koodi havainnollistaa, miten voit luoda pilkuin erotellun tekstitiedoston ADO-tietuejoukosta:
'Create a Recordset from all the records in the Orders table
Dim sNWind As String
Dim conn As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim sData As String
sNWind = _
"C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb" conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _ sNWind & ";"
conn.CursorLocation = adUseClient
Set rs = conn.Execute("Orders", , adCmdTable)
'Save the recordset as a tab-delimited file
sData = rs.GetString(adClipString, , vbTab, vbCr, vbNullString)
Open "C:\Test.txt" For Output As #1
Print #1, sData
Close #1
'Close the connection
rs.Close
conn.Close
'Open the new text file in Excel
Shell "C:\Program Files\Microsoft Office\Office\Excel.exe " & _ Chr(34) & "C:\Test.txt" & Chr(34), vbMaximizedFocus
Huomautus Jos käytät Northwind-tietokannan Office 2007 -versiota, sinun on korvattava seuraava koodirivi koodiesimerkissä:
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
sNWind & ";"
Korvaa tämä koodirivi seuraavalla koodirivillä:
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
sNWind & ";"
Jos tekstitiedoston tunniste on .CSV, Excel avaa tiedoston näyttämättä ohjattua tekstin tuontitoimintoa ja olettaa automaattisesti, että tiedosto on pilkuilla eroteltu. Vastaavasti jos tiedostolla on .TXT tunniste, Excel jäsentää tiedoston automaattisesti sarkainerotinten avulla.
Edellisessä koodiesimerkissä Excel käynnistettiin käyttämällä Shell-lausetta, ja tiedoston nimeä käytettiin komentoriviargumenttina. Edellisessä mallissa ei käytetty automaatiota. Halutessasi voit kuitenkin käyttää minimaalista määrää automaatiota tekstitiedoston avaamiseen ja tallentamiseen Excel-työkirjamuodossa:
'Create a new instance of Excel
Dim oExcel As Object
Dim oBook As Object
Dim oSheet As Object
Set oExcel = CreateObject("Excel.Application")
'Open the text file
Set oBook = oExcel.Workbooks.Open("C:\Test.txt")
'Save as Excel workbook and Quit Excel
oBook.SaveAs "C:\Book1.xls", xlWorkbookNormal
oExcel.Quit
Tietojen siirtäminen laskentataulukkoon ADO:n avulla
Käyttämällä Microsoft Jet OLE DB -palvelua voit lisätä tietueita aiemmin luodun Excel-työkirjan taulukkoon. Excelin taulukko on vain alue, jolla on määritetty nimi. Alueen ensimmäisen rivin on sisällettävä otsikot (tai kenttien nimet), ja kaikki seuraavat rivit sisältävät tietueet. Seuraavissa vaiheissa kuvataan, miten voit luoda työkirjan, jossa on tyhjä taulukko nimeltä MyTable.
Excel 97, Excel 2000 ja Excel 2003
Aloita uusi työkirja Excelissä.
Lisää seuraavat otsikot taul1 soluihin A1:B1:
A1: Etunimi B1: Sukunimi
Muotoile solu B1 oikealle tasatuksi.
Valitse A1:B1.
Valitse Lisää-valikosta Nimet ja valitse sitten Määritä. Anna nimi Oma Taulukko ja valitse OK.
Tallenna uusi työkirja C:\Book1.xls ja sulje Excel.
Jos haluat lisätä tietueita MyTable-taulukkoon ADO:n avulla, voit käyttää seuraavanlaista koodia:
'Create a new connection object for Book1.xls
Dim conn As New ADODB.Connection
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Book1.xls;Extended Properties=Excel 8.0;"
conn.Execute "Insert into MyTable (FirstName, LastName)" & _
" values ('Bill', 'Brown')"
conn.Execute "Insert into MyTable (FirstName, LastName)" & _
" values ('Joe', 'Thomas')"
conn.Close
Excel 2007
Käynnistä uusi työkirja Excel 2007:ssä.
Lisää seuraavat otsikot taul1 soluihin A1:B1:
A1: Etunimi B1: Sukunimi
Muotoile solu B1 oikealle tasatuksi.
Valitse A1:B1.
Napsauta valintanauhan Kaavat-välilehteä ja valitse sitten Määritä nimi. Kirjoita nimi MyTable ja valitse sitten OK.
Tallenna uusi työkirja C:\Book1.xlsx ja sulje Excel.
Jos haluat lisätä tietueita MyTable-taulukkoon ADO:n avulla, käytä koodia, joka muistuttaa seuraavaa koodiesimerkkiä.
'Create a new connection object for Book1.xls
Dim conn As New ADODB.Connection
conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=C:\Book1.xlsx;Extended Properties=Excel 12.0;"
conn.Execute "Insert into MyTable (FirstName, LastName)" & _
" values ('Scott', 'Brown')"
conn.Execute "Insert into MyTable (FirstName, LastName)" & _
" values ('Jane', 'Dow')"
conn.Close
Kun lisäät tietueita taulukkoon tällä tavalla, työkirjan muotoilu säilyy. Edellisessä esimerkissä sarakkeeseen B lisätyt uudet kentät muotoillaan oikealla tasausmuodolla. Jokainen riville lisätty tietue lainaa muodon sen yläpuolella olevalta riviltä.
Huomaa, että kun tietue lisätään laskentataulukon soluun tai soluihin, se korvaa kaikki kyseisissä soluissa aiemmin olevat tiedot. toisin sanoen laskentataulukon rivejä ei "työnnetä alas", kun uusia tietueita lisätään. Pidä tämä mielessä, kun suunnittelet laskentataulukoiden tietojen asettelua.
Huomautus
Excel-laskentataulukon tietojen päivittäminen ADO:n tai DAO:n avulla ei toimi Visual Basic for Application -ympäristössä Accessissa, kun olet asentanut Office 2003 Service Pack 2:n (SP2) tai asentanut Access 2002 -päivityksen, joka sisältyy Microsoft Knowledge Base -artikkeliin 904018. Tämä menetelmä toimii hyvin Visual Basic for Application -ympäristössä, joka on peräisin muista Office-sovelluksista, kuten Word, Excelistä ja Outlookista.
Lisätietoja on seuraavassa artikkelissa:
Lisätietoja Excel-työkirjan käyttämisestä ADO:n avulla on artikkelissa Excel-tietojen kyseleminen ja päivittäminen ASP:n ADO:n avulla.
Tietojen siirtäminen Exceliin DDE:n avulla
DDE on automaation vaihtoehto, joka on keino kommunikoida Excelin kanssa ja siirtää tietoja. Automaation ja COM:n tulon myötä DDE ei kuitenkaan ole enää suositeltava tapa kommunikoida muiden sovellusten kanssa, ja sitä tulee käyttää vain, kun käytettävissäsi ei ole muuta ratkaisua.
Jos haluat siirtää tietoja Exceliin DDE:n avulla, voit käyttää LinkPoke-menetelmää tietojen hakemiseen tietylle solualueelle tai linkexecute-menetelmää excelin suorittamien komentojen lähettämiseen.
Seuraava koodiesimerkki havainnollistaa, miten voit muodostaa DDE-keskustelun Excelin kanssa, jotta voit lisätä tietoja laskentataulukon soluihin ja suorittaa komentoja. Tämän mallin avulla DDE-keskustelu voidaan muodostaa Onnistuneesti LinkTopic Exceliin|MyBook.xls, MyBook.xls niminen työkirja on jo avattava käynnissä olevassa Excel-esiintymässä.
Huomautus
Kun käytät Excel 2007:ää, voit tallentaa työkirjat uuden .xlsx -tiedostomuodon avulla. Varmista, että päivität tiedostonimen seuraavassa koodiesimerkissä. Tässä esimerkissä Text1 edustaa Visual Basic -lomakkeen Tekstiruutu-ohjausobjektia:
'Initiate a DDE communication with Excel
Text1.LinkMode = 0
Text1.LinkTopic = "Excel|MyBook.xls"
Text1.LinkItem = "R1C1:R2C3"
Text1.LinkMode = 1
'Poke the text in Text1 to the R1C1:R2C3 in MyBook.xls
Text1.Text = "one" & vbTab & "two" & vbTab & "three" & vbCr & _
"four" & vbTab & "five" & vbTab & "six"
Text1.LinkPoke
'Execute commands to select cell A1 (same as R1C1) and change the font format
Text1.LinkExecute "[SELECT(""R1C1"")]"
Text1.LinkExecute "[FONT.PROPERTIES(""Times New Roman"",""Bold"",10)]"
'Terminate the DDE communication
Text1.LinkMode = 0
Kun käytät LinkPoke-toimintoa Excelin kanssa, määrität alueen rivisarakemerkinnässä (R1C1) LinkItem-kohteelle. Jos tökit tietoja useisiin soluihin, voit käyttää merkkijonoa, jossa sarakkeet erotetaan sarkaimella ja rivit rivien erottimena rivinvaihdoilla.
Kun käytät LinkExecute-funktiota ja pyydät Exceliä suorittamaan komennon, sinun on annettava Excelille komento Excel-makrokielen (XLM) syntaksissa. XLM-dokumentaatio ei sisälly Excel-versioihin 97 tai uudempiin.
DDE ei ole suositeltu ratkaisu tiedonsiirtoon Excelin kanssa. Automaatio tarjoaa parhaan joustavuuden ja tarjoaa enemmän käyttöoikeuksia Excelin tarjoamista uusista ominaisuuksista.
Palaute
https://aka.ms/ContentUserFeedback.
Tulossa pian: Vuoden 2024 aikana poistamme asteittain GitHub Issuesin käytöstä sisällön palautemekanismina ja korvaamme sen uudella palautejärjestelmällä. Lisätietoja on täällä:Lähetä ja näytä palaute kohteelle