Ang pag-export ng impormasyon mula sa Microsoft Access ay hindi kapani-paniwalang madali - sa pag-aakalang nais mo lamang gumawa ng isang solong file sa pag-export. Ngunit ano ang gagawin mo kapag kailangan mong hatiin ang isang query (o talahanayan) sa maraming mga file ng pag-export? Halimbawa, kung kailangan mong i-export ang isang listahan ng mga transaksyon sa customer bawat buwan - ang bawat customer ay mayroong sariling file sa pag-export? Doon makakatulong sa iyo ang artikulong ito. Ang paggawa ng isang pag-export ng 2, 10, o isang daang iba't ibang mga pag-export ay magiging kasing simple ng pagpapatakbo ng isang maliit na VBA code snippet at ang trabaho ay tatapusin sa ilang segundo, hindi oras ng manu-manong pagputol / pag-paste. Kaya't magsimula tayo ...
Ang diskarte
Dahil nais naming ito ay maging kakayahang umangkop at magagamit hangga't maaari, ang code para sa artikulong ito ay magiging mas matagal kaysa sa dati, ngunit makikita mo kung bakit sa ilang sandali.
Una - ibabalangkas natin kung ano ang nais nating makamit:
Dahil sa isang query, output ng isang bagong file sa bawat oras na ang isang halaga sa isang tinukoy na mga pagbabago sa patlang.
Ang hamon
Para magawa ito, kailangan nating masuri ang mga resulta ng query, ihambing ang nauugnay na field sa kasalukuyang row sa value sa nakaraang row – at kung magkaiba ang mga ito, gumawa ng bagong file at simulang i-output ang mga resulta ng query doon.
Ano ang HINDI ito angkop
Tulad ng nabanggit ko na - maraming mga kadahilanan kung bakit mo nais na i-export ang mga bahagi ng iyong database, ngunit ang paggamit nito bilang isang form ng backup / archive na layunin ay hindi isa sa mga ito - tiyak na hindi sa diskarte na ako gamit dito - ang huling bagay na nais mong gawin kung nahaharap ka sa pag-recover mula sa a sira ang database ng mdb ay nagtatrabaho kung paano mag-stitch ng maraming mga export na magkakasama!
Ang solusyon?
Maraming paraan para mag-alis ng mga pagkakamali, isa lang ang paraang ito – pero sa tingin ko ay isa itong mahusay na paraan. Una, babasahin natin ang query sa isang array para mas mapadali ang paggalaw. Susunod, babalikan natin ang array na iyon, sinusuri kung may nakita tayong bagong value sa kaugnay na field o hindi. Kung hindi ito bagong value, ilalabas natin ang buong record sa kasalukuyang file na ating isinusulat, kung bago ito, isasara natin ang file na iyon at magsisimula ng bago.
At ang code…
Sub DoExport(fieldName As String, queryName As String, filePath As String, Optional delim As Variant = vbTab)
Dim db As Database
Dim objRecordset As ADODB.Recordset
Dim qdf As QueryDef
Dim fldcounter, colno, numcols As Integer
Dim numrows, loopcount As Long
Dim data, fs, fwriter As Variant
Dim fldnames(), headerString As String
'get details of the query we'll be exporting
Set objRecordset = New ADODB.Recordset
Set db = CurrentDb
Set qdf = db.QueryDefs(queryName)
'load the query into a recordset so we can work with it
objRecordset.Open qdf.SQL, CurrentProject.Connection, adOpenDynamic, adLockReadOnly
'load the recordset into an array
data = objRecordset.GetRows
'close the recordset as we're done with it now
objRecordset.Close
'get details of the size of array, and position of the field we're checking for in that array
colno = qdf.Fields(fieldName).OrdinalPosition
numrows = UBound(data, 2)
numcols = UBound(data, 1)
'as we'll need to write out a header for each file - get the field names for that header
'and construct a header string
ReDim fldnames(numcols)
For fldcounter = 0 To qdf.Fields.Count - 1
fldnames(fldcounter) = qdf.Fields(fldcounter).Name
Next
headerString = Join(fldnames, delim)
'prepare the file scripting interface so we can create and write to our file(s)
Set fs = CreateObject("Scripting.FileSystemObject")
'loop through our array and output to the file
For loopcount = 0 To numrows
If loopcount > 0 Then
If data(colno, loopcount) <> data(colno, loopcount - 1) Then
If Not IsEmpty(fwriter) Then fwriter.Close
Set fwriter = fs.createTextfile(filePath & data(colno, loopcount) & ".txt", True)
fwriter.writeline headerString
writetoFile data, queryName, fwriter, loopcount, numcols
Else
writetoFile data, delim, fwriter, loopcount, numcols
End If
Else
Set fwriter = fs.createTextfile(filePath & data(colno, loopcount) & ".txt", True)
fwriter.writeline headerString
writetoFile data, delim, fwriter, loopcount, numcols
End If
Next
'tidy up after ourselves
fwriter.Close
Set fwriter = Nothing
Set objRecordset = Nothing
Set db = Nothing
Set qdf = Nothing
End Sub
'parameters are passed "by reference" to prevent moving potentially large objects around in memory
Sub writetoFile(ByRef data As Variant, ByVal delim As Variant, ByRef fwriter As Variant, ByVal counter As Long, ByVal numcols As Integer)
Dim loopcount As Integer
Dim outstr As String
For loopcount = 0 To numcols
outstr = outstr & data(loopcount, counter)
If loopcount < numcols Then outstr = outstr & delim
Next
fwriter.writeline outstr
End Sub
Ano ang ginagawa ng code - mga pangunahing puntos

Una - pinaghiwalay namin ang code sa dalawang mga gawain. Sinusuri ng una kung ang kasalukuyang talaan ay dapat na nakasulat sa parehong file na kasalukuyang ginagawa namin, o kung dapat itong isulat sa isang bagong file. Ang pangalawang gawain ay naglalabas ng mga detalye para sa buong talaan sa file. Ginawa ito sa ganitong paraan upang bawasan ang pagkopya sa code, kung hindi man makikita mo ang parehong pag-loop na nagaganap sa maraming mga lugar.
Pangalawa - Gumagamit ako ng "Kahulugan sa Query" upang makakuha ng mga detalye tungkol sa query na pinagtatrabahuhan namin - kung nais mong maiangkop ito upang gumana sa mga talahanayan, titingnan mo ang pagpapalit nito upang ginamit nito ang " Talaan ng Kahulugan ”sa halip.
Sa nasabing iyon, medyo tiwala ako na ito ay isang piraso ng code na iyong babalikan at gagamitin ng marami!
Panimula ng May-akda:
Ang Mitchell Pond ay isang dalubhasa sa pagbawi ng data sa DataNumen, Inc., na pinuno ng mundo sa mga teknolohiya sa pagbawi ng data, kasama ang magkumpuni SQL Server data at excel mga produkto ng pagbawi ng software. Para sa karagdagang impormasyon pagbisita www.datanumen. Sa