Đình Phán > 25-05-21, 05:43 PM
Public Sub update_reg()
Dim strPath As String, strTable As String, strFile As String, strPathFile As String, tt As String, loai As String, sql As String
Dim ngay As String, ngaydt As String, ngay1 As String, ngay2 As String, dd As String, mm As String, yy As String, kenh As String
Dim DB As Database, Rec As Recordset, Rec1 As Recordset, Rec_setup As Recordset
Dim maxdd As String
DoCmd.SetWarnings 0
Set DB = CurrentDb()
kiemtra = True
strPath = Application.CurrentProject.Path & "\Reg\" 'Đu?ng d?n d?n file Excel c?a b?n
strFile = Dir(strPath & "*.xlsx")
'MsgBox ngay
Do While Len(strFile) > 0
strPathFile = strPath & strFile
If ton_tai_bang("tbl_temp") Then
DoCmd.DeleteObject acTable, "tbl_temp"
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "tbl_reg", strPathFile, -1 ' , "A6:A6"
Else
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, "tbl_reg", strPathFile, -1 ' , "A6:A6"
End If
ngay = Left(strFile, 4)
sql = "DELETE tbl_reg_accu.*, tbl_reg_accu.ngay FROM tbl_reg_accu WHERE (((tbl_reg_accu.ngay)='" & ngay & "'));"
DoCmd.RunSQL sql
sql = "INSERT INTO tbl_reg_accu ( ngay, BC_CODE, BTS_CODE, PRODUCT_CODE, [DATETIME], ISDN, IMEI, SHOP_CODE, STAFF_CODE, CHANNEL_NAME, NAME, [ZONE], DISTRICT, PROVINCE )"
sql = sql + " SELECT '" & ngay & "' AS ngay, Q_BTS.BC_code, tbl_reg.BTS_CODE, tbl_reg.PRODUCT_CODE, tbl_reg.DATETIME, tbl_reg.ISDN, tbl_reg.IMEI, tbl_reg.SHOP_CODE, tbl_reg.STAFF_CODE, tbl_reg.CHANNEL_NAME, tbl_reg.NAME, tbl_reg.ZONE, tbl_reg.DISTRICT, tbl_reg.PROVINCE"
sql = sql + " FROM Q_BTS INNER JOIN tbl_reg ON Q_BTS.BTS_code = tbl_reg.BTS_CODE;"
'taoquery "Q_1", sql
DoCmd.RunSQL sql
If ton_tai_bang("tbl_reg") Then
DoCmd.DeleteObject acTable, "tbl_reg"
End If
strFile = Dir()
xoa_bang_loi
DoCmd.SetWarnings 0
'xuly_dulieu_reg
Loop
DoCmd.SetWarnings -1
End Sub
Public Sub xuly_dulieu_reg1()
'On Error GoTo Err_Command135_Click
DoCmd.SetWarnings 0
'kenh = "Store"
Dim strPathFile As String, strFile As String, strPath As String
Dim strTable As String
Dim blnHasFieldNames As Boolean
Dim sql, sql1, sql2 As String
Dim ma As String
Dim DB As Database
Dim Rec As Recordset
Dim Rec1 As Recordset
Dim i, WordLength
Dim Character As String, LastCharacter As String, NewWord As String, Word As String
Set DB = CurrentDb()
Set Rec = DB.OpenRecordset("tbl_temp")
Word = Rec("F1")
WordLength = Len(Word)
NewWord = ""
For i = 1 To WordLength
Character = Mid(Word, i, 1)
If LastCharacter = "|" Or Character = "|" Then
sql = sql + "D" & NewWord & ", '' AS "
sql1 = sql1 + "D" & NewWord & ", "
NewWord = ""
Else
NewWord = NewWord & Character
LastCharacter = Character
End If
Next i
sql = "SELECT '' AS " & Left(sql, Len(sql) - 8) & " INTO tbl_reg;"
sql1 = Left(sql1, Len(sql1) - 2)
'taoquery "Q_1", sql
DoCmd.RunSQL sql
'Rec.Close
sql = "DELETE tbl_reg.* FROM tbl_reg;"
DoCmd.RunSQL sql
Set Rec1 = DB.OpenRecordset("tbl_reg")
Do Until Rec.EOF
Word = Rec("F1")
WordLength = Len(Word)
NewWord = ""
sql = ""
sql2 = ""
For i = 1 To WordLength
Character = Mid(Word, i, 1)
If LastCharacter = "|" Or Character = "|" Then
sql2 = sql2 + "'" & NewWord & "', "
NewWord = ""
Else
NewWord = NewWord & Character
LastCharacter = Character
End If
Next i
sql = "INSERT INTO tbl_reg (" & sql1 & ") " + "select " & Left(sql2, Len(sql2) - 2) & ";"
'MsgBox sql1
DoCmd.RunSQL sql
Rec.MoveNext
Loop
Rec.Close
DoCmd.SetWarnings 0
End Sub
ongke0711 > 25-05-21, 11:53 PM
(25-05-21, 05:43 PM)Đình Phán Đã viết: Do không đính kèm được file excel thô nên mô tả hơi khó chút ạ
Đình Phán > 26-05-21, 09:03 AM
(25-05-21, 11:53 PM)ongke0711 Đã viết:(25-05-21, 05:43 PM)Đình Phán Đã viết: Do không đính kèm được file excel thô nên mô tả hơi khó chút ạ
- Bạn upload file lên các trang miễn phí như: mediafire.com, googledrive... rồi copy link vào đây. Chia sẻ file Full thì mới download được.
- Bộ code này của bạn có hoạt động không vậy? Tôi nghi ngờ quá. Vòng lặp Do While từ biến của lệnh Dir() làm sao lặp được.
- Các code xử lý chuỗi (word, wordlength...) không có file cũng không hiểu chuỗi đó như thế nào, làm cái gì ...
- File xuất từ phầm mềm khác sau không xuất ra .CSV cho gọn nhẹ.
ongke0711 > 26-05-21, 07:35 PM
(25-05-21, 05:43 PM)Đình Phán Đã viết: Cụ thể em đang phải tổng hợp dữ liệu từ nhiều báo cáo xuất ra từ phần mềm. Sau đó xử lý dữ liệu để lên báo cáo.
Em đang có ý tưởng là sẽ nhập dữ liệu lên Access sau đó sử dụng ADO để truy xuất ra excel, vừa nhẹ mà quản lý được dữ liệu.
Trường hợp import vào Access, phải xử lý ở file excel thành dạng bảng chuẩn trước.
Em muốn import luôn dữ liệu thô vào, sau đó dùng VBA trong acccess để xử lý dữ liệu thô đó về dữ liệu chuẩn dạng Table.
Đình Phán > 26-05-21, 11:16 PM
Trích dẫn:Nếu bạn muốn xây dụng cái app dùng lâu dài, ít phải sửa đổi code thì nên xem lại nguồn dữ liệu, cách lấy dữ liệu sao cho các cấu trúc bảng dữ liệu thô chỉ có dòng và cột, nhất quán, không định dạng, không công thức, không merge cell v.v..
ongke0711 > 26-05-21, 11:46 PM
(26-05-21, 11:16 PM)Đình Phán Đã viết: Em chỉ được dùng dữ liệu từ các báo cáo như thế này thôi ạ.
Đây là file của 1 anh đồng nghiệp làm, em muốn học hỏi nhưng không được. Chính vì vậy em muốn hiểu việc xử lý dữ liệu thô trên Access như thế nào, do đọc code trên access em còn mù tịt quá.
Đình Phán > 27-05-21, 09:13 AM
Trích dẫn:Vậy bạn muốn giải thích code trong file này cho bạn hiểu phải không? Code quá trời, ngồi viết chú thích cũng đuối à.
Code file này cũng thuộc dạng lâu đời đây.
Về việc xử lý dữ liệu thô sau khi import vào Access, nó cũng giống như bạn làm thủ công trong Excel vậy nhưng thay vì làm bằng tay, bằng mắt thì dùng code VBA để thực hiện.
Vd: Sheet Excel có các dòng merge SubTotal, khi import vào table Access, các dòng này không hợp lệ nên phải xoá nó -> khi đó thì dùng code tìm chuỗi "SubTotal" trong cột nào đó -> nếu có thì xoá dòng đó đi. Thực hiện việc này mỗi khi duyệt qua từng dòng (record) trong Table.
Mỗi file Excel trong Folder của bạn thiết kế mỗi khác nên mỗi file có một cách xử lý khác nhau. CSDL không chuẩn hoá nó mệt chỗ đó.
Mà bạn có biết chút ít gì về VBA không?
File bạn gửi còn thiếu bảng tbl_reg.
Sub LuuDL_HLMT()
Dim strSQL As String
With Sheet1
strSQL = "INSERT INTO DataBanHang " & _
"SELECT F1 AS TENHANG,F2 AS DVT,F3 AS SOLUONG,F4 AS DONGIA,F5 AS THANHTIEN,F6 AS GHICHU,'" & _
.Range("G1") & "' AS SOHD,'" & .Range("G2") & "' AS NGAYHD,'" & .Range("B3") & "' AS KHACHHANG,'" & .Range("B4") & "' AS DIACHI,'" & .Range("F4") & "' AS DIENTHOAI " & _
"FROM [EXCEL 12.0;HDR=NO;Database=" & ThisWorkbook.FullName & "].[HD$B11:G25] WHERE F1 IS NOT NULL"
End With
With CreateObject("ADODB.Connection")
.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\db.accdb"
.Execute (strSQL)
End With
End Sub
ongke0711 > 27-05-21, 10:28 AM
Đình Phán > 27-05-21, 11:04 AM
(27-05-21, 10:28 AM)ongke0711 Đã viết: - Các file báo cáo Excel trong các folder của bạn có cố định thiết kế, vị trí cột, dòng bắt đầu dữ liệu không?
- Tên file có cố định không? hay theo nguyên tắc gì?
ongke0711 > 28-05-21, 03:10 PM