Bagaimana cara mengimpor beberapa file excel ke akses?

Selamat,

Saya punya sedikit masalah. tujuannya adalah untuk membuat tabel tunggal yang disebut 'tbl_MasterStockFile' di MS Access dari mengimpor beberapa spreadsheet yang terletak di buku kerja terpisah

(OMONG-OMONG. Struktur kolomnya sama di semua spreadsheet dengan baris pertama adalah nama bidang)

Saya butuh bantuan untuk mencapai hal berikut yang dimulai dari tombol perintah yang disebut 'Impor Stok/Produk'

1. Hapus semua tabel yang memiliki nama yang mengandung 'tbl_import'

2. Berikan dialog File/Buka yang memungkinkan pengguna untuk memilih satu atau lebih spreadsheet Excel untuk diimpor, sangat mirip dengan kode pilihan tunggal di sini

http. // www. mrexcel. com/board2/viewtopic. php?to=85521 sorot=buka file+dialog+akses

2. Setelah pengguna memilih satu atau lebih spreadsheet, maka (Menggunakan perintah 'Transferspreadsheet') sebuah tabel akan dibuat per spreadsheet, dengan spreadsheet baris pertama = nama bidang yaitu ('Memiliki Nama Bidang = Ya')

Nama tabel perlu dibangun sebagai berikut

tbl_import_filename

filename = nama file spreadsheet tanpa. ekstensi xls

3. Setiap tabel (tbl_import_filename) memerlukan penghapusan catatan kosong (Perintah Transferspreadsheet tampaknya membawa catatan kosong?)

4. Semua catatan di semua tabel (tbl_import_filename(s)) perlu digabungkan dan duplikatnya dihapus. Catatan duplikat berdasarkan kolom di spreadsheet yang disebut 'StockID/Barcode' akan digunakan karena kolom ini harus unik

5. Sebuah tabel perlu dibuat dengan nama 'tbl_MasterStockFile' dan gabungan (tbl_import_filename(s)) tanpa catatan duplikat perlu diimpor ke 'tbl_MasterStockFile'

Adakah yang bisa membantu?

:oops:

 

Ulang. Pilih dan Impor Beberapa Spreadsheet Excel ke Access

Anda sebenarnya memiliki cukup banyak pengimporan yang rumit untuk dilakukan
Dan, pada dasarnya saya sudah menerapkan apa yang Anda gambarkan

Sebuah saran tentang teknik

Jika Anda menamai judul kolom dengan benar (nama bidang), Anda dapat mengimpor spreadsheet langsung ke tabel tujuan. dan setiap impor akan ditambahkan secara otomatis ke tabel (tidak ditimpa) dengan DoCmd. Metode TransferSpreadsheet

Menghapus tabel secara massal agak sederhana. Berikut adalah contoh saya membunuh tabel kesalahan. Ini, tentu saja, hanya mematikan tabel yang cocok dengan sebagian string dari nama lengkap

Kode

 For Each tbl In dbs.TableDefs
     If Left(tbl.Name, 21) = "AutoExporting$_Import" Then
        DoCmd.DeleteObject acTable, tbl.Name
     End If
 Next tbl


Berikut adalah contoh pemanggilan fungsi yang membersihkan catatan 'kosong'

Kode

Public Function PurgeEmptyRecords(ByVal strTbl As String, ByVal x As Integer, ByVal y As Integer)
Dim dbs As DAO.Database
Dim rs As DAO.Recordset

Set dbs = CurrentDb

Set rs = dbs.OpenRecordset("Select * from " & strTbl, dbOpenDynaset)

With rs   ' Tests Two fields for Null, if both are, it purges entire record
  Do Until rs.EOF
    If IsNull(.Fields(x).Value) And IsNull(.Fields(y).Value) Then
      .Delete
    End If
    .MoveNext
  Loop
End With

Set rs = Nothing
Set dbs = Nothing
End Function
_


Untuk mengimpor, ada tiga pendekatan
1) Buat tabel dengan jalur lengkap ke setiap lokasi file dalam satu bidang dan iterasi melalui tabel itu dengan mengirimkan informasi ke kode Anda untuk diimpor (transferspreadsheet) masing-masing secara bergantian

2) Gunakan dialog buka file untuk mengembalikan jalur folder (bukan jalur file) - lalu impor seluruh folder (berguna jika Anda tidak tahu namanya tetapi secara konsisten seluruh direktori

3) Anda dapat menyetel kotak kombo & kotak daftar ke 'pilihan banyak' - Saya belum menguji teknik ini tetapi harus memungkinkan untuk memilih beberapa item dan meneruskannya sebagai daftar ke fungsi lain

Kode

Public Function ImportExcel(ByVal tblName As String)
Dim dbs As DAO.Database
Dim rs As DAO.Recordset
Dim rsf As DAO.Recordset
Dim tbl As TableDef
Dim strTLoc, strFLoc, strSQL As String
Dim errNumber As Long
Dim strXLS As String

Set dbs = CurrentDb

strSQL = "SELECT * FROM " & tblName

Set rs = dbs.OpenRecordset(strSQL, dbOpenDynaset)
Set rsf = rs.OpenRecordset()

strSQL = "DELETE * FROM tblData"
DoCmd.RunSQL strSQL    ' Empties tblData prep for Import Process

With rsf
  Do Until rsf.EOF
    strFLoc = .Fields(2)
    'strFLoc = FindDefaults("DefaultOpenLocation") & Right(!f_name, 4) & "\" & !f_name & ".xls"
       If ValidateLocations(strFLoc) Then       ' Does the file location exist
         Call ImportExport("acImport", "tblData", strFLoc)
       End If
    .MoveNext
  Loop
End With

Set rsf = Nothing
Set rs = Nothing

Call PurgeEmptyRecords("tblData", 0, 1)   ' Table to test, Field1 to test, 

 ' This eliminates all the import error tables
 For Each tbl In dbs.TableDefs
     If Left(tbl.Name, 21) = "AutoExporting$_Import" Then
        DoCmd.DeleteObject acTable, tbl.Name
     End If
 Next tbl

'Set rst = Nothing
Set dbs = Nothing
End Function

Public Function ImportExport(ByVal Ltype As String, ByVal Tname As String, _
                                 ByVal TLoc As String) As Long
Dim intCnt As Integer

Select Case Ltype:
    Case "acImport":  Ltype = 0
      'DoCmd.TransferSpreadsheet acImport, 8, Tname, TLoc, True, ""
    Case "acExport":  Ltype = 1
      'DoCmd.TransferSpreadsheet acExport, 8, Tname, TLoc, True, ""
    Case "acLink":    Ltype = 2
      'DoCmd.TransferSpreadsheet acLink, 8, Tname, TLoc, True, ""
End Select
DoCmd.TransferSpreadsheet " " & Ltype, 8, Tname, TLoc, True, ""

End Function


Itulah sebagian besar contoh teknik yang Anda perlukan - meskipun saya jamin Anda harus mengedit/menghapus/mengubah beberapa di antaranya untuk membuatnya berfungsi

Semoga beruntung

Mike

 

Ulang. Pilih dan Impor Beberapa Spreadsheet Excel ke Access

Sebagian jawaban
Tautan pertama sebenarnya adalah kode yang saya kutip beberapa bulan lalu (dan Anda kutip di posting awal Anda di utas ini)

Milik saya sedikit dimodifikasi - kosmetik di mana jenis file yang ingin saya tawarkan filter dan fungsi khusus (FindDefaults) yang baru saja mengekstrak lokasi default untuk memulai - yang mengakses tabel. Itu hanya menggunakan tabel seperti file INI

Tapi, hampir semua yang Anda butuhkan sudah ada di sana
Tautan multi-pilihan. itu juga mereferensikan kode Ken Getz. tampaknya terkait dengan mengekstraksi data file teks

Dan meninjau itu -- semua DoCmd itu. Hal-hal TransferText tampaknya menggunakan Spesifikasi Impor. Spesifikasi Impor adalah cara membuat template untuk impor. Buka panduan impor (manual) - dan impor salah satu file Anda. Pergi sampai akhir, *tepat sebelum* Anda menekan Finish. Tekan tab lanjutan di kiri bawah dan SIMPAN spesifikasi dengan nama unik

Lain kali Anda menginginkan format file itu, gunakan kembali spesifikasi yang sama
Periksa bantuan untuk sintaks atau gunakan sesuatu seperti

Kode

Sub ImportRoutine(spec As String, tblA As String, dstFile As String)

  DoCmd.TransferText acImportFixed, spec, tblA, dstFile

End Sub


Multi-pilih tampak menarik. Saya harus meninjaunya untuk melihat apakah benar-benar ada perubahan. Dugaan pertama saya adalah bahwa ini adalah modifikasi kecil pada keseluruhan kode

Pendekatan pribadi saya untuk hal semacam ini adalah menggunakan dialog Buka File untuk membuka folder dan kemudian mengembalikan semua file di folder ke tabel. dan kemudian berjalan melalui tabel untuk mengimpor file. Saya dapat dengan mudah mengimpor saat saya mengambil nama file

Edit saya
Saya memotong segmen yang relevan (itu yang terakhir) di tautan kedua Anda ke dalam modul kode akses. Saya menyiapkan panggilan cepat untuk itu

Kode

Sub dothebrowse()

apiBrowseFiles

End Sub
_


Bekerja seperti pesona bagi saya - tidak ada perubahan
Jika tidak berjalan untuk Anda, kemungkinan besar alasannya adalah Anda kehilangan referensi
Pastikan Microsoft Scripting Runting dicentang (dalam modul kode apa pun, Tools-References. Gulir untuk menemukan entri yang perlu Anda periksa)

Kode mengembalikan file yang Anda inginkan - sub Anda (seperti milik saya di atas) perlu menerima file dan melakukan sesuatu dengannya. Aka menambahkan sesuatu seperti

Dim aaa As Varian
aaa = apiBrowseFiles

Mike

 

sebuah metode

Inilah metode paling sederhana
Buat tabel dengan dua bidang. Bidang pertama adalah jalur lengkap ke file yang ingin Anda impor. Kedua adalah nama tabel yang ingin Anda gunakan setelah diimpor

Gantikan nama tabel Anda dengan tblName hanya beberapa baris di bawah ini

Kode

Function GetMyTables()
Dim dbs as DAO.Database
Dim rs As DAO.Recordset
Dim strSQL As String

Set dbs = CurrentDb()

strSQL = "SELECT * FROM tblName"
Set rs = dbs.OpenRecordset(strSQL, dbOpenSnapshot)

With rs
  Do Until rs.EOF
    ImportExport("acImport", .Fields(1).Value, .Fields(0).Value)
    .MoveNext
  Loop
End With

Set rs = Nothing
Set dbs = Nothing
End Function

Public Function ImportExport(ByVal Ltype As String, ByVal Tname As String, _ 
                                 ByVal TLoc As String) As Long 
Dim intCnt As Integer 

Select Case Ltype: 
    Case "acImport":  Ltype = 0 
      'DoCmd.TransferSpreadsheet acImport, 8, Tname, TLoc, True, "" 
    Case "acExport":  Ltype = 1 
      'DoCmd.TransferSpreadsheet acExport, 8, Tname, TLoc, True, "" 
    Case "acLink":    Ltype = 2 
      'DoCmd.TransferSpreadsheet acLink, 8, Tname, TLoc, True, "" 
End Select 
DoCmd.TransferSpreadsheet " " & Ltype, 8, Tname, TLoc, True, "" 

End Function


Ini tidak akan memiliki fleksibilitas untuk memilih apa yang Anda impor

Opsi #2 - menggunakan API. Pendekatan lain, berguna jika Anda perlu menyimpan data adalah dengan mengimpor semua nama file dan menyimpannya ke dalam tabel. Berikut adalah fungsi di mana Anda dapat meneruskan folder awal ke pembersihan tersebut, lalu mengisi tabel bernama tblFiles dengan 2 bidang. Anda harus menyiapkan meja terlebih dahulu

Saya tidak memiliki kesempatan untuk memodifikasi satu bagian - saya mengambil nama file tersebut. file1. xls bukan hanya file1 untuk digunakan sebagai nama tabel. Anda ingin memotongnya

Kode

Public Type BROWSEINFO
    hOwner As Long
    pidlRoot As Long
    pszDisplayName As String
    lpszTitle As String
    ulFlags As Long
    lpfn As Long
    lParam As Long
    iImage As Long
End Type

'32-bit API declarations
Declare Function SHGetPathFromIDList Lib "shell32.dll" _
  Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long

Declare Function SHBrowseForFolder Lib "shell32.dll" _
Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long


Public Function ReturnAllFiles(Optional ByVal selDir As String) As Boolean
Dim DirName As String
Dim TempName, TempName2, TempName3 As String, FileNum As Integer
Dim dbs As DAO.Database
Dim rs As DAO.Recordset
Dim strSQL, strTbl As String
Dim lnCnt As Long

strTbl = "tblFiles"

Set dbs = CurrentDb
If ObjectExists("Table", strTbl) Then
  strTbl = "tblFiles"
  strSQL = "DELETE * FROM " & strTbl
  DoCmd.RunSQL strSQL
Else
  ' Create the Table
End If
'C:\DirectoryLocation
strSQL = "SELECT * FROM tblFiles"
Set rs = dbs.OpenRecordset(strSQL, dbOpenDynaset)
    
    FileNum = FreeFile
    If selDir <> "C:\" Then
      DirName = selDir
    Else
      DirName = GetDirectory2() & "\"
      If Len(DirName) = 0 Then
        ReturnAllFiles = False
        Exit Function
      End If
    End If
    
    TempName = Dir$(DirName, vbDirectory)

    While Len(TempName)
        If (TempName <> ".") And (TempName <> "..") Then    'get rid of "." and ".."
            TempName = DirName & TempName
            lnCnt = InStr(TempName, ".xls") - 7
            TempName2 = Right(TempName, Len(TempName) - lnCnt + 1)
            'GetAttr is a built-in function
            If GetAttr(TempName) <> vbDirectory Then
                'Debug.Print TempName
                rs.AddNew
                rs.Fields(0).Value = TempName2   ' file1.xls
                rs.Fields(1).Value = TempName     ' full path to file
                rs.Update
            End If
        End If
        TempName = Dir$
    Wend
    
    Close #FileNum

ReturnAllFiles = True

Set rs = Nothing
Set dbs = Nothing
End Function

Public Function GetDirectory2(Optional Msg) As String

    Dim bInfo As BROWSEINFO
    Dim path As String
    Dim R As Long, x As Long

'   Root folder = Desktop
    bInfo.pidlRoot = 0&

'   Title in the dialog
    If IsMissing(Msg) Then
        bInfo.lpszTitle = "Select a folder."
    Else
        bInfo.lpszTitle = Msg
    End If
    
'   Type of directory to return
    bInfo.ulFlags = &H1

'   Display the dialog
    x = SHBrowseForFolder(bInfo)
    
'   Parse the result
    path = Space$(512)
    R = SHGetPathFromIDList(ByVal x, ByVal path)
    If R Then
          x = InStr(path, Chr$(0))
        GetDirectory2 = Left(path, x - 1)
    Else
        GetDirectory2 = ""
    End If

End Function
_


Saya tidak yakin berapa banyak bantuan lebih lanjut yang bisa saya berikan. Tuntutan waktu saya sejak awal tahun tampaknya telah meledak dan saya tidak punya waktu untuk menulis penjelasan rinci - spesifik yang panjang. Semoga ini cukup bagi Anda untuk membuat sesuatu bekerja

Mike

 

Bagaimana cara mengimpor beberapa file Excel ke Access secara bersamaan?

Cara Mengimpor Beberapa Spreadsheet ke Akses .
Beralih ke tab "Data Eksternal" di Access dan temukan grup "Impor & Tautan". .
Klik tombol "Jelajahi" dan gunakan kotak dialog "Buka File" untuk menemukan file Excel pertama yang ingin Anda impor

Bagaimana cara mengimpor daftar dari Excel ke Access?

Jika Anda menggunakan versi terbaru dari versi langganan Microsoft 365 Access atau Access 2019, pada tab Data Eksternal, dalam grup Impor & Tautan, klik Data Baru . .