Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Hướng dẫn] Hàm kiểm tra dữ liệu để import dữ liệu từ excel vào access
#1
Mình có một file nguồn excel được xuất ra từ hệ thống hàng ngày(không thay đổi format được). Bây giờ mình muốn import vào access để xử lý dữ liệu.
Vấn đề gặp phải là dữ liệu file excel có một cột CODE(cột E file ví dụ) format từ hệ thống đang là number nhưng dữ liệu lại có một số dòng là text. Nên khi import các dòng này không import được.
Nhờ mọi người hướng dẫn tạo một hàm bằng VBA để kiểm tra tự động import theo dữ liệu mà không phải chỉnh lại format của file excel.
Mình có làm một hàm nhỏ để kiểm tra dữ liệu nhưng vẫn không import được. Rất mong mọi người giúp đỡ.
Mã:
Public Function ConvertNumberToText(ByVal txtnumber As String) As String
[/color]
If IsNumeric(Val(txtnumber)) = True Then
   ConvertNumberToText = Format(CStr(txtnumber), "00000000")
Else
   ConvertNumberToText = CStr(txtnumber)
End If
[color=#141414]End Function

File ví dụ https://www.mediafire.com/file/2e8dje1g3...9.zip/file
Chữ ký của subasatran Xin chào, mình là subasatran, Tham gia http://thuthuataccess.com/forum từ ngày 18-12 -14.
Reply
Những người đã cảm ơn
#2
để đơn giản hơn thì bạn tạo bảng tạm với kiểu text hết, cho import vào bảng này rồi check trên bảng tạm này nếu dữ liệu ok thì move sang bảng chính.
Dữ liệu vào bảng tạm trên access thì check dễ hơn so với check từ file excel.
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#3
(04-11-18, 12:47 PM)subasatran Đã viết: Mình có một file nguồn excel được xuất ra từ hệ thống hàng ngày(không thay đổi format được). Bây giờ mình muốn import vào access để xử lý dữ liệu.
Vấn đề gặp phải là dữ liệu file excel có một cột CODE(cột E file ví dụ) format từ hệ thống đang là number nhưng dữ liệu lại có một số dòng là text. Nên khi import các dòng này không import được.
Nhờ mọi người hướng dẫn tạo một hàm bằng VBA để kiểm tra tự động import theo dữ liệu mà không phải chỉnh lại format của file excel.
Mình có làm một hàm nhỏ để kiểm tra dữ liệu nhưng vẫn không import được. Rất mong mọi người giúp đỡ.
Mã:
Public Function ConvertNumberToText(ByVal txtnumber As String) As String
[/color]
If IsNumeric(Val(txtnumber)) = True Then
   ConvertNumberToText = Format(CStr(txtnumber), "00000000")
Else
   ConvertNumberToText = CStr(txtnumber)
End If
[color=#141414]End Function

File ví dụ https://www.mediafire.com/file/2e8dje1g3...9.zip/file

Sử dung hàm ImportExcel này:
Mã PHP:
Function ImportExcel(TenTable As StringDuongdanFile As StringTenSheet As StringTongSoCot As Byte)
    Dim oEx As New Excel.Application     ' oEx la bien oExcel
    Dim oBook As Workbook              ' 
set oBook la tap hop oExcel
    
' Mo file can chen
    Set oBook = oEx.Workbooks.Open(DuongdanFile)
    ' 
Mo Sheet can chen
    Dim oSheet 
As Worksheet                 ' set oSheet la tap hop Sheet
    Set oSheet = oBook.Worksheets(TenSheet)

    ' 
Dem so dongso cot
        Dim DongThunhat
CotThunhatDongCuoiCungCotCuoicung As Long
        With oSheet
.UsedRange
            DongThunhat 
7         'Dòng dữ liệu bắt đầu lấy
            CotThunhat = 1              '
Cột bắt đầu lấy
            DongCuoiCung 
= .Rows(UBound(.Value)).Row
            CotCuoicung 
TongSoCot             'Tổng số cột cần lấy
        End With
    Dim rst As Recordset
    Set rst = CurrentDb.OpenRecordset(TenTable, dbOpenTable)
    Dim i As Long
    Dim j As Long
    ' 
Duyet tu dong thu 7 den dong cuoi cung
    
For DongThunhat To DongCuoiCung
        rst
.AddNew
        
' duyet tu cot thu nhat den cot cuoi cung
        For j = CotThunhat To CotCuoicung
            rst.Fields(j - CotThunhat) = oSheet.Cells(i, j)
'
            Debug.Print oSheet.Cells(ij)
        Next
        
If rst.Fields(0) <> "" Then rst.Update
    Next
    oBook
.Close False
    Set oEx 
Nothingrst.Close
    
End 
Function 


Và đây là cú pháp để gọi hàm ImportExcel

Mã PHP:
Function Napdulieu()
On Error GoTo Loi
Dim LinkFile 
As String
LinkFile 
CurrentProject.Path "\test.xlsx"

    ImportExcel "Test_Get_Data"LinkFile"Sheet1"12
    MsgBox 
"Nap du lieu thanh cong?"vbInformation"Thông báo"
ThoatLoi:
    Exit Function
Loi:
    MsgBox "Loi: Vui long kiem tra lai danh sach tren file Excel cua ban da nhap day du chua?"vbInformation"Thông báo"
    Resume ThoatLoi
End 
Function 

Đính kèm Demo theo bài bạn. Nếu bạn muốn trói buộc thì có thể làm theo 2 cách nửa:
+ Viết class cho table
+ Chỉnh lại đoạn duyệt For Next phía trên theo Fields tương ứng



Hy vọng giúp được phần nào!
Thân mến!


File đính kèm
.zip   Demo_Import Du lieu tu Excel.zip (Kích cỡ: 36.55 KB / Tải về: 7)
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#4
bài này dùng Workbooks.Open nếu file Excel mà dữ liệu nhiều hay dung lượng lớn mở lên thôi cũng thấy rất lâu rồi
sao không dùng ADO lấy lên xong ghi vào TableName nó sẻ nhanh hơn đấy
Tại mạnh thấy bài này úp bên GPE Mạnh làm cho là ghi từ Excel vào Access nay qua đây thấy vậy nên mới nghĩ ra xài ADO để lấy từ Excel lên Access
Reply
Những người đã cảm ơn maidinhdan
#5
Nếu không có tuỳ chọn cột nào mà import toàn bộ Sheet Excel thì bạn dùng:

DoCmd.TransferSpreadsheet acImport, , "Test_Get_Data", "D:\Test\Test.xlsx", True, "A6:L6535"

Chú ý là tên field trong table Access phải trùng với tên cột trong file Excel.
Cách này này nó sẽ import toàn bộ không loại bỏ các dòng dạng Text.
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn maidinhdan
#6
Bạn dùng thử link table chưa?
Vì mình chỉ cần link table thôi, nếu soure path không đổi, file name không đổi thì hàng ngày mình chỉ cần refresh lại link là được mà?
Đâu cần import gì đâu cho mất công?
Chữ ký của duynamvnn1208 duynamvnn1208,gia nhập Thủ Thuật Access từ 25-06 -17.
Reply
Những người đã cảm ơn
#7
(05-11-18, 09:14 PM)maidinhdan Đã viết:
(04-11-18, 12:47 PM)subasatran Đã viết: Mình có một file nguồn excel được xuất ra từ hệ thống hàng ngày(không thay đổi format được). Bây giờ mình muốn import vào access để xử lý dữ liệu.
Vấn đề gặp phải là dữ liệu file excel có một cột CODE(cột E file ví dụ) format từ hệ thống đang là number nhưng dữ liệu lại có một số dòng là text. Nên khi import các dòng này không import được.
Nhờ mọi người hướng dẫn tạo một hàm bằng VBA để kiểm tra tự động import theo dữ liệu mà không phải chỉnh lại format của file excel.
Mình có làm một hàm nhỏ để kiểm tra dữ liệu nhưng vẫn không import được. Rất mong mọi người giúp đỡ.
Mã:
Public Function ConvertNumberToText(ByVal txtnumber As String) As String
[/color]
If IsNumeric(Val(txtnumber)) = True Then
   ConvertNumberToText = Format(CStr(txtnumber), "00000000")
Else
   ConvertNumberToText = CStr(txtnumber)
End If
[color=#141414]End Function

File ví dụ https://www.mediafire.com/file/2e8dje1g3...9.zip/file

Sử dung hàm ImportExcel này:
Mã PHP:
Function ImportExcel(TenTable As StringDuongdanFile As StringTenSheet As StringTongSoCot As Byte)
    Dim oEx As New Excel.Application     ' oEx la bien oExcel
    Dim oBook As Workbook              ' 
set oBook la tap hop oExcel
    
' Mo file can chen
    Set oBook = oEx.Workbooks.Open(DuongdanFile)
    ' 
Mo Sheet can chen
    Dim oSheet 
As Worksheet                 ' set oSheet la tap hop Sheet
    Set oSheet = oBook.Worksheets(TenSheet)

    ' 
Dem so dongso cot
        Dim DongThunhat
CotThunhatDongCuoiCungCotCuoicung As Long
        With oSheet
.UsedRange
            DongThunhat 
7         'Dòng dữ liệu bắt đầu lấy
            CotThunhat = 1              '
Cột bắt đầu lấy
            DongCuoiCung 
= .Rows(UBound(.Value)).Row
            CotCuoicung 
TongSoCot             'Tổng số cột cần lấy
        End With
    Dim rst As Recordset
    Set rst = CurrentDb.OpenRecordset(TenTable, dbOpenTable)
    Dim i As Long
    Dim j As Long
    ' 
Duyet tu dong thu 7 den dong cuoi cung
    
For DongThunhat To DongCuoiCung
        rst
.AddNew
        
' duyet tu cot thu nhat den cot cuoi cung
        For j = CotThunhat To CotCuoicung
            rst.Fields(j - CotThunhat) = oSheet.Cells(i, j)
'
            Debug.Print oSheet.Cells(ij)
        Next
        
If rst.Fields(0) <> "" Then rst.Update
    Next
    oBook
.Close False
    Set oEx 
Nothingrst.Close
    
End 
Function 


Và đây là cú pháp để gọi hàm ImportExcel

Mã PHP:
Function Napdulieu()
On Error GoTo Loi
Dim LinkFile 
As String
LinkFile 
CurrentProject.Path "\test.xlsx"

    ImportExcel "Test_Get_Data"LinkFile"Sheet1"12
    MsgBox 
"Nap du lieu thanh cong?"vbInformation"Thông báo"
ThoatLoi:
    Exit Function
Loi:
    MsgBox "Loi: Vui long kiem tra lai danh sach tren file Excel cua ban da nhap day du chua?"vbInformation"Thông báo"
    Resume ThoatLoi
End 
Function 

Đính kèm Demo theo bài bạn. Nếu bạn muốn trói buộc thì có thể làm theo 2 cách nửa:
+ Viết class cho table
+ Chỉnh lại đoạn duyệt For Next phía trên theo Fields tương ứng


Hy vọng giúp được phần nào!
Thân mến!
Có Code nào khi mình lấy dữ liệu lên TableName thì nó tự động Refresh All không bạn Nhỉ ... thay vì phải làm thủ công trên Menu  Access
Reply
Những người đã cảm ơn
#8
(10-11-18, 04:53 PM)kieu manh Đã viết: ...
Có Code nào khi mình lấy dữ liệu lên TableName thì nó tự động Refresh All không bạn Nhỉ ... thay vì phải làm thủ công trên Menu  Access

Chưa hiểu ý bạn Kieu manh vụ "Refresh All làm thủ công...". Bạn nói rõ hơn chút đi.
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#9
(10-11-18, 11:24 PM)ongke0711 Đã viết:
(10-11-18, 04:53 PM)kieu manh Đã viết: ...
Có Code nào khi mình lấy dữ liệu lên TableName thì nó tự động Refresh All không bạn Nhỉ ... thay vì phải làm thủ công trên Menu  Access

Chưa hiểu ý bạn Kieu manh vụ "Refresh All làm thủ công...". Bạn nói rõ hơn chút đi.

Ý mình nói là khi ta dùng code lấy dữ liệu lên TableName xong rồi nhưng nhìn vào TableName đó chưa thấy có dữ liệu mà phải thao tác thủ công là bấm vào Refresh All trên Menu Access ấy thì dữ liệu trên TableName nó mới Show ra thì mới nhìn thấy được
Reply
Những người đã cảm ơn
#10
(11-11-18, 07:50 AM)kieu manh Đã viết: Ý mình nói là khi ta dùng code lấy dữ liệu lên TableName xong rồi nhưng nhìn vào TableName đó chưa thấy có dữ liệu mà phải thao tác thủ công là bấm vào Refresh All trên Menu Access ấy thì dữ liệu trên TableName nó mới Show ra thì mới nhìn thấy được


Nếu theo như file demo của bạn maidinhdan thì khi bấm nút lấy dữ liệu thì dữ liệu đã được load về table rồi. 
- Nếu bạn mở table đó lên trước để xem khi bấm nút lấy dữ liệu thì sau khi load về dữ liệu không cập nhật trên màn hình thôi. Mọi truy vấn đối với table đó vẫn có dữ liệu.
- Nếu bạn muốn hiển thị dữ liệu cập nhật lên trên màn hình luôn thì chỉ cần thêm Requery cho Form hay SubForm là được rồi.
       Me.Requery
   Me.SubForm.Requery
Me: đại diện cho Form có Source là table vừa nạp dữ liệu.
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn kieu manh


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  [Thủ Thuật] Demo Tổng hợp tất cả các kiểu thông báo tiếng việt trong Access maidinhdan 39 8,478 22-09-18, 12:40 PM
Bài mới nhất: NguyenDungAnh
  [Hỏi] Điền kết quả của 1 query từ Access sang Excel killitmore 0 215 21-08-18, 12:33 PM
Bài mới nhất: killitmore
  Sử dụng Class Module và Kết nối dữ liệu SQL SERVER trong Access VBA lehongduc 62 34,483 03-08-18, 12:41 PM
Bài mới nhất: Cuong Servenet
  [Hàm] [Demo] Hàm kiểm tra IP tắt hay mở maidinhdan 10 2,422 26-07-18, 04:27 PM
Bài mới nhất: Cuong Servenet
  Gửi tin nhắn SMS bằng Access lmthu 9 2,044 23-07-18, 07:09 PM
Bài mới nhất: tt1212

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ| PMA Nha Trang| Gỗ Acrylic Không Đường Line