Paano I-export ang Mga Resulta ng isang Query sa Maramihang Mga File na may Access VBA

Ipamahagi ngayon:

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

Mag-export ng Isang Query In AccessPara 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

I-access ang VBANagdagdag na ako ng mga komento sa code sa karamihan ng mga mahahalagang lugar, ngunit mayroon pa ring ilang mga bagay na dapat bigyang-diin.

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

Ipamahagi ngayon:

Mga komento ay sarado.