subasatran > 04-11-18, 12:47 PM
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
mrsiro > 04-11-18, 06:50 PM
maidinhdan > 05-11-18, 09:14 PM
(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
Function ImportExcel(TenTable As String, DuongdanFile As String, TenSheet As String, TongSoCot 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 dong, so cot
Dim DongThunhat, CotThunhat, DongCuoiCung, CotCuoicung 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 i = 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(i, j)
Next
If rst.Fields(0) <> "" Then rst.Update
Next
oBook.Close False
Set oEx = Nothing: rst.Close
End Function
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
kieu manh > 06-11-18, 09:33 AM
ongke0711 > 06-11-18, 01:29 PM
duynamvnn1208 > 07-11-18, 08:28 AM
kieu manh > 10-11-18, 04:53 PM
(05-11-18, 09:14 PM)maidinhdan Đã 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(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 String, DuongdanFile As String, TenSheet As String, TongSoCot 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 dong, so cot
Dim DongThunhat, CotThunhat, DongCuoiCung, CotCuoicung 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 i = 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(i, j)
Next
If rst.Fields(0) <> "" Then rst.Update
Next
oBook.Close False
Set oEx = Nothing: rst.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!
ongke0711 > 10-11-18, 11:24 PM
kieu manh > 11-11-18, 07:50 AM
(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.
ongke0711 > 11-11-18, 09:57 AM
(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