Xuất dử liệu từ Access ra Excel và ngược lại (1 người xem)

  • Thread starter Thread starter kellyfe
  • Ngày gửi Ngày gửi

Người dùng đang xem chủ đề này

kellyfe

Thành viên chính thức
Tham gia
25/5/07
Bài viết
75
Được thích
40
mình đang sử dụng một chương trình phần mềm access quản lý hệ thống kế toán, nay mình muốn lấy những thông tin từ chương trình phần mền ra excel để làm báo cáo một số việc nhưng mình không biết cách để xuất liệu ra, vì chương trình phần mềm mình sử dụng lại không có chức năng xuất ra excel, có cao thủ nào biết cách chỉ giúp mình với, mình xin đa tạ và hứa dẫn đi ăn kem...
 
Có nhiều cách xuất dữ liệu tư Ac ra Ex. Ở đây xin giới thiệu với bạn 2 cách đơn giản nhất
1/ Xuất dữ liệu tứ Table ra : Mở chương trình Ac, chọn table cần xuất, vào menu File chọn Export, chọn Microsoft Excel...từ hộp Save as types tuỳ phiên bản bạn muốn xuất, đặt tên file, chọn thư mục lưu rồi nhấn Export . Cuối cùng mở file Ex vừa lưu để xem và chỉnh sửa
2/ Xuất dữ liệu của 1 Report : Mở Report cần xuất .Nhấn biểu tượng OfficeLinks, chọn Analyze It with Microsoft Office Excel
 
à mình quên là mình sử dụng phần mềm, nên không có những chức năng như anhphuong hướng dẫn, làm sao đây???
 
Chào bạn,
Tất cả các phần mềm thông thường đều hổ trợ xuất ra Excel. Nếu không có hổ trợ thì ... chắc có lẻ là phần mềm không tốt.
Vì hầu hết các phần mềm hiện nay đều cho xuất ra định dạng Excel.

Lê Văn Duyệt
 
levanduyet ơi mình xem trên diễn đàn mình công nhận bạn là cao thủ đó, không biết mình có một số câu hỏi muốn thỉnh giáo với bạn bạn có bằng lòng không???
 
mình có một file quản lý kho và quản lý công nợ khi nhập kho, in phiếu nhập xuất kho và bảng báo cáo tổng hợp kho, toàn bộ file mình chỉ sử dụng công thức chứ không lập trình vì mình không biết về lập trình, mình muốn post bài này lên để mọi người tham khảo và có ai có thể lập trình để thay thế cho những công thức mình làm thì giúp mình với, nay mình không biết cách để post lên, file mình đến >4KB lận, mình phải làm sao?
 
kellyfe đã viết:
mình có một file quản lý kho và quản lý công nợ khi nhập kho, in phiếu nhập xuất kho và bảng báo cáo tổng hợp kho, toàn bộ file mình chỉ sử dụng công thức chứ không lập trình vì mình không biết về lập trình, mình muốn post bài này lên để mọi người tham khảo và có ai có thể lập trình để thay thế cho những công thức mình làm thì giúp mình với, nay mình không biết cách để post lên, file mình đến >4KB lận, mình phải làm sao?

1/ Nếu bạn muốn post bài xin hãy đọc bài kỹ thuật post bài đăng trong diễn đàn này
2/ Nếu không được xin gửi qua mail của anh Duyệt hoặc của ai đó cung được, các bạn đó sẽ post bài giùm
Thân
 
Anh Duyet oi! Giup em voi.
Lam the nao de tu dong dua so lieu tu bang tong hop theo doi tai san ra cac So tai san chi tiet theo don vi su dung va cac the tai san theo tung loai tai san? Xin hay chi ro cho em vi em moi hoc Excel ma (Xin moi nguoi dung cuoi nha!)
 
kellyfe đã viết:
levanduyet oi mình có xem qua diển đàn này thì mình thấy nó cũng gần như những gì mình cần làm trên file của mình
http://www.giaiphapexcel.com/forum/showthread.php?t=2554
Chào bạn Kellyfe,

Thật ra nếu để ý các vấn đề các bạn trên trang web này quan tâm thông thường là:
_Nhập, In phiếu Xuất/Nhập; Thu/Chi; Hóa đơn; Phiếu tạm ứng,...In làm nhiều trang, Tổng ở cuối mỗi trang in,...
_Nhập / xuất / tồn...
_Nhập dữ liệu chi tiết, sau đó đưa ra bảng tổng hợp lại.
_Tạo các form để nhập liệu cho nhanh.
Tôi nghĩ đó là lý do bạn thấy các bài gần gũi với những gì bạn làm.

levanduyet chi minh post file và lập trình cho mình nhé, đa tạ
Nếu bạn không thể post bài thì gởi cho tôi, tôi sẽ giúp bạn đưa lên.

Anh Duyet oi! Giup em voi.
Lam the nao de tu dong dua so lieu tu bang tong hop theo doi tai san ra cac So tai san chi tiet theo don vi su dung va cac the tai san theo tung loai tai san? Xin hay chi ro cho em vi em moi hoc Excel ma (Xin moi nguoi dung cuoi nha!)
Bạn nên đưa ra bài toán cụ thể của bạn, mọi người sẽ trợ giúp. Và chú ý: viết tiếng việt có dấu.

Lê Văn Duyệt
 
Xin chỉ giúp có cách nào để nhận diện máy Scaner ( loại cầm tay hoặc máy scaner để bàn ) trong excel để khi scan một sản phẩm thì nó lọc trong danh sách đã được tạo sẵn trong đó và ghi lên một sheet nào đó trong excel . Nếu không có trong danh sách thì hỏi có cập nhật không , để cập nhật trong danh sách Nếu có file sẵn thì cho xin

Thành thật cảm ơn . Tôi đang cần gấp .

 
Lấy dữ liệu từ Access đặt vào Excel

(Nguồn: http://www.excelguru.ca/node/23)

Đôi khi chúng ta cần lấy dữ liệu từ Access và đặt chúng vào Excel chỉ cần dựa vào SQL. Một ví dụ như Add-in của anh Tuân A-Tools

Xin giới thiệu các bạn bài viết dựa trên đường link trên:
_Mục đích: Lấy dữ liệu từ Access đặt vào Worksheet trong Excel. Sử dụng ADO + SQL.
_Chú ý:
+ Không có lấy tiêu đề (Tên trường). Chúng ta có thể sửa lại đoạn code để thực hiện yêu cầu của mình.
+ Phải tham chiếu đến Microsoft ActiveX Data Objects Libary.
+ Sử dụng từ office 2003 trở về trước.

Đoạn code chính (các bạn đặt trong module)
PHP:
Option Explicit

'Constant for Database connection string'
Private Const glob_DBPath = "C:\Temp\Examples.mdb"
Private Const glob_sConnect = _
               "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & glob_DBPath & ";"

Private Sub RetrieveRecordset(strSQL As String, clTrgt As Range)
'Author       : Ken Puls ([URL="http://www.excelguru.ca/"]www.excelguru.ca[/URL])'
'Macro Purpose: To retrieve a recordset from a database (via an SQL query) and place'
'               it in the supplied worksheet range'
'NOTE         : Requires a reference to "Microsoft ActiveX Data Objects 2.x Library"'
'               (Developed with reference to version 2.0 of the above)'

    Dim cnt As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim rcArray As Variant
    Dim lFields As Long
    Dim lRecrds As Long
    Dim lCol As Long
    Dim lRow As Long

    'Open connection to the database'
    cnt.Open glob_sConnect

    'Open recordset based on Orders table'
    rst.Open strSQL, cnt

    'Count the number of fields to place in the worksheet'
    lFields = rst.Fields.Count

    'Check version of Excel'
    If Val(Mid(Application.Version, 1, InStr(1, Application.Version, ".") - 1)) > 8 Then
        'EXCEL 2000 or 2002: Use CopyFromRecordset'

        'Copy the recordset from the database'
        On Error Resume Next
        clTrgt.CopyFromRecordset rst
        
        'CopyFromRecordset will fail if the recordset contains an OLE'
        'object field or array data such as hierarchical recordsets'
        If Err.Number <> 0 Then GoTo EarlyExit
    
    Else
        'EXCEL 97 or earlier: Use GetRows then copy array to Excel'

        'Copy recordset to an array'
        rcArray = rst.GetRows

        'Determine number of records (adds 1 since 0 based array)'
        lRecrds = UBound(rcArray, 2) + 1

        'Check the array for contents that are not valid when'
        'copying the array to an Excel worksheet'
        For lCol = 0 To lFields - 1
            For lRow = 0 To lRecrds - 1
                'Take care of Date fields'
                If IsDate(rcArray(lCol, lRow)) Then
                    rcArray(lCol, lRow) = Format(rcArray(lCol, lRow))
                    'Take care of OLE object fields or array fields'
                ElseIf IsArray(rcArray(lCol, lRow)) Then
                    rcArray(lCol, lRow) = "Array Field"
                End If
            Next lRow
        Next lCol

        'Transpose and place the array in the worksheet'
        clTrgt.Resize(lRecrds, lFields).Value = TransposeDim(rcArray)
    End If

EarlyExit:
    'Close and release the ADO objects'
    rst.Close
    cnt.Close
    Set rst = Nothing
    Set cnt = Nothing
    On Error GoTo 0

End Sub
Mã:
[B]Private Function TransposeDim(v As Variant) As Variant[/B]
'Function Purpose:  Transpose a 0-based array (v)'

    Dim x As Long, Y As Long, Xupper As Long, Yupper As Long
    Dim tempArray As Variant

    Xupper = UBound(v, 2)
    Yupper = UBound(v, 1)

    ReDim tempArray(Xupper, Yupper)
    For x = 0 To Xupper
        For Y = 0 To Yupper
            tempArray(x, Y) = v(Y, x)
        Next Y
    Next x

    TransposeDim = tempArray

[B]End Function[/B]

Các bạn dùng thủ tục sau để đưa dữ liệu ra Excel

PHP:
Sub GetRecords()
'Macro Purpose: To retrieve a recordset to an Excel worksheet'

    Dim sSQLQry As String
    Dim rngTarget As Range

    'Generate the SQL query and set the range to place the data in'
    sSQLQry = "SELECT tblMoorages.CustID, tblMoorages.Type, " & _
            "tblMoorages.DatePaid, tblMoorages.Amount FROM tblMoorages;"
    ActiveSheet.Cells.ClearContents
    Set rngTarget = ActiveSheet.Range("A2")

    'Retrieve the records'
    Call RetrieveRecordset(sSQLQry, rngTarget)

End Sub
Nếu có thể chúng ta có thể viết một hàm để lấy dữ liệu giống như A-Tools của Anh Tuân.

VBAVN
 
Xuất dữ liệu từ Range vào Access

(Nguồn: http://www.excelguru.ca/node/18)

Khi chúng ta đã phát triển các công cụ của chính mình như Lấy dữ liệu từ Access ra Excel.
Chắc chắn chúng ta sẽ nghĩ về cách ngược lại là xuất dữ liệu từ Range vào bảng trong Access.
Chúng ta hãy cùng nhau xem ví dụ ở trang link trên:

Mã:
Sub DB_Insert_via_ADOSQL()
'Author       : Ken Puls ([URL="http://www.excelguru.ca/"]www.excelguru.ca[/URL])
'Macro purpose: To add record to Access database using ADO and SQL
'NOTE:  Reference to Microsoft ActiveX Data Objects Libary required

    Dim cnt As New ADODB.Connection, _
            rst As New ADODB.Recordset, _
            dbPath As String, _
            tblName As String, _
            rngColHeads As Range, _
            rngTblRcds As Range, _
            colHead As String, _
            rcdDetail As String, _
            ch As Integer, _
            cl As Integer, _
            notNull As Boolean

    'Set the string to the path of your database as defined on the worksheet
    dbPath = ActiveSheet.Range("B1").Value
    tblName = ActiveSheet.Range("B2").Value
    Set rngColHeads = ActiveSheet.Range("tblHeadings")
    Set rngTblRcds = ActiveSheet.Range("tblRecords")

    'Concatenate a string with the names of the column headings
    colHead = " ("
    For ch = 1 To rngColHeads.Count
        colHead = colHead & rngColHeads.Columns(ch).Value
        Select Case ch
            Case Is = rngColHeads.Count
                colHead = colHead & ")"
            Case Else
                colHead = colHead & ","
        End Select
    Next ch

    'Open connection to the database
    cnt.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & dbPath & ";"

    'Begin transaction processing
    On Error GoTo EndUpdate
    cnt.BeginTrans

    'Insert records into database from worksheet table
    For cl = 1 To rngTblRcds.Rows.Count

        'Assume record is completely Null, and open record string for concatenation
        notNull = False
        rcdDetail = "('"

        'Evaluate field in the record
        For ch = 1 To rngColHeads.Count
            Select Case rngTblRcds.Rows(cl).Columns(ch).Value
                    'if empty, append value of null to string
                Case Is = Empty
                    Select Case ch
                        Case Is = rngColHeads.Count
                            rcdDetail = Left(rcdDetail, Len(rcdDetail) - 1) & "NULL)"
                        Case Else
                            rcdDetail = Left(rcdDetail, Len(rcdDetail) - 1) & "NULL,'"
                    End Select

                    'if not empty, set notNull to true, and append value to string
                Case Else
                    notNull = True
                    Select Case ch
                        Case Is = rngColHeads.Count
                            rcdDetail = rcdDetail & rngTblRcds.Rows(cl).Columns(ch).Value & "')"
                        Case Else
                            rcdDetail = rcdDetail & rngTblRcds.Rows(cl).Columns(ch).Value & "','"
                    End Select
            End Select
        Next ch

        'If record consists of only Null values, do not insert it to table, otherwise
        'insert the record
        Select Case notNull
            Case Is = True
                rst.Open "INSERT INTO " & tblName & colHead & " VALUES " & rcdDetail, cnt
            Case Is = False
                'do not insert record
        End Select
    Next cl

EndUpdate:
    'Check if error was encounted
    If Err.Number <> 0 Then
        'Error encountered.  Rollback transaction and inform user
        On Error Resume Next
        cnt.RollbackTrans
        MsgBox "There was an error.  Update was not succesful!", vbCritical, "Error!"
    Else
        On Error Resume Next
        cnt.CommitTrans
    End If

    'Close the ADO objects
    cnt.Close
    Set rst = Nothing
    Set cnt = Nothing
    On Error GoTo 0
End Sub

_Chú ý:
+ Range A3:F3 được đặt tên là "tblHeadings"
+ Range A4:F11 được đặt tên là "tblRecords"
+ Phải tham chiếu đến Microsoft ActiveX Data Objects Libary

Excel_To_Access.jpg


Việc áp dụng các vấn đề cơ bản mà tác giả giới thiệu chúng ta sẽ thực tập ở bài sau và áp dụng cho việc lưu giữ và truy vấn các hóa đơn.

VBAVN
 
Lấy dữ liệu từ Access, tạo báo cáo trong Excel

To: BinhTam, và các thành viên khác,

Do vô ý tôi xóa bài đầu tiên của tôi trong thread (tôi post giúp BinhTam, nhưng sau đó BinhTam lại post tiếp ở thread thứ #2). Vì vậy topic này cũng bị xóa.
Tôi thành thật xin lỗi. BinhTam vui lòng post lại các file của em lên theo Topic này.

Xin cám ơn các bạn.

Lê Văn Duyệt
 
Theo tôi, nếu BinhTam chỉ muốn làm báo cáo như vậy và bạn có biết về Query, biết về export to excel. Nếu bạn muốn theo cách gia công.
1/ Query make table
2/ Export to excel, có thể 2 file: Data và Slsx (table)
3/ Mở file báo cáo, đưa 2 file trên vào.
4/ In báo cáo.
Nếu bạn OK như vậy tôi sẽ làm cho. Do tôi không rành lắm về ADO hay get ...
Xin gởi file cho BinhTam.
 

File đính kèm

Lần chỉnh sửa cuối:
access-excel

Gui lại file đính kèm để các bạn tham khảo.

levanduyet đã viết:
To: BinhTam, và các thành viên khác,

Do vô ý tôi xóa bài đầu tiên của tôi trong thread (tôi post giúp BinhTam, nhưng sau đó BinhTam lại post tiếp ở thread thứ #2). Vì vậy topic này cũng bị xóa.
Tôi thành thật xin lỗi. BinhTam vui lòng post lại các file của em lên theo Topic này.

Xin cám ơn các bạn.

Lê Văn Duyệt
 

File đính kèm

access-excel

theo cách làm của bạn, khi mình thay đổi số lượng,dm,tlhh trong bảng access thì file báo cáo trong excel có được thay đổi theo hay ko?



ThuNghi đã viết:
Theo tôi, nếu BinhTam chỉ muốn làm báo cáo như vậy và bạn có biết về Query, biết về export to excel. Nếu bạn muốn theo cách gia công.
1/ Query make table
2/ Export to excel, có thể 2 file: Data và Slsx (table)
3/ Mở file báo cáo, đưa 2 file trên vào.
4/ In báo cáo.
Nếu bạn OK như vậy tôi sẽ làm cho. Do tôi không rành lắm về ADO hay get ...
Xin gởi file cho BinhTam.
 
BinhTam đã viết:
theo cách làm của bạn, khi mình thay đổi số lượng,dm,tlhh trong bảng access thì file báo cáo trong excel có được thay đổi theo hay ko?
Thì bạn làm lại các bước như trên. Còn không nghiên cứu về A Tools của anh Tuân. Tại sao không nhập trên Excel luôn.
 
access-excel

nhập liệu trên excel không tốt lắm, đôi khi mình phải dò tên NPL rồi nhập dm,tlhh nếu 1 style thì cố gắng cũng được đằng này quá nhiều style, mỗi lần nhập thấy nhức mắt.
Từ lúc tạo bảng trong access mình thấy nhập liệu rất thoải mái.

ThuNghi đã viết:
Thì bạn làm lại các bước như trên. Còn không nghiên cứu về A Tools của anh Tuân. Tại sao không nhập trên Excel luôn.
 
Dùng A-Tools để liên kết dữ liệu từ Access sang Excel

Dựa vào cách làm công thức tại sheet "Baocao" của bác ThuNghi, tôi làm cho bạn bằng công cụ A-Tools với mục đích liên kết dữ liệu từ Access sang Excel và tự động tạo Name/Tên khi dữ liệu ngồn thay đổi.

Việc của bạn là phải cài A-Tools và tạo DBKEY là BT trước khi mở file "Baocao.xls"

Dữ liệu trên báo cáo Excel sẽ tự động cập nhật nếu dữ liệu trong file Access "NPL-Ptm.mdb" thay đổi.

Bạn cần đọc và làm theo file "Huong dan su dung truoc khi dung.rtf"
 

File đính kèm

Lần chỉnh sửa cuối:
BinhTam đã viết:
nhập liệu trên excel không tốt lắm, đôi khi mình phải dò tên NPL rồi nhập dm,tlhh nếu 1 style thì cố gắng cũng được đằng này quá nhiều style, mỗi lần nhập thấy nhức mắt.
Từ lúc tạo bảng trong access mình thấy nhập liệu rất thoải mái.
Theo tôi nếu chỉ đơn giản như thế thì Excel dùng vô tư. Tôi cũng đã làm công việc như bạn với # 1000 style, mỗi style # 4 NL.
- Bảng định mức thì bắt buộc phải có theo dạng
Style---MaNL---TkHh---DinhMuc
- DMNL:
MaNL---Item
- DMStyle
- Biến lúc này chỉ có: bạn chỉ cần nhập bảng này thôi.
Contract---Style---Qty
Nếu bạn biết chút ít về VBA thì rất dễ trong việc TH, còn không dùng công thức. Chỉ cần nhập số Contact là sẽ có báo cáo.
 
Xin mạn phép mấy cao thủ các bác, tôi nhận được tin nhắn của Binhtam:

BinhTam đã viết:
trong bài lấy data trong access,tạo báo cáo ở excel.
Nếu gọi sưnương thì ngocmaipretty hướng dẫn get external query
Nay mình muốn nhận hướng từ sưnương hay suphụ PTM cũng được
cho đến giờ nay, mình thấy giải pháp của sưphụ PTM là hay nhất.
có gì sưnương gửi qua mail của mình nha : greenmaple@vnn.vn

cho mình gửi lời thăm đến sưphụ PTM

rất tiếc tôi không mail được cho BinhTam, và xét thấy nếu trả lời chung trong topic này cũng không đến nỗi nào (đối với BinhTam); nên tôi xin chen vào hướng dẫn BinhTam thực hành bài này. Thực sự tôi cũng mới đọc loạt bài của Anh Ptm thấy hữu dụng nhưng chưa áp dụng thực tế lần nào. Nhưng đối với bài này tôi có thể làm được. Hơn nữa ngoài Binh Tam ra có thể một số thành viên mới cũng muốn thực hành. Ngoài ra post bài ở đây mới có thể chèn hình minh hoạ.

To đệ tử BinhTam: Riêng đối với sư phụ Ptm, đệ tử phải tự liên hệ, sư nương cũng chỉ học sư phụ Ptm qua GPE thôi.

Dùng lại file của sư phụ Ptm (đúng ra là thái sư phụ), đệ tử phải làm từng bước như sau:

1. Mở file Access (của sư phụ Ptm, đừng lấy file gốc):
  • mở table SlSX dưới dạng design mode, thêm vào 1 field LoaiTP (loại thành phẩm) rồi đệ tử thêm dữ liệu quần nữ, áo nữ .... cho các mã hàng.
  • Trong table Dmuc (định mức), đệ tử có thể thêm vào field tenNVL theo thực tế, cái này để theo dõi riêng thôi chứ không đưa vào form 5a, vì form 5a bị ràng buộc tên NVT theo hợp đồng đã đăng ký với hải quan.
  • Đóng file Access lại.
2. Mở file Excel cũng của sư phụ Ptm
  • Xóa sạch dữ liệu trong sheet, không phải xóa cột nha. nếu thông báo gì thì cũng cứ yes.
  • Mở menu Data - Import External Data - New Database Query hiện ra hộp thoại:
Step1.jpg

  • Chọn MS Access Database, OK, hiện hộp thoại tiếp theo:
Step2.jpg

  • Chọn file Access hồi nãy, OK, hiện tiếp:
Step3.jpg

  • Chọn table SlSX, click Add, click Close
  • Trong cửa sổ tiếp theo, kéo thả lần lượt các field vào vùng lưới bên dưới.
Step4.jpg

  • Mở menu File chọn Return Data to Microsoft Excel.
  • Trong hộp thoại hiện ra chọn cell A1
Step5.jpg


Kết quả được 1 query đầu tiên:

Step6.jpg
 
Lần chỉnh sửa cuối:
Bước 2: tạo query thứ 2:
Đệ tử BinhTam phải làm chính xác nha.

- Vào lại Data - Import External Data - New Database Query
- Chọn file Access NVL.mdb
- Lần này chọn và add 2 table DMNVL và Dmuc

Step7.jpg


- dùng chuột kéo field MaNL của DMNVL vào field MANPL của Dmuc để tạo mối liên kết. Click đôi vào mối liên kết hiện ra hộp thoại chọn loại liên kết, chọn loại 2, Add, Close Kết quả mối liên kết phải có hình mũi tên như sau:

Step8.jpg


- Dùng chuột kéo thả các field theo thứ tự vào vùng lưới. Muốn sort theo field nào, để dấu nháy trong field đó và nhấn nút sort trên tool bar. Ở đây là field Style.

Step9.jpg


- Riêng tỷ lệ hao hụt thì vào menu Record - Add column hiện 1 hộp thoại và gõ vào như sau và click Add, rồi Close:

Step10.jpg


Kết quả trong Query Windows:

Step11.jpg


- Vào menu - File - Return data to Microsoft Excel
- chọn cell E1
Kết quả query thứ 2:

Step12.jpg
 
Bước 3: Xem lại sheet báo cáo:
Có thể thứ tự thứ tự field của Query không giống như cũ nên sheet báo cáo không đúng. Đệ tử BinhTam phải sửa lại công thức lại, chỉ là lookup và sumproduct thôi.
Ngoài ra còn loại TP, cell E3, H3, K3... đang là mã style, thì ở cell D3, G3, J3 sẽ là tên style (quần , áo ...)

Công thức tại E3 là:
=VLOOKUP(E3;Query!$A$2:$C$19;3;0)
Copy vào các cell liên quan

Công thức tại D7 là:
=SUMPRODUCT((Query!$F$2:$F$164=$A7)*(Query!$E$2:$E$164=E$3)*Query!$H$2:$H$164)
Fill xuống

Công thức tại E7 là
=SUMPRODUCT((Query!$F$2:$F$164=$A7)*(Query!$E$2:$E$164=E$3)*Query!$I$2:$I$164)
Fill xuống

Sau đó copy D7:E44 paste vào các style còn lại.

To BinhTam: như vậy là cặn kẽ lắm rồi, đệ tử mà làm không được nữa thì mang tiếng sư nương lắm đó.
 
access-excel

Hi Mr.Tuan,

File a-tools hiện tại bị lỗi gì đó nên download bi lỗi.

Rất mong nhận file a-tool của bạn qua email : greenmaple@vnn.vn

Bạn cho mình hỏi với công cụ a-tool có bị giới hạn sử dụng hay ko?
hay bạn viết code tích hợp vào luôn để khỏi bị hết hạn sử dụng.

TuanVNUNI đã viết:
Dựa vào cách làm công thức tại sheet "Baocao" của bác ThuNghi, tôi làm cho bạn bằng công cụ A-Tools với mục đích liên kết dữ liệu từ Access sang Excel và tự động tạo Name/Tên khi dữ liệu ngồn thay đổi.

Việc của bạn là phải cài A-Tools và tạo DBKEY là BT trước khi mở file "Baocao.xls"

Dữ liệu trên báo cáo Excel sẽ tự động cập nhật nếu dữ liệu trong file Access "NPL-Ptm.mdb" thay đổi.

Bạn cần đọc và làm theo file "Huong dan su dung truoc khi dung.rtf"
 
access-excel

khi làm bước 2, máy tính yêu cầu bỏ đĩa office vao.
Cam on sưnuong đã hướng dẫn.



ngocmaipretty đã viết:
Bước 3: Xem lại sheet báo cáo:
Có thể thứ tự thứ tự field của Query không giống như cũ nên sheet báo cáo không đúng. Đệ tử BinhTam phải sửa lại công thức lại, chỉ là lookup và sumproduct thôi.
Ngoài ra còn loại TP, cell E3, H3, K3... đang là mã style, thì ở cell D3, G3, J3 sẽ là tên style (quần , áo ...)

Công thức tại E3 là:
=VLOOKUP(E3;Query!$A$2:$C$19;3;0)
Copy vào các cell liên quan

Công thức tại D7 là:
=SUMPRODUCT((Query!$F$2:$F$164=$A7)*(Query!$E$2:$E$164=E$3)*Query!$H$2:$H$164)
Fill xuống

Công thức tại E7 là
=SUMPRODUCT((Query!$F$2:$F$164=$A7)*(Query!$E$2:$E$164=E$3)*Query!$I$2:$I$164)
Fill xuống

Sau đó copy D7:E44 paste vào các style còn lại.

To BinhTam: như vậy là cặn kẽ lắm rồi, đệ tử mà làm không được nữa thì mang tiếng sư nương lắm đó.
 
BinhTam đã viết:
Hi Mr.Tuan,

File a-tools hiện tại bị lỗi gì đó nên download bi lỗi.

Rất mong nhận file a-tool của bạn qua email : greenmaple@vnn.vn

Bạn cho mình hỏi với công cụ a-tool có bị giới hạn sử dụng hay ko?
hay bạn viết code tích hợp vào luôn để khỏi bị hết hạn sử dụng.

Chỉ mỗi việc bạn vào trang web http://www.bluesofts.net/Products/AddIns/A-Tools/Index.htm
đọcdownload thôi mà khó khăn vậy?

Tất cả các bài trên mọi người đã giúp bận rất tận tình rồi, đã làm sẵn cho bạn chỉ việc bấm nút "Print" thôi mà sao vẫn còn thắc mắc? Có lẽ bạn phải gắng tự mình làm thêm chút cho vừa ý đi.
 
Lần chỉnh sửa cuối:
Muốn lập bảng chiết tính từ acces & sau đó lấy qua excel

Mình lập dự toán và muốn dơn giản hóa các khâu lấy chiết tính, mình muốn lập một bảng chiết tính từ Access và sau đó lấy qua Excel.
Bạn có cách nào thì chỉ giùm mình với.
 
Mình lập dự toán và muốn dơn giản hóa các khâu lấy chiết tính, mình muốn lập một bảng chiết tính từ Access và sau đó lấy qua Excel.
Bạn có cách nào thì chỉ giùm mình với.

Bạn dùng ngay chức năng trong access để đưa ra Excel từ một table hoặc một query. Dùng macro hoặc VBA tùy bạn
Dùng câu lệnh TransferSpreadsheet để chuyển. Có gì thắc mắc liên hệ với mình
Thân
 
xuất table từ access to excel bị báo lỗi

Chào các bạn,

Mình xuất dữ liệu 1 table đến file excel thì ok!

Tuy nhiên mình muốn xuất thêm 1 bảng nữa thì báo lỗi

Mong nhận được trợ giúp của các bạn

Cảm ơn
 

File đính kèm

Bỏ tên sheet trong dòng lệnh, chỉ để range A:A hoặc F:F, tên sheet để Access tự đặt theo tên file thì OK.
 
Xem lại rồi, tên sheet không phải nguyên nhân, mà trước khi export phải clear, và clear sạch cả comment,
Nếu chỉ clearcontent thì bị lỗi.
Để tên sheet hay không cũng chỉ export được 1 lần. (mỗi lần 2 table)
 
1.) Lúc đầu em để số ô ít quá nên báo lỗi, em để từ "a2:h1000" và "k2:v1000" thì em làm được rồi

2.) Mỗi lần em tạo thêm 1 nút lệnh xuất như em đã đưa thì em phải di chuyển sheet đến bên trái ngoài cùng thì ok. Còn nếu nó đứng ở vị trí cố định thì dữ liệu xuất ra sẽ đè lên sheet nào nằm ngoài cùng bên trên trái.

anh cung cấp em thêm giải pháp thêm nút xuất dữ liệu.




Cứ bỏ tên sheet trong dòng lệnh. Sao chưa thử mà biết không được? Tên sheet phải giống tên file.
Đổi tên sheet hoặc đổi tên file tuỳ ý, file có thể nhiều sheet, nhưng sheet đó phải ngoài cùng bên trái.
 

File đính kèm

PHP:
Private Sub Command0_Click()
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel11, "details", "d:\p2.xls", , "tkn!A:A"
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel11, "import", "d:\p2.xls", , "tkn!K:K"
End Sub

PHP:
Private Sub Command6_Click()
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel11, "tkxde", "d:\p2.xls", , "tkx!a:a"
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel11, "tkx", "d:\p2.xls", , "tkx!k:k"
End Sub

PHP:
Sub clearxls()
Dim objXL As Excel.Application
Dim objWkb As Excel.Workbook
Dim objSht As Excel.Worksheet
Const conMAX_ROWS = 20000
Dim conSHT_NAME(1 To 2) As String
conSHT_NAME(1) = "tkn"
conSHT_NAME(2) = "tkx"
Const conWKB_NAME = "d:\p2.xls"
Set objXL = New Excel.Application
With objXL
Set objWkb = .Workbooks.Open(conWKB_NAME)
For i = 1 To 2
Set objSht = objWkb.Worksheets(conSHT_NAME(i))
intLastCol = objSht.UsedRange.Columns.Count
With objSht
.Range(.Cells(1, 1), .Cells(conMAX_ROWS, _
intLastCol + 10)).Clear
End With
Next
End With
objXL.Workbooks.Close
objXL.Application.Quit
 
Set objSht = Nothing
Set objWkb = Nothing
Set objXL = Nothing
 
End Sub

- gộp cmd0_click và cmd4_click
- gộp cmd6_click và cmd7_click
- xoá thêm sheet tkx trước khi export.
- phùuuuuuuuuuuuù
 
cảm ơn a.PTM

em sẽ về test code bên dưới của anh.

Chúc anh cuối tuần vui vẻ!

Thanks!
BìnhTâm

PHP:
Private Sub Command0_Click()
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel11, "details", "d:\p2.xls", , "tkn!A:A"
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel11, "import", "d:\p2.xls", , "tkn!K:K"
End Sub
PHP:
Private Sub Command6_Click()
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel11, "tkxde", "d:\p2.xls", , "tkx!a:a"
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel11, "tkx", "d:\p2.xls", , "tkx!k:k"
End Sub
PHP:
Sub clearxls()
Dim objXL As Excel.Application
Dim objWkb As Excel.Workbook
Dim objSht As Excel.Worksheet
Const conMAX_ROWS = 20000
Dim conSHT_NAME(1 To 2) As String
conSHT_NAME(1) = "tkn"
conSHT_NAME(2) = "tkx"
Const conWKB_NAME = "d:\p2.xls"
Set objXL = New Excel.Application
With objXL
Set objWkb = .Workbooks.Open(conWKB_NAME)
For i = 1 To 2
Set objSht = objWkb.Worksheets(conSHT_NAME(i))
intLastCol = objSht.UsedRange.Columns.Count
With objSht
.Range(.Cells(1, 1), .Cells(conMAX_ROWS, _
intLastCol + 10)).Clear
End With
Next
End With
objXL.Workbooks.Close
objXL.Application.Quit
 
Set objSht = Nothing
Set objWkb = Nothing
Set objXL = Nothing
 
End Sub
- gộp cmd0_click và cmd4_click
- gộp cmd6_click và cmd7_click
- xoá thêm sheet tkx trước khi export.
- phùuuuuuuuuuuuù
 
Import dữ liệu từ excel vào access bị lỗi không biết lý do

Chào các anh chị,
Em đang làm chương trình nhập liệu kế toán cho công ty, sử dụng access làm cơ sở dữ liệu, excel làm màn hình nhập liệu. Sau đó thực thi kết nối DSN với access để đưa dữ liệu từ excel vào access (theo như hướng dẫn của anh Duyệt).
Tuy nhiên, file của em khi import dữ liệu từ sheet("GLINVC") thì ok (module AExportInvoice) nhưng khi chạy thủ tục import dữ liệu từ sheet("GLDATA") (Module AExportData) thì nó báo lỗi thế này:
PHP:
Run-time error '-2147217900 (80040e14)
[Microsoft][ODBC Microsoft Access Driver] Syntax error in INSERT INTO statement.
Khi vào debug thì nó báo lỗi dòng này:
PHP:
TargetDetail.Open "INSERT INTO " & tblName & colHead & " VALUES " & rcdDetail, gcnAccess
Thiệt tình em cũng không hiểu, vì em làm y như thủ tục import invoice, chỉ thay đổi tham số rngHeader, rngDetails và tblName thôi, nhưng nó không chạy.

Các anh xem giúp em nhé. Em có đính kèm hai file.
Phải đăng ký DSN cho file access AMGSYS.mdb trước, sau đó mở file excel lên coi giúp em nhé (code trong module AExportData).
UserID: admin
PW: admin.

Thanks in advance.
 

File đính kèm

Lần chỉnh sửa cuối:
EM bẫy lỗi thử q dòng dữ liệu thì biến rcdDetail nó cho ra cú pháp đúng, nhưng không hiểu tại sao nó lại báo lỗi như thế khi import vào bảng GLDATA.
 
Sự khách biệt giữa hai cách import dữ liệu từ excel vào access

Các anh chị giúp em. Em đã tìm ra đoạn code để import từ excel vào access như sau:
http://www.utteraccess.com/forums/printthread.php?Cat=&Board=88&main=497117&type=thread

PHP:
'Cách 1:
Function InsertInto_GLDATA()
'Macro purpose: To add record to Access database using ADO and SQL
'NOTE:  Reference to Microsoft ActiveX Data Objects Libary required
'-------------------------------------------------------------------------------
Application.ScreenUpdating = False
Dim gcnAccess as New ADOB.connection
Dim gcnRecords as New ADOB.Recordset
Dim rngDetail As Range
Dim tblName As String
tblName = "GLDATA"

'-------------------------------------------------------------------------------
'Open connection to the database
Call ConnectToDatabase
'Chuan bi tien hanh import du lieu vao access
On Error GoTo EndUpdate
'-------------------------------------------------------------------------------
'Insert records into database from worksheet table
gcnAccess.BeginTrans

Set gcnRecords = New ADODB.recordset

For Each rngDetail In Range(Sheets("GLDATA").[a2], Sheets("GLDATA").[a65536].End(xlUp))
 gcnRecords.Open "Select Period,DocNbr,DocDate,DocDesc,DocAttached,DrAcct,CrAcct,CustVendID,InvtID,LineQty," & _
                                        "LineUP,LineAmt,Serial,InvcNbr,InvcDate,TaxRate,InvcDesc,ContactName,WorkCode,TaxID," & _
                                        "Division,CostCenter,CflwID,User,Date From " & tblName, gcnAccess, adOpenStatic, adLockPessimistic, adCmdText
 
With gcnRecords
         .AddNew  ' create a new record
 ' Add values to each field in the record
    .Fields("Period") = rngDetail.Value
    .Fields("DocNbr") = rngDetail(, 2).Value
    .Fields("DocDate") = rngDetail(, 3).Value
    .Fields("DocDesc") = rngDetail(, 4).Value
    .Fields("DocAttached") = rngDetail(, 5).Value
    .Fields("DrAcct") = rngDetail(, 6).Value
    .Fields("CrAcct") = rngDetail(, 7).Value
    .Fields("CustVendID") = rngDetail(, 8).Value
    .Fields("InvtID") = rngDetail(, 9).Value
    .Fields("LineQty") = rngDetail(, 10).Value
    .Fields("LineUP") = rngDetail(, 11).Value
    .Fields("LineAmt") = rngDetail(, 12).Value
    .Fields("Serial") = rngDetail(, 13).Value
    .Fields("InvcNbr") = rngDetail(, 14).Value
    .Fields("InvcDate") = rngDetail(, 15).Value
    .Fields("TaxRate") = rngDetail(, 16).Value
    .Fields("InvcDesc") = rngDetail(, 17).Value
    .Fields("ContactName") = rngDetail(, 18).Value
    .Fields("WorkCode") = rngDetail(, 19).Value
    .Fields("TaxID") = rngDetail(, 20).Value
    .Fields("Division") = rngDetail(, 21).Value
    .Fields("CostCenter") = rngDetail(, 22).Value
    .Fields("CflwID") = rngDetail(, 23).Value
    .Fields("User") = rngDetail(, 24).Value
    .Fields("Date") = rngDetail(, 25).Value
    .Update ' stores the new record
    .Close
    End With
Next
   a = MsgBox("Da cap nhat du lieu vao he thong thanh cong!", vbInformation, "Thong bao")
'-------------------------------------------------------------------------------------------------
EndUpdate:
    'Check if error was encounted
  If Err.Number <> 0 Then
      'Error encountered.  Rollback transaction and inform user
      On Error Resume Next
      gcnAccess.RollbackTrans
      MsgBox vbObjectError & "-" & Err.Number & "-" & Err.Description, vbCritical, "Error!"
  Else
      On Error Resume Next
      gcnAccess.CommitTrans
  End If
    
'Close the ADO objects
     gcnAccess.Close
    Set gcnRecords = Nothing
    Set gcnAccess = Nothing
    On Error GoTo 0
Application.ScreenUpdating = True
End Function

So sánh với đoạn code import trong module của em, không biết lỗi ở đâu:
PHP:
'Cách 2:
Function InsertInto_GLDATA()
'Macro purpose: To add record to Access database using ADO and SQL
'NOTE:  Reference to Microsoft ActiveX Data Objects Libary required
'-------------------------------------------------------------------------------
Dim colHead, rcdDetail As String
Dim rngHeader, rngDetail As Range
Dim NColumn As Integer
Dim NRow As Integer
Dim NotNull As Boolean
Dim tblName As String
Dim TargetDetail As New ADODB.recordset
Set rngHeader = Range("A1:Y1")
Set rngDetail = Range("A2:Y2")
tblName = "GLDATA"
'MsgBox rngDetail.Address & Chr(13) & rngHeader.Address, , "Thong bao"

'Truyen tham so cot can insert vao access:
'Ke noi chuoi cac cot trong cu pham Insert into tblTemp(column1, column2,column3,....)
colHead = " ("
    For NColumn = 1 To rngHeader.Count
        colHead = colHead & rngHeader.Columns(NColumn).Value
        Select Case NColumn
            Case Is = rngHeader.Count
                colHead = colHead & ")"
            Case Else
                colHead = colHead & ","
        End Select
    Next NColumn
    
 MsgBox "Insert into " & colHead & " From " & tblName, , "Thong bao" 'kietvt: Bay loi tai day
'-------------------------------------------------------------------------------
'Open connection to the database
Call ConnectToDatabase
'Chuan bi tien hanh import du lieu vao access
On Error GoTo EndUpdate
'-------------------------------------------------------------------------------
'Insert records into database from worksheet table
   gcnAccess.BeginTrans
    For NRow = 1 To rngDetail.Rows.Count
       'Assume record is completely Null, and open record string for concatenation
        NotNull = False
        rcdDetail = "('"

        'Evaluate field in the record
        For NColumn = 1 To rngHeader.Count
            Select Case rngDetail.Rows(NRow).Columns(NColumn).Value
                    'if empty, append value of null to string
                Case Is = Empty
                    Select Case NColumn
                        Case Is = rngHeader.Count
                            rcdDetail = Left(rcdDetail, Len(rcdDetail) - 1) & "'')" 'Neu gia tri null thi bo qua va cach nhau boi dau ")" trong truong hop cot cuoi cung
                        Case Else
                            rcdDetail = Left(rcdDetail, Len(rcdDetail) - 1) & ",'" 'Neu gia tri null thi bo qua va cach nhau boi dau ")" trong truong hop cot cuoi cung
                    End Select

                    'if not empty, set notNull to true, and append value to string
                Case Else
                    NotNull = True
                    Select Case NColumn
                        Case Is = rngHeader.Count
                            rcdDetail = rcdDetail & rngDetail.Rows(NRow).Columns(NColumn).Value & "')"
                        Case Else
                            rcdDetail = rcdDetail & rngDetail.Rows(NRow).Columns(NColumn).Value & "','"
                    End Select
                End Select
         Next NColumn
           MsgBox rcdDetail, , "Thongbao"    'kiet
        'If record consists of only Null values, do not insert it to table, otherwise
        'insert the record
        Select Case NotNull
            Case Is = True
                TargetDetail.Open "INSERT INTO " & tblName & colHead & " VALUES " & rcdDetail, gcnAccess
            Case Is = False
                'do not insert record
        End Select
    Next NRow
    a = MsgBox("Da cap nhat du lieu vao he thong thanh cong!", vbInformation, "Thong bao")

   
    
EndUpdate:
    'Check if error was encounted
    If Err.Number <> 0 Then
        'Error encountered.  Rollback transaction and inform user
        On Error Resume Next
        gcnAccess.RollbackTrans
        MsgBox vbObjectError & "-" & Err.Number & "-" & Err.Description, vbCritical, "Error!"
    Else
        On Error Resume Next
        gcnAccess.CommitTrans
    End If
    
'Close the ADO objects
     gcnAccess.Close
    Set TargetData = Nothing
    Set gcnAccess = Nothing
    On Error GoTo 0
End Function

Tuy nhiên cách 1 em đã import thành công vào access.
Còn với cách 2, em chỉ impor được vào table GLINVC, nhưng không import được vào table GLDATA, thiệt tình không hiểu? (vì cấu trúc lệnh INSERT INTO GLDATA (field1,field2,...,field n) em làm đúng mà!.....
Các anh chị giúp em với.
 
Em cũng đang muốn đưa dữ liệu từ 1 file Excel vào trong file cơ sở dữ liệu đã có sẵn của Access, anh chị có thể chỉ giúp em được không ?
 
To: ca_dafi,

Hai cách của em không có gì sai. Vậy vấn đề là chổ nào?
_ Cách một sẽ dễ hiểu hơn.
_ Cách hai em chú ý cho nếu giá trị là chuổi thì em phải đặt trong ''. Ví dụ:

INSERT INTO tb_Customer(CusId, CusName) VALUES(2, 'CA_DAFI')

Đó là lý do lỗi xãy ra khi em thực hiện theo cách hai.

Thông thường để nhập dữ liệu từ Excel vào Access chúng ta nên làm theo các bước sau (nếu có nhiều bảng cần phải đưa vào Access)
_ Thiết kế form giúp nhập liệu, giả sử tôi có form như hình sau:

Import1.jpg


Combobox1: nhằm tạo danh sách các bảng dữ liệu cần phải đưa vào bảng trong Access.
Combobox2: là danh sách các workbook đang mở hiện hành.
Combobox3: là danh sách các worksheet khi bạn chọn workbook tại combobox2.

Ngoài ra còn có các chức năng như: Kiểm tra tiêu đề của bảng dữ liệu nhập vào, Xóa dữ liệu của bảng trước khi nhập vào.

Và cuối cùng là thực hiện thao tác nhập vào.
Chú ý:
_Nếu bảng dữ liệu của bảng nhiều record thì việc nhập liệu vào sẽ hơi lâu.
_Nhằm tránh việc nhập dữ liệu không đúng như kiểu dữ liệu trong Access, bạn nên kiểm tra trước hoặc kiểm tra trước khi nhập vào.

Xin tham khảo code của tập tin form ở trên.

Vài kinh nghiệm xin chia sẻ.

Lê Văn Duyệt
 

File đính kèm

Excel và Access

Trên GPE cũng đã có rất nhiều bài viết về làm việc trên Ex và đưa dữ liệu lưu trữ vào trong Ac. Khi đó việc kết nối CSDL là một việc làm quan trọng nhất. Cũng có nhiều cao thủ đã chỉ ra việc kết nối CSDL và chủ yếu là dùng kết nối bằng ADO. Việc kết nối CSDL bằng ADO là hoàn chỉnh nhất và đúng cho mọi việc kết nối, nhưng không phải ai cũng rành rẽ về việc này. Hôm nay xin giới thiệu với các bạn một cách kết nối đơn giản với một file Access từ Ex mà bạn nào cũng có thể làm được dựa vào việc định nghĩa một không gian làm việc của Ac và đưa CSDL Ac vào không gian làm việc đó rồi từ đ1o chúng ta dùng các lệnh, hàm của Ac mà xử lý dữ liệu. Để làm được việc này, trước hết trong cửa sổ VBE của Ex, bạn vào Tools/References chọn các thư viện động sau đây :
1/ Microsoft Access 11.0 Ofject Library
2/ Microsoft DAO 3.6 Ofject Library
3/ Microsoft Visual Basic for Applications Extensibility 5.3
Sau đó, để có thể làm việc được với CSDL Ac, trong Modul của Ex, các bạn định nghĩa như sau :

PHP:
Dim dtbAc As Database
Dim strTen As String
Set strTen = "D\BaiTap\Data.mdb"
Set dtbAc = DBEngine.Workspaces(0).OpenDatabase(strTen)

Bằng việc định nghĩa như vậy, bây giờ bạn có thể vô tư vọc Ac ngay trên Ex rồi đấy. Đây là cách mà tôi vẫn thường dùng và dùng từ thời còn là Ac 2.0. Bài sau tôi sẽ hướng dẫn các bạn dùng các lệnh và hàm của Ac để truy vấn và xử lý dũ liệu trong CSDL Ac và đưa ra Ex
Chúc các bạn thực hành tốt
Thân
 
Trên GPE đã có rất nhiều cách trình bày về khai thác xử lý dữ liệu từ Ac đưa ra Ex. Các bạn có thể dùng các lệnh đưa nguyên cả một table hay một query trong Ac ra Ex, có thể dùng Query của Ex để lấy dữ liệu, và cũng có thể dùng A_Tools của Mr.Tuân… Ở đây tôi trình bày cách sử dụng ngay query của Ac và các hàm người dùng viết trong Ex để lấy dữ liệu. Cụ thể tôi sẽ trình bày cách làm để có thể lấy dữ liệu về tồn quỹ tiền mặt của cơ sở dữ liệu Data.mdb ở trên và đưa ra Excel.
Trước hết ta chuẩn bị như sau :

1/ Giả sử trong CSDL Data.mdb, các bạn có dử liệu của 2 table tblPhieuThuChi và tblPhieuChiTiet với các trường như sau .
Table tblPhieuThuChi :
+ RecKey – Text – 20 (Primarykey -Yes (No Duplicates))
+ Ngay – Date/Time
+ SoCT – Text – 6
+ LoaiCT – Text – 2
+ DienGiai – Text – 100
Table tblPhieuChiTiet :
+ RecKey – Text – 20(Index - Yes (Duplicates OK))
+ TKDU – Text – 6
+ SoTien – Number – Double
Và dĩ nhiên hai khóa RecKey phải được kết nối theo dạng Một – Nhiều, các table đã có dữ liệu. Cách nhập liệu có thể nhập trực tiếp hoặc tham khảo file đính kèm ở cuối bài

2/ Các bạn tạo hai query sau :
+ qryChiTietTruoc : Câu lệnh SQL của nó là
PHP:
SELECT tblPhieuThuChi.RecKey, tblPhieuThuChi.Ngay, tblPhieuThuChi.SoCT, tblPhieuThuChi.LoaiCT, tblPhieuThuChi.DienGiai, tblPhieuChiTiet.TKDU, tblPhieuChiTiet.SoTien
FROM tblPhieuThuChi INNER JOIN tblPhieuChiTiet ON tblPhieuThuChi.RecKey = tblPhieuChiTiet.RecKey
WHERE (((tblPhieuThuChi.Ngay)<[TuNgay]));
Query này sẽ sử dụng để tính tồn quỹ đầu kỳ

+ qryChiTietTrong : Câu lệnh SQL của nó là
PHP:
SELECT tblPhieuThuChi.RecKey, tblPhieuThuChi.Ngay, tblPhieuThuChi.SoCT, tblPhieuThuChi.LoaiCT, tblPhieuThuChi.DienGiai, tblPhieuChiTiet.TKDU, tblPhieuChiTiet.SoTien
FROM tblPhieuThuChi INNER JOIN tblPhieuChiTiet ON tblPhieuThuChi.RecKey = tblPhieuChiTiet.RecKey
WHERE (((tblPhieuThuChi.Ngay) Between [TuNgay] And [DenNgay]));
Query này sẽ sử dụng để lấy các dữ liệu phát sinh trong kỳ báo cáo

3/ Đồng thời các bạn cũng tạo thêm 2 table nữa như sau :
a/ Table tblTonDau chỉ có một Field duy nhất : TonDau – Number – Double
b/ Table tblChiTiet gồm các trường sau :
+ Ngay – Date/Time
+ SoCT – Text – 6
+ LoaiCT – Text – 2
+ DienGiai – Text – 100
+ TKDU – Text – 6
+ SoTien – Number – Double
Vậy là ta đã chuẩn bị xong nguyên liệu, dụng cụ cần thiết. Tiếp theo ta sẽ xào nấu các món ăn dựa vào các nguyên vật liệu đã chuẩn bị trên đây
Lưu ý : các table và query này các bạn tạo trong Access
 
Dưới đây là các hàm người dùng để lấy dữ liệu(Viết trong modul của Excel)


1/ Hàm xóa Table
PHP:
Function XoaTab(TabName As String)
    Dim TenFile As String
    TenFile = "D:\BaiTap\Data.mdb"
    Dim Tien As Database
    Set Tien = DBEngine.Workspaces(0).OpenDatabase(TenFile)
    Dim ThisTab As Recordset
    Set ThisTab = Tien.OpenRecordset(TabName, dbOpenTable)
    If ThisTab.RecordCount > 0 Then
        ThisTab.MoveFirst
        Do Until ThisTab.EOF
            ThisTab.Delete
            ThisTab.MoveNext
        Loop
    End If
End Function

2/ Hàm tính tồn quỹ đầu kỳ
PHP:
Function TinhTonDau(TruocNgay)
    Dim TenFile As String
    Dim Tien As Database
    Dim NK As Recordset
    Dim Ton As Recordset
    Dim QNK As QueryDef
    TenFile = "D:\BaiTap\Data.mdb"
    Set Tien = DBEngine.Workspaces(0).OpenDatabase(TenFile)
    Set QNK = Tien.QueryDefs("qryChiTietTruoc")
    QNK.Parameters("TuNgay") = TruocNgay
    Set NK = QNK.OpenRecordset()
    Set Ton = Tien.OpenRecordset("tblTonDau", dbOpenTable)
    On Error Resume Next
    If Ton.RecordCount > 0 Then Call XoaTab("tblTonDau")
    TonDK = 0
    If NK.RecordCount > 0 Then
        NK.MoveFirst
        Do Until NK.EOF
            If NK!LoaiCT = "PT" Then
                TonDK = TonDK + NK!SoTien
            Else
                TonDK = TonDK - NK!SoTien
            End If
            NK.MoveNext
        Loop
    End If
    Ton.AddNew
    Ton!TonDau = TonDK
    Ton.Update
    Ton.Close: Set Tien = Nothing
End Function


3/ Hàm Lấy dữ liệu phát sinh trong kỳ
PHP:
Function SoQuy(TuNgay, DenNgay)
    Dim TenFile As String
    Dim Tien As Database
    Dim NKTC As Recordset
    Dim NK As Recordset
    Dim QNK As QueryDef
    TenFile = "D:\BaiTap\Data.mdb"
    Set Tien = DBEngine.Workspaces(0).OpenDatabase(TenFile)
    Set QNK = Tien.QueryDefs("qryChiTietTrong")
    QNK.Parameters("TuNgay") = TuNgay
    QNK.Parameters("DenNgay") = DenNgay
    Set NKTC = QNK.OpenRecordset()
    Set NK = Tien.OpenRecordset("tblChiTiet", dbOpenTable)
    On Error Resume Next
    If NK.RecordCount > 0 Then Call XoaTab("tblChiTiet")
    If NKTC.RecordCount > 0 Then
        NKTC.MoveFirst
        Do Until NKTC.EOF
            NK.AddNew
            NK!Ngay = NKTC!Ngay
            NK!SoCT = NKTC!SoCT
            NK!LoaiCT = NKTC!LoaiCT
            NK!DienGiai = NKTC!DienGiai
            NK!TKDU = NKTC!TKDU
            NK!SoTien = NKTC!SoTien
            NK.Update
            NKTC.MoveNext
        Loop
    End If
    NK.Close: NKTC.Close: Set Tien = Nothing
End Function

Vậy là ta đã xào nấu xong các món ăn ngon theo ý thích của mình. Bây giờ ta sẽ bày bàn ăn và dọn các món ăn ngon lên bàn Excel để chiêu đãi bạn bè nhé
 
Lần chỉnh sửa cuối:
Đưa dữ liệu từ Access ra Excel

Để có được bàn thức ăn ngon mời bạn bè, các bạn chuẩn bị dọn chén đũa, bàn ghế như sau (Mục đích là mở một file SoQuyTienMat.xls mẫu trong máy chưa có số liệu gì và dùng hàm người dùng để ghi các số liệu đã chuẩn bị sẵn trên đây vào file excel này)

1/ Hàm mở file Excel có sẵn trong máy
PHP:
Function MoFileEx(ExTaiLieu As String)
    Dim ExTen As String
    Dim Ex As Workbook
    ExTen = TimFile(ExTaiLieu)
    Set Ex = GetObject(ExTaiLieu)
    Ex.Application.Windows(ExTen).Visible = True
    Set Ex = Nothing
End Function

2/ Hàm tìm tên một file từ một đường dẫn cho trước
PHP:
Function TimFile(TenFile As String)
    Dim n As Integer
    For n = Len(TenFile) To 1 Step -1
        ViTri = Mid(TenFile, n, 1)
        If ViTri = "\" Then
            Exit For
        End If
    Next
    TimFile = Right(TenFile, Len(TenFile) - n)
End Function

3/ Hàm lấy dữ liệu trong Access và đưa vào file Exel mẫu
PHP:
Function LocSoQuy()
    Dim TenFile As String
    Dim Tien As Database
    Dim NK As Recordset
    Dim Ton As Recordset
    TenFile = "D:\BaiTap\Data.mdb"    
    Set Tien = DBEngine.Workspaces(0).OpenDatabase(TenFile)
    Set NK = Tien.OpenRecordset("tblChiTiet", dbOpenTable)
    Set Ton = Tien.OpenRecordset("tblTondau", dbOpenTable)    
    Dim SoQuy As String
    SoQuy = "D:\Luu\So Quy Tien Mat.xls"    
    Call MoFileEx(SoQuy)                     ‘ Mở File Excel mẫu
    Cells(2, 4) = S00.NgayDau             ‘ Lấy giá trị NgayDau đặt vào ô D2
    Cells(3, 4) = S00.NgayCuoi            ‘ Lấy giá trị NgayCuoi đặt vào ô D3
    If Ton.RecordCount > 0 Then
        Cells(3, 6) = Ton!TonDau           ‘ Lấy giá trị Tồn Đầu Kỳ đa75t vào ô F3
    End If    
    If NK.RecordCount > 0 Then
        NK.MoveFirst
        Dim m As Long, n As Long          ‘ Lấy giá trị phát sinh đặt vào ô tương ứng
        For m = 1 To NK.RecordCount
            n = Range("F5000").End(xlUp).Row
            Cells(n + 1, 1) = NK!Ngay
            Cells(n + 1, 2) = NK!SoCT
            Cells(n + 1, 3) = NK!LoaiCT
            Cells(n + 1, 4) = NK!DienGiai
            Cells(n + 1, 5) = NK!TKDU
            If NK!LoaiCT = "PT" Then
                Cells(n + 1, 6) = NK!SoTien
                Cells(n + 1, 7) = 0
            Else
                Cells(n + 1, 7) = NK!SoTien
                Cells(n + 1, 6) = 0
            End If
            NK.MoveNext
        Next
    End If
    Call FormatDongSoQuy    
    NK.Close: Ton.Close: Set Tien = Nothing
End Function
 
Để hàm LocSoQuy hoạt động được, trong file Excel kết nối với Access, bạn có một Sheet đặt tên là S00, trên đó có hai textbox tên là NgayDau và NgayCuoi, một commandbuton có tên là Loc để gọi hàm LocSoQuy như sau :

PHP:
Sub Loc_Click()
    Application.ScreenUpdating = False    
    TuNgay = S00.NgayDau.Value
    DenNgay = S00.NgayCuoi.Value
    Call TinhTonDau(TuNgay)
    Call SoQuy(TuNgay, DenNgay)
    Call LocSoQuy
    Application.ScreenUpdating = True
End Sub

Và thêm hàm FormatDongSoQuy như sau(Mục đích là kẻ dòng và tính tổng) :
PHP:
Function FormatDongSoQuy()
‘ Kẻ dòng
    Range("A6:G" & Range("G1000").End(xlUp).Row).Select
    With Selection
        .Borders(xlEdgeLeft).LineStyle = xlContinuous
        .Borders(xlEdgeTop).LineStyle = xlContinuous
        .Borders(xlEdgeBottom).LineStyle = xlContinuous
        .Borders(xlEdgeRight).LineStyle = xlContinuous
        .Borders(xlInsideVertical).LineStyle = xlContinuous
         If Range("G1000").End(xlUp).Row > 6 Then
            .Borders(xlInsideHorizontal).LineStyle = xlDot
         End If
    End With
    Range("A" & Range("G1000").End(xlUp).Row + 1 & ":E" & Range("G1000").End(xlUp).Row + 2).Select
    With Selection
        .Borders(xlEdgeLeft).LineStyle = xlContinuous
        .Borders(xlEdgeTop).LineStyle = xlContinuous
        .Borders(xlEdgeBottom).LineStyle = xlContinuous
        .Borders(xlEdgeRight).LineStyle = xlContinuous
        .Borders(xlInsideHorizontal).LineStyle = xlContinuous
    End With
    Range("F" & Range("G1000").End(xlUp).Row + 1 & ":G" & Range("G1000").End(xlUp).Row + 2).Select
    With Selection
        .Borders(xlEdgeLeft).LineStyle = xlContinuous
        .Borders(xlEdgeTop).LineStyle = xlContinuous
        .Borders(xlEdgeBottom).LineStyle = xlContinuous
        .Borders(xlEdgeRight).LineStyle = xlContinuous
        .Borders(xlInsideHorizontal).LineStyle = xlContinuous
        .Borders(xlInsideVertical).LineStyle = xlContinuous
    End With
 
‘ Tính tổng Thu
    Range("F" & Range("G1000").End(xlUp).Row + 1).Select
    ActiveCell.Value = Application.WorksheetFunction.Sum(Range("F6:F" & Range("G1000").End(xlUp).Row))
    ActiveCell.Font.Bold = True
    ActiveCell.NumberFormat = "#,##0"
 
‘Tính tổng Chi
    Range("G" & Range("G1000").End(xlUp).Row + 1).Select
    ActiveCell.Value = Application.WorksheetFunction.Sum(Range("G6:G" & Range("G1000").End(xlUp).Row))
    ActiveCell.Font.Bold = True
    ActiveCell.NumberFormat = "#,##0"
 
‘Ghi chữ Cộng ở dòng Tổng Phát Sinh
    Range("D" & Range("G1000").End(xlUp).Row).Select
    ActiveCell.Value = S00.Cells(5, 1)           ‘ Chữ Cộng ở ô A5
    ActiveCell.Font.Bold = True
    ActiveCell.HorizontalAlignment = xlRight
 
‘Tính tồn cuối kỳ            
    Range("F" & Range("F1000").End(xlUp).Row + 1).Select
    ActiveCell.FormulaR1C1 = "=R3C6+R" & Range("F1000").End(xlUp).Row & "C6-R" & Range("G1000").End(xlUp).Row & "C7"
    ActiveCell.Font.Bold = True
    ActiveCell.NumberFormat = "#,##0"
    Range("D" & Range("F1000").End(xlUp).Row).Select
    ActiveCell.Value = S00.Cells(6, 1)            ‘ Chữ Tồn Quỹ Cuối Kỳ ở ô A6 
    ActiveCell.Font.Bold = True
    ActiveCell.HorizontalAlignment = xlRight
End Function

Vậy là ta đã có một Sổ Quỹ Tiền Mặt được bày trên bàn Excel. Các bạn có thể thưởng thức món ăn này do tay bạn tự chế biến, xào nấu và trưng bày sản phẩm. Vì là số liệu được xử lý thông qua hàm người dùng và đưa vào file mẫu nên khi muốn lưu lại, các bạn tuyệt đối không được nhấn Save vì như vậy sẽ làm hỏng file nguồn, lần sau không sử dụng được nữa. Các bạn phải dùng Save As để lưu ra một tên khác

Chú ý rằng trên đây là món ăn được chế biến khi không gặp phải bất cứ một sự cố nào như nguyên vật liệu chưa được rửa sạch sẽ trước khi chế biến, lửa to, thiếu gia vị….Vì thế các bạn cần phải thêm các bẫy lổi cần thiết như File không tồn tại, Đường dẫn tới file không đúng, File đã được mở nhưng vẫn cố tình nhấn nút, thậm chí có thể dùng lệnh ngăn không cho người dùng Save File mà chỉ có thể Sava as mà thôi……Rất nhiều nơi cần phải bẫy lỗi. Các bạn có thể tham khảo file đính kèm ở cuối bài

Thôi, hôm nay thế đã, ngày mai lại hầu các bác tiếp(hôm nay quên không đem theo file đính kèm)
Chúc cuối tuần vui vẻ
Thân
 
query sử dụng hàm nz() trong access

Chào anhphuong,

Mình có câu hỏi như sau :

Nếu trong query có sử dụng hàm NZ() trong access thì từ excel có thể lấy được dữ liệu của query này hay ko?

(vì từ access thì xuất ra excel vẫn bình thường cho dù query có sử dụng hàm nz() cũng không có vấn đề khi export)

Nếu có bạn gửi cho mình 1 ví dụ tham khảo


Thanks,
BinhTâm




2/ Các bạn tạo hai query sau :
+ qryChiTietTruoc : Câu lệnh SQL của nó là
PHP:
SELECT tblPhieuThuChi.RecKey, tblPhieuThuChi.Ngay, tblPhieuThuChi.SoCT, tblPhieuThuChi.LoaiCT, tblPhieuThuChi.DienGiai, tblPhieuChiTiet.TKDU, tblPhieuChiTiet.SoTien
PHP:
[font=Verdana]FROM tblPhieuThuChi INNER JOIN tblPhieuChiTiet ON tblPhieuThuChi.RecKey = tblPhieuChiTiet.RecKey[/font]
[font=Verdana]WHERE (((tblPhieuThuChi.Ngay)<[TuNgay]));[/font]
Query này sẽ sử dụng để tính tồn quỹ đầu kỳ

+ qryChiTietTrong : Câu lệnh SQL của nó là
PHP:
SELECT tblPhieuThuChi.RecKey, tblPhieuThuChi.Ngay, tblPhieuThuChi.SoCT, tblPhieuThuChi.LoaiCT, tblPhieuThuChi.DienGiai, tblPhieuChiTiet.TKDU, tblPhieuChiTiet.SoTien
PHP:
[font=Verdana]FROM tblPhieuThuChi INNER JOIN tblPhieuChiTiet ON tblPhieuThuChi.RecKey = tblPhieuChiTiet.RecKey[/font]
[font=Verdana]WHERE (((tblPhieuThuChi.Ngay) Between [TuNgay] And [DenNgay]));[/font]
Query này sẽ sử dụng để lấy các dữ liệu phát sinh trong kỳ báo cáo
 
To: Bác Phương,

Em góp ý hàm xóa bảng (table) của Bác.
Nếu xóa theo điều kiện thì quét qua các record để xóa. Còn nếu xóa hết thì chỉ cần
"DELETE * FROM Table;" là xong. Chứ còn nếu bảng mà có nhiều dữ liệu quá thì cách của Bác e rằng hơi bị lâu.
Ngoài ra anh có dùng hàm
Mã:
[B]Function[/B] FormatDongSoQuy()
Sao em thấy không trả về gì cả? Nếu vậy đây chỉ là một thủ tục mà thôi.
Trong hàm này anh có dùng nhiều phương thức
Mã:
Select, ActiveCell
, em nghĩ không nên dùng chúng vì nó sẽ làm chậm chương trình.

Lê Văn Duyệt
 
Lần chỉnh sửa cuối:
Cho tôi hỏi tại sao khi chạy code này:

Dim dtbAc
As Database
Dim strTen
As String
Set strTen
= "D:\BaiTap\Data.mdb"
Set dtbAc = DBEngine.Workspaces(0).OpenDatabase(strTen)

máy báo lổi là:
Error in loading DLL (Error 48)

Tôi đã tham chiếu 3 thư viện này rồi:
1/Microsoft Access 11.0 Ofject Library
2/ Microsoft DAO 3.6 Ofject Library
3/ Microsoft Visual Basic for Applications Extensibility 5.3

cám ơn!
 
Lần chỉnh sửa cuối:
Cho tôi hỏi tại sao khi chạy code này:

Dim dtbAc
As Database
Dim strTen
As String
Set strTen
= "D:\BaiTap\Data.mdb"
Set dtbAc = DBEngine.Workspaces(0).OpenDatabase(strTen)

máy báo lổi là:
Error in loading DLL (Error 48)

cám ơn!

Bạn đã tham chiếu đến các thư viện mà anhphuong đã đề cập đến trong thread #1 chưa?

Lê Văn Duyệt
 
Tôi đã tham chiếu 3 thư viện rồi

1/Microsoft Access 11.0 Ofject Library

2/ Microsoft DAO 3.6 Ofject Library
3/ Microsoft Visual Basic for Applications Extensibility 5.3
 
Như vậy có thể các file này của bạn bị hỏng.

Lê Văn Duyệt


1/Microsoft Access 11.0 Ofject Library
2/ Microsoft DAO 3.6 Ofject Library
3/ Microsoft Visual Basic for Applications Extensibility 5.3

3 file này không có bị hỏng. Tôi đã thử trên nhiều máy khác mà vẫn bị là sao ?
 
Dear All!
Thành thật xin lỗi mọi người vì thời gian qua bận nhiều việc nên không kịp trả lời các bạn. Với câu hỏi của transongngocquan, tôi xin trả lời như sau :

1/ Lỗi chủ yếu ở đây là do thư viện DAO 306 nằm không đúng vị trí nên gây lỗi Error load DLL.

2/ Bạn vào Tools\References rà tìm đến thư viện Microsoft DAO 3.6 Ofject Library và xem nó nằm ở thư mục nào trong máy.

3/ Bạn mở Explore tìm đến địa chỉ trên, coppy thư viện dao 360.dll vào trong C:\WINDOWS\system32 xong khởi động lại máy tính.

Bây giờ bạn có thể tung hoành được rồi đó. Chỉ khi bạn đăng ký với Windows thì lỗi sẽ không xảy ra nữa.
Chúc bạn thành công.
Thân.
 
Lần chỉnh sửa cuối:
Báo lổi undefined function 'IsInternational' in expression

Cho tôi hỏi tại sao lại báo lổi "undefined function 'IsInternational' in expression" khi thực hiện đoạn code như sau bên dưới. Cách khắc phục như thế nào?


1.Open the sample database Northwind.mdb in Microsoft Access.

2.Create a module and type the following procedure:
Mã:
Function IsInternational(strCountry As String) As String         
           If strCountry = "USA" Then            
                 IsInternational = "Local" 
           Else            
                 IsInternational = "Intl"         
           End If      
End Function

3.Create a new query based on the Customers table as follows:
Query: qryExcelTest --------------------------------------
Type: Select Query
Field: CompanyName Table:
Customers Field: Country Table:
Customers Field: Expr1: IsInternational([Country])

4.Quit Microsoft Access.

5.In Microsoft Excel, create a new workbook.

6.On the Tools menu, point to Macros, and then click Visual Basic Editor. In the Visual Basic Editor, insert a new module sheet by clicking Module on the Insert menu. Type the following sample macro (Sub procedure).
Mã:
Sub xlTest()         
       Dim db As Database
       rs1 As Recordset         
       Dim qry As QueryDef         
       Set db = Workspaces(0).OpenDatabase _ 
               ("C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb")     
 [COLOR="Blue"]      ' Replace the above path with the correct path to the _       
    ' sample Northwind.mdb database on your computer.  [/COLOR]       
       Set qry = db.QueryDefs("qryExcelTest")         
       Set rs1 = qry.OpenRecordset 
       rs1.MoveLast         
       rs1.Close         
      db.Close      
End Sub

7.On the Tools menu, click References. Click to select the "Microsoft DAO 3.5 Object Library" check box, and then click OK.




Nếu tôi mở file Northwind.mdb bằng Access lên thì khi chạy thủ tục xlTest trong exel thì được. Còn nếu không mở file Northwind.mdb bằng Access thì chạy thủ tục xlTest thì báo lổi:
Mã:
run-time error '3085'
undefined function 'IsInternational' in expression

Mong các các bạn chỉ giúp làm sao không cần mở bằng Access mà vẫn chạy được thủ tục xlTest ?

Cám ơn rất nhiều !
 
Chỉnh sửa lần cuối bởi điều hành viên:
Không mở Access thì không có module tạo từ Access nên không thể có hàm IsInternational, sao bạn không viết hàm này trong 1 Module của excel?
 
Viết trong Module của excel làm sao mà sử dụng trong query của Access được ?
 
Đúng là không thể sử dụng đối tượng Query mà bạn tạo ra từ Access. Nhưng bạn hoàn toàn có thể viết lại câu Query để truy vấn bảng Access từ excel mà. Còn hàm viết trong Module của Access mà không mở Access thì không thể sử dụng trong Excel.
 
Nói như rollover79 là đúng. Sao bạn không sử dụng ngay query cua Ac để truy vấn dữ liệu rồi lấy dữ liệu đó đưa ra Ex ?. Bạn tham khảo lại bài viết của mình nhé
Thân
 
Đúng là không thể sử dụng đối tượng Query mà bạn tạo ra từ Access.

Tôi xin lấy một ví dụ, trong Access tôi có tạo ra một query: Q_Count_Extra_P001
Vậy trong Excel kết hợp với ADO, tôi có thể dùng Query đó như sau:
Mã:
sSQL = "SELECT * " & _
           "FROM Q_Count_Extra_P001; "

Và dựa vào Recordset tôi có thể lấy dữ liệu về dựa trên Query ở trên

Mã:
Set adoResSap = QueryRecords(gcnAccess, sSQLSap)


Lê Văn Duyệt
 
Lần chỉnh sửa cuối:
Theo như tôi biết thì Access có nhiều loại Query, ngoài Query dạng SELECT(lúc đó được coi như 1 bảng), còn có các dạng query UPDATE, DELETE, INSERT,... Vậy nếu tôi có 1 đối tượng Query để thêm dữ liệu vào 1 bảng, bạn có thể cho tôi xin đoạn code để dùng đối tượng query đó ko?
Thanks!
 
Trích từ ebook ADO toàn tập:
Mã:
Sub SimpleCmd3() 
   Dim Cmd As New ADODB.Command 
   Dim RS As New ADODB.Recordset 
   Cmd.ActiveConnection = FileDS 
   Cmd.CommandText = "CustomerCount" [b]'Có thể là tên của table, view hay [COLOR="Red"]query[/COLOR] [/b]
   Cmd.Execute 
   RS.Open Cmd 
   MsgBox RS(0) 
End Sub

Như vậy với đoạn mã trên bạn có thể thực hiện các Query có sẵn trong Access.

Lê Văn Duyệt
 
Để có thể sử dụng hàm từ tạo trong access, ta phải mở Database của access ra như sau:
Mã:
Sub xlTest()
       Dim AC As Access.Application
       Set AC = New Access.Application
       AC.OpenCurrentDatabase "C:\Program Files\Microsoft _
            Office\Office\Samples\Northwind.mdb" , False, False

       Dim db As Database
       rs1 As Recordset         
       Dim qry As QueryDef         

       Set db = AC.DBEngine.Workspaces(0).OpenDatabase _ 
               ("C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb")     
 [COLOR=Blue]      ' Replace the above path with the correct path to the _       
    ' sample Northwind.mdb database on your computer.  [/COLOR]       
       Set qry = db.QueryDefs("qryExcelTest")         
       Set rs1 = qry.OpenRecordset 
       rs1.MoveLast         
       rs1.Close         
      db.Close      
      AC.CloseCurrentDatabase
End Sub


Như vậy thì cái hàm IsInternational trong access có thể chạy được rồi.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Đang là vấn đề em quan tâm, nhưng các bác cứ cho em xin 2 file ví dụ: data.mdb và So Quy Tien Mat.xls để em ngâm cứu dần dần ợ.
 
Các bác thử đọc thêm hướng dẫn bằng tiếng Anh, có lẽ hữu ích đó.
 

File đính kèm

Thanks bạn đã chia sẽ
 
Chuyển dữ liệu từ query của acces sang excel

Tôi có dữ liệu trong access muốn chuyển dữ liệu từ query sang excel để làm báo cáo như file đính kèm mong các bạn chỉ
xin cám ơn
 
Lần chỉnh sửa cuối:
Gửi theo File đính kèm

Tôi chưa pót được bài mẫu lên cho các bạm nay tôi gửi file đính kèm
 

File đính kèm

Tôi có dữ liệu trong access muốn chuyển dữ liệu từ query sang excel để làm báo cáo như file đính kèm mong các bạn chỉ
Thì bạn tạo 1 form trong đó bạn tạo 1 nút command button sau đó tạo 1 macro với action là OutputTo trong Obejecttype bạn chọn query, Object name bạn chọn query cần mở. Phần Output Format bạn chọn Ms Excel97-2003. Phần Auto start chọn Yes.Lưu macro lại. Chạy
Mình kém diễn đạt, bạn nên đưa file lên mình sẽ xem cho nhéThân
Bạn xem bài này nhe
http://www.giaiphapexcel.com/forum/showthread.php?t=22218&page=2
Thân
 
Lần chỉnh sửa cuối:
Muốn dữ liệu trong Excel thay đổi khi dữ liệu trong access thay đổi

Tôi có dữ liệu trong access và được xuất sang Excel. Muốn khi dữ liệu trong acces thay đổi thì dữ liệu trong excel cũng thay đổi theo. Rất mong các bạn chỉ giùm
Xin Cám ơn!
 
Muốn dữ liệu Excel thay đổi thì dữ liệu đó phải link vào table của access:

- File - Open - File type = All datasource - chọn file mdb, OK - OK
- Trên thanh công cụ External data, nhấn nút Property
- click chọn vào các ô refresh on open, refresh every ... và gõ số phút mong muốn vào.

ExternaldataProperty.gif
 
Theo yêu cầu của Trang Tuyết Ngọc, tôi bổ sung hướng dẫn các bước thực hiện để mở access từ excel:
- File - Open - chọn File type là All Data source hoặc MS Access đều được

attachment.php


- Khi nhấn Open, phải nhấn tiếp Open trong cái hộp thoại thông báo này

attachment.php


- Chọn 1 trong các table của file access, và OK

attachment.php


- Kết quả
attachment.php


- Làm tiếp bước Property ở bài trên.
 

File đính kèm

  • External01.gif
    External01.gif
    15.3 KB · Đọc: 248
  • External02.gif
    External02.gif
    6.5 KB · Đọc: 235
  • External03.gif
    External03.gif
    11.3 KB · Đọc: 230
  • External04.gif
    External04.gif
    10.3 KB · Đọc: 234
Lần chỉnh sửa cuối:
chào bạn Lê Văn Duyệt,

hiện nay tôi cũng đang tự mình viết được một file quản lý tồn kho bằng access. nói chung là đáp ứng được nhu cầu công việc hiện tại tuy nhiên cũng gặp khó khăn khi nhập liệu vào file access từ file excel. việc ghi nhận dữ liệu nhập hàng chúng tôi dùng máy quét barcode để thu thập nên cũng khá tiện: itemcode, ngày sản xuất, mã vị trí chứa hàng, số lô trong ngày... tuy nhiên khi nhập vào access thì rất lâu vì chúng tôi chỉ copy và dán vào form nhập liệu trong access. nguyên nhân là trong form nhập liệu chúng tôi có thiết kế một số macro để kiểm tra dữ liệu vào. đôi khi máy bị treo luôn, đặc biệt khi số lượng dữ liệu tương đối lớn. bên cạnh đó một số báo cáo thiết lập bằng pivottable chạy rất chậm. có hướng nào khác phục tốc độ khi nhập liệu không? mỗi record chúng tôi có 5 thông tin và mỗi lần truy nhập có khoảng 400 đến 500 record.
Rất mong nhận được sự giúp đỡ của bạn.

Chân thành cám ơn.

Hung Hue
 
Chào bạn, Xuất dữ liệu từ Query sang Excel thô thì đây là code

1. Select dữ liệu
'Tim kiem SQL
On Error Resume Next
RS.Close
Dim SQL As String
RS.CursorLocation = adUseClient
SQL = "Select * from QLHS where" & " " & Me.Combo1.Text & " " & _
"Like" & " '" & Trim(Me.Text1.Text) & "%'" & " And" & " " _
& Me.Combo2.Text & " " & "like " & " '" & Trim(Me.Text2.Text) & "%'" & "" & "order by MA_PHONG ASC" & ""
'MsgBox "Cau lenh la " & " " & SQL
RS.Open SQL, DB, adOpenDynamic, adLockOptimistic
Set DataGrid1.DataSource = RS
DataGrid1.Refresh

2. Xuất dữ liệu từ Biến RS (một Recordset sang Excel)


Private Sub Cmd_xuat_excel_Click()
On Error Resume Next
Dim i, j As Integer
Dim str1 As String
i = 0
j = 0
With CommDial1
.CancelError = True
.ShowSave
str1 = .filename
End With
Dim createExcel As New Excel.Application
Dim Wbook As Excel.Workbook
Dim Wsheet As Excel.Worksheet
Set Wbook = createExcel.Workbooks.Add
Set Wsheet = Wbook.Worksheets.Add

For i = 0 To RS.Fields.Count - 1
Wsheet.Cells(1, i + 1).Value = RS.Fields(i).Name
Next i
If (RS.RecordCount > 0) Then
RS.MoveFirst
For i = 0 To RS.RecordCount - 1
For j = 0 To RS.Fields.Count - 1
Wsheet.Cells(i + 2, j + 1).Value = RS(j).Value
Next j
RS.MoveNext
Next i
End If
Wbook.SaveAs str1
Wbook.Protect "minh"
Wbook.Close True
Set createExcel = Nothing
Set Wbook = Nothing
Set Wsheet = Nothing
Set Wbook = createExcel.Workbooks.Open(str1)
createExcel.Visible = True
Exit Sub
End Sub
 
Lần chỉnh sửa cuối:
cập nhật dữ liệu từ excel vào access (code sai chỗ nào)

PHP:
Option Compare Database
 Const cnn = "Provider = Microsoft.ACE.OLEDB.12.0;" & "Data Source=C:\Documents and Settings\Administrator\Desktop\ket noi\test1.xlsx;" & "Extended Properties = Excel 12.0"
Sub get_Edata()
Dim myCn As String, mySql As String
Dim myRc As ADODB.Recordset
Dim myTb As ADODB.Recordset

myCn = cnn
mySql = "select*from[sheet1$]"
Set myRc = New ADODB.Recordset
myRc.Open mySql, myCn, adOpenStatic, adLockReadOnly
Set myTb = New ADODB.Recordset
myTb.Open "tbldulieu", CurrentProject.Connection, adOpenDynamic, adLockOptimistic, adCmdTable
 Do Until myRc.EOF
    myTb.AddNew
    myTb!ID = myRc!ID
    myTb!maKH = myRc!maKH
    myTb!TenKH = myRc!TenKH
    myTb!Diachi = myRc!Diachi
    myTb!Dienthoai = myRc!Dienthoai
    myTb!Congty = myRc!Congty
    myTb!DienthoaiCT = myRc!DienthoaiCT
    myTb!Mahang = myRc!Mahang
    myTb!Soluong = myRc!Soluong
    myTb!Dongia = myRc!Dongia
    myTb!Thanhtien = myRc!Thanhtien
    myTb!MaNV = myRc!MaNV
    myTb!Mavung = myRc!Mavung
    myTb!Sohoadon = myRc!Sohoadon
    myTb.Update
    myRc.MoveNext
 Loop
 End Sub
em dùng đoạn code (học được từ diễn đàn) này để cập nhật dữ liệu từ excel vào access, khi chạy chương trình không báo lỗi nhưng dữ liệu không cập nhật vào bảng tbldulieu được.
Các bác chỉ giúp em sai ở chỗ nào với ạ -+*/.
Thanks
 
Chỉnh sửa lần cuối bởi điều hành viên:
Mình không thấy connect của Access đâu cả
 
Option Compare Database
Const cnn = "Provider = Microsoft.ACE.OLEDB.12.0;" & "Data Source=C:\Documents and Settings\Administrator\Desktop\ket noi\test1.xlsx;" & "Extended Properties = Excel 12.0"
Sub get_Edata()
Dim myCn As String
Dim myRc As ADODB.Recordset
Dim myTb As ADODB.Recordset
Dim mySql As String
myCn = cnn
mySql = "select*from[sheet1$]"
Set myRc = New ADODB.Recordset
myRc.Open mySql, myCn, adOpenStatic, adLockReadOnly
Set myTb = New ADODB.Recordset
myTb.Open "tbldulieu", CurrentProject.Connection, adOpenDynamic, adLockOptimistic, adCmdTable
Do Until myRc.EOF
myTb.AddNew
myTb!ID = myRc!ID
myTb!maKH = myRc!maKH
myTb!TenKH = myRc!TenKH
myTb!Diachi = myRc!Diachi
myTb!Dienthoai = myRc!Dienthoai
myTb!Congty = myRc!Congty
myTb!DienthoaiCT = myRc!DienthoaiCT
myTb!Mahang = myRc!Mahang
myTb!Soluong = myRc!Soluong
myTb!Dongia = myRc!Dongia
myTb!Thanhtien = myRc!Thanhtien
myTb!MaNV = myRc!MaNV
myTb!Mavung = myRc!Mavung
myTb!Sohoadon = myRc!Sohoadon
myTb.Update
myRc.MoveNext
Loop
End Sub

em dùng đoạn code (học được từ diễn đàn) này để cập nhật dữ liệu từ excel vào access, khi chạy chương trình không báo lỗi nhưng dữ liệu không cập nhật vào bảng tbldulieu được.
Các bác chỉ giúp em sai ở chỗ nào với ạ -+*/.
Thanks


1/ Chuỗi kết nối : Nếu viết trên một hàng thì bỏ dấu &, nếu viết xuống hàng thì thiếu dấu gạch dưới

PHP:
Const cnn = "Provider= Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=C:\Documents and Settings\Administrator\Desktop\ket noi\test1.xlsx;" & _
"Extended Properties=Excel 12.0"

2/ myTb.Open "tbldulieu", CurrentProject.Connection, adOpenDynamic, adLockOptimistic, adCmdTable

Dư thừa adCmdTable

3/ Sau khi copy dữ liệu xong, nhớ giải phóng bộ nhớ
 
Lần chỉnh sửa cuối:
em đã sửa lại theo hướng dẫn của các bác, mặc dù sau khi chạy code đã cập nhật dữ liệu nhưng dũ liệu đã cập nhật bị thiếu, một số cột bị blank. Không hiểu lý do vì sao ??? Các bác giải thích giúp em với, không biết lỗi đó có khắc phục được không ???.
Thanks
 
em đã sửa lại theo hướng dẫn của các bác, mặc dù sau khi chạy code đã cập nhật dữ liệu nhưng dũ liệu đã cập nhật bị thiếu, một số cột bị blank. Không hiểu lý do vì sao ??? Các bác giải thích giúp em với, không biết lỗi đó có khắc phục được không ???.
Thanks

Bạn gửi file Excel lên tôi xem giùm cho
Thân
 
Đưa dữ liệu Excel vào access

Em có làm một tran web về ASP, em cũng đang design 1 trang xem điểm của học sinh. Bi giờ Em có rất nhiều cơ sỡ dữ liệu excel khác nhau nhưng cùng một form, mỗi file excel lại có rất nhiều trường. Bi h em có thể đưa nó vào access với các trường dữ liệu em đã làm sẵn trong nhiều table , em sẽ làm thế nào để kết nối và đưa những dữ liệu vào trong access và mọi người có thể chi tiết dùm không do em hơi gà về vấn để này.
 
Option Compare Database
Const cnn = "Provider = Microsoft.ACE.OLEDB.12.0;" & "Data Source= duong dan \ten file excel;" & "Extended Properties = Excel 12.0" (đây là đối với excel 2007)
Sub get_Edata()
Dim myCn As String
Dim myRc As ADODB.Recordset
Dim myTb As ADODB.Recordset
Dim mySql As String
myCn = cnn
mySql = "select*from[sheet1$]"
Set myRc = New ADODB.Recordset
myRc.Open mySql, myCn, adOpenStatic, adLockReadOnly
Set myTb = New ADODB.Recordset
myTb.Open [ten table can nhap du lieu trong csdl access], CurrentProject.Connection, adOpenDynamic, adLockOptimistic
Do Until myRc.EOF
myTb.AddNew
myTb![ten cot trong excel] = myRc!ten truong trong bảng access]
....
....
....
myTb.Update
myRc.MoveNext
Loop
Set myTb = Nothing
End Sub

tôi dùng code này (học từ hướng dẫn của bác levanduyet) để cập nhật dữ liệu từ excel vào access. Bạn xem có ứng dụng được không. %#^#$
 
mình đặt code này trong cái nào của access và mổi lần khởi động lên là nó tự update hay sao
 
nó báo lỗi dòng này là sao, mình đang sài excel 2003. myRc.Open mySql, myCn, adOpenStatic, adLockReadOnly
Mình gởi ai coi dùm rồi chỉnh dùm mình nha, cả cấu truc file excel luôn
 

File đính kèm

  • khoa.zip
    khoa.zip
    19.2 KB · Đọc: 40
  • khoa.jpg
    khoa.jpg
    13 KB · Đọc: 22
Lần chỉnh sửa cuối:
Hình như bạn khai báo sai về connect string. Cái này tôi dùng append 1 bảng của excel vào 1 bảng của access, nếu bạn nối nhiều bảng thì phải tạo ra nhiều connect string (1,2,3,4....) rồi sử dụng từng cái một để cập nhạt dữ liệu từ excel vào access. Bạn nên tải file ADO toàn tập của bác Duyệt về mà nghiên cứu thêm.
Link đây http://www.giaiphapexcel.com/forum/showthread.php?p=82680#post82680
 
Lần chỉnh sửa cuối:
Bảng của bạn có khóa chính là ID, bạn set ID là Auto number, dữ liệu bên Excel của bạn cũng có trường ID, theo mình nghĩ hoặc là bạn sửa lại ID trong Access không phải là Auto number mà là number để ghi lại từ Excel, hoặc là bạn bỏ hẳn trường ID bên Excel đi mà để lại trường ID bên Access cho nó tự động đánh số.

Bạn tham khảo code bên dưới, nó nhập tất cả các file Excel có trong đường dẫn cho trước với tên là Sheet1, Bạn nên chỉnh đường dẫn cho hợp lý nhé.

Mã:
Private Sub Command0_Click()
 Dim strPathFile As String, strFile As String, strPath As String
        Dim strTable As String
        Dim blnHasFieldNames As Boolean
        blnHasFieldNames = True
        strPath = "C:\Le Phat Dom\STUDY\ACCESS\" [COLOR=darkgreen]'Đường dẫn đến file Excel của bạn[/COLOR]
        strTable = "tbldulieu"
        strFile = Dir(strPath & "*.xls")
        Do While Len(strFile) > 0
              strPathFile = strPath & strFile
              DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _
              strTable, strPathFile, blnHasFieldNames, "SHEET1!"
              strFile = Dir()
        Loop
        MsgBox "Da nhap xong du lieu ", vbExclamation, "Nhap du lieu tu Excel"
        
End Sub

Bạn tham khảo thêm file nhe.
Thân
 

File đính kèm

Ah bạn ơi, cách này là nó lấy tất cả các file excel để nó import ah, vậy thì tuyệt lắm, nhưng vấn đề ở chổ 1 sheet của mình lại có rất nhiều vùng, mình muốn copy từng vùng như thế, vậy mình phải làm sao đây
 
Ah bạn ơi, cách này là nó lấy tất cả các file excel để nó import ah, vậy thì tuyệt lắm, nhưng vấn đề ở chổ 1 sheet của mình lại có rất nhiều vùng, mình muốn copy từng vùng như thế, vậy mình phải làm sao đây
Bạn copy vùng ở sheet1 thì sửa lại như sau:
Mã:
[COLOR=red]'....[/COLOR]
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _
              strTable, strPathFile, blnHasFieldNames, "SHEET1![COLOR=red][B]A1:B200[/B][/COLOR]" 'Ở đây giả sử tôi copy vùng [B][COLOR=#ff0000]A1:B200 ở Sheet1[/COLOR][/B]
 
[COLOR=red]'....[/COLOR]
Bạn Test thử nhé
Thân
 
ah còn một vấn đề nhỏ nữa, file access bạn có thiết lập gì khác ngoài viết code không. Mình còn muốn hỏi là trong 1 sheet mình có nhiều vùng dữ liệu làm như trên rồi, và nhiều vùng này lại có nhiều table để chứa dữ liệu đó. vậy mình lập code nhiều lần lập lại với code thay đổi ít ít ah
 
ah còn một vấn đề nhỏ nữa, file access bạn có thiết lập gì khác ngoài viết code không. Mình còn muốn hỏi là trong 1 sheet mình có nhiều vùng dữ liệu làm như trên rồi, và nhiều vùng này lại có nhiều table để chứa dữ liệu đó. vậy mình lập code nhiều lần lập lại với code thay đổi ít ít ah
File mình gửi không có thiết lập gì nhiều chỉ tạo nút bấm, các thuộc tính trên form, nhưng nó không ảnh hưởng gì đến code, nó chỉ làm cho đẹp thôi.
Theo mình nghĩ, theo yêu cầu của bạn thì có nhiều vùng nhập liệu trên sheet, mỗi vùng khác nhau đưa vào Table khác nhau, cái này bạn nên làm là mỗi table là 1 code riêng ứng với code đó là 1 option để nhập. Nói cách khác là bạn muốn nhập Table nào thì click lựa chọn Table đó.
Thân
 
bạn có rõ về cái ứng với mỗi lúc kich vào table thì nó sẽ ra code nhập tương ứng không, mình cũng có rất nhiều file excel có cấu trúc giống nhau muốn nhập vào các trường khác nhau của file access, nhưng mỗi trường lại có liên quan tới nhau, khi nhập vào 1 table thì nó sẽ sinh ra ID tự động ID này chính là cái mà table khác dùng để dựa vào ID để lấy dữ liệu, vậy nếu nhập vào từng table thì việc ID bên này và nhập ID bên table kia làm sao, có phải mình phải dùng code nào đó để đọc ID bên này nhập qua ID bên kia theo đúng điều kiện ko, mình rất khó hiểu chổ này, mong bạn giúp mình
 
bạn có rõ về cái ứng với mỗi lúc kich vào table thì nó sẽ ra code nhập tương ứng không, mình cũng có rất nhiều file excel có cấu trúc giống nhau muốn nhập vào các trường khác nhau của file access, nhưng mỗi trường lại có liên quan tới nhau, khi nhập vào 1 table thì nó sẽ sinh ra ID tự động ID này chính là cái mà table khác dùng để dựa vào ID để lấy dữ liệu, vậy nếu nhập vào từng table thì việc ID bên này và nhập ID bên table kia làm sao, có phải mình phải dùng code nào đó để đọc ID bên này nhập qua ID bên kia theo đúng điều kiện ko, mình rất khó hiểu chổ này, mong bạn giúp mình
Như mình đã nói ở bài số #7 vấn đề đau đầu là ID với các mối quan hệ trong bảng, tùy trường hợp mình khắc phục thôi.
Trường hợp của bạn mình nghĩ ID phải tạo từ excel quá, và dĩ nhiên trường ID bên Access của bạn phải chỉnh lại cho nó tương thích với trường ID bên Excel là text hoặc number chứ không phải Auto number nhé.
 
Cách bổ xung exel vào Access không trùng lặp

Mình có fỉle ví dụ nhờ các bác chỉ dẫn dùm mình: file exel khi mình đổ làm đầu tiên vào Table1 (file Access) thì không sao nhưng khi mình bổ sung dòng mới vào file Exel thì khi đổ lần 2 vào bảng thì nó nhân đôi các dònglúc trước đã đổ vào rồi và bổ sung thêm dòng mới. Vậy có cách nào dựa trên file của mình đã làm khi đổ lần 2 sẽ không nhân đôi các dòng trước đã đổ không ? Mong các bác giúp đễ
 

File đính kèm

Lần chỉnh sửa cuối:
Mình mới đăng ký vào diễn đàn.thấy các bạn rất giỏi lập trình trên access!mình cũng muốn học nhưng tìm nhiều sách rồi, đọc và thử nhưng cũng không có gì ổn cả!xin hãy chỉ cho mình cách học access ổn ổn một chút nha!cám ơn các bạn nhiều lắm!các bác nào có kinh nghiệm mail cho mình theo địa chỉ: thpttanyen@gmail.com
 
Cách đơn giản nhất là xóa trống Table Ac trước khi đổ dữ liệu mới. Có thể làm thủ công hoặc VBA để làm
 
Mình có fỉle ví dụ nhờ các bác chỉ dẫn dùm mình: file exel khi mình đổ làm đầu tiên vào Table1 (file Access) thì không sao nhưng khi mình bổ sung dòng mới vào file Exel thì khi đổ lần 2 vào bảng thì nó nhân đôi các dònglúc trước đã đổ vào rồi và bổ sung thêm dòng mới. Vậy có cách nào dựa trên file của mình đã làm khi đổ lần 2 sẽ không nhân đôi các dòng trước đã đổ không ? Mong các bác giúp đễ
Cho mình hỏi thêm là bạn nhập dữ liệu lần 2 vào bằng cách nào vậy bạn ?
 
Các bạn ơi tôi mới tập tễnh tự học Access nên cũng coi như chưa biết gì. Có vấn đề sau nhờ các bạn biết chỉ giúp và thật chi tiết giùm nhe.
Tôi lặp một bản tính số liệu công tơ điện, tôi muốn biết tháng nầy so với tháng trước công tơ đếm được bao nhiêu Kwh điện thì tôi phải dùng hàm gì? Cách thức nhập. xin được cảm ơn trước nhe.
 
to bác lopop và bác libero bác nên liên hệ với bác solomon 2211 ấy, tui nghe giang hồ đồn bác ấy là cao thủ access đấy. goodluck!
 

Bài viết mới nhất

Back
Top Bottom