Đưa dữ liệu từ Array vào Table Access! (1 người xem)

Liên hệ QC

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

ThuNghi

Hãy cho rồi sẽ nhận!
Thành viên đã mất
Tham gia
16/8/06
Bài viết
3,808
Được thích
4,449
Tôi có nhờ Lão Chết Tiệt và anh Dép dzỏm làm cho 1 fie in hoá đơn. Từ đó tôi muốn vận dụng là từ file excel khi nhấn 1 nút thì mở acc và report để in nhưng có nhiều thắc mắc chưa làm được và tôi muốn vận dụng thêm nhiều cách thay vì GetData từ Acc.
1/ Đưa dữ liệu từ Array vào Table Access. Khi nhấn nút thì dữ liệu từ sh Data sẽ gán vào 1 array.
2/ Mở Acc.
3/ Xoá Table Data
4/ Gán Array trên vào Data.
Tạm thời các anh chị hướng dẫn giúp phần này. Xong phần này sẽ nhờ anh chị tiếp.
Xin cám ơn.
 

File đính kèm

Tôi có nhờ Lão Chết Tiệt và anh Dép dzỏm làm cho 1 fie in hoá đơn. Từ đó tôi muốn vận dụng là từ file excel khi nhấn 1 nút thì mở acc và report để in nhưng có nhiều thắc mắc chưa làm được và tôi muốn vận dụng thêm nhiều cách thay vì GetData từ Acc.
1/ Đưa dữ liệu từ Array vào Table Access. Khi nhấn nút thì dữ liệu từ sh Data sẽ gán vào 1 array.
2/ Mở Acc.
3/ Xoá Table Data
4/ Gán Array trên vào Data.
Tạm thời các anh chị hướng dẫn giúp phần này. Xong phần này sẽ nhờ anh chị tiếp.
Xin cám ơn.

Việc này không nhất thiết phải bó buộc Array đâu. Chỉ cần sh Data có cấu trúc kiểu table, rồi dùng ADOX (không phải ADO đâu nhé) để xóa, tạo table và nhập vào là xong. Nếu các bác "Chết tiệt" gì đó đang làm thì chỉ cần nhúng ADOX, khai thác nó là được thôi.
 
Việc này không nhất thiết phải bó buộc Array đâu. Chỉ cần sh Data có cấu trúc kiểu table, rồi dùng ADOX (không phải ADO đâu nhé) để xóa, tạo table và nhập vào là xong. Nếu các bác "Chết tiệt" gì đó đang làm thì chỉ cần nhúng ADOX, khai thác nó là được thôi.
Mình đã làm File Excel Data có sheet Data theo chuẩn CSDL, chỉ cần dùng chức nămg import của Access là được (có thể dùng macro import).
Ý của ThuNghi là nhấn nút Excel, mở form Access, cập nhật dữ liệu mới từ Excel qua, rồi in. Điều này hoàn toàn có thể làm khi Open hoặc Load Form của Access, nhưng ThuNghi chê. (chắc chê chết tiệt, hoặc muốn xù Ken không trả).
 
Việc này không nhất thiết phải bó buộc Array đâu. Chỉ cần sh Data có cấu trúc kiểu table, rồi dùng ADOX (không phải ADO đâu nhé) để xóa, tạo table và nhập vào là xong. Nếu các bác "Chết tiệt" gì đó đang làm thì chỉ cần nhúng ADOX, khai thác nó là được thôi.
Vậy Tuân còn tiếc gì mà không làm cho 1 ví dụ. Cám ơn trước nhé.
To: Lão Chết Tiệt
Em đang muốn học hỏi để làm nhiều cách, muốn nhượng lại để lấy Ken chung Bác thì cũng phải biết mà HD người khác chớ. Lúc đó mà nhờ nữa thì nhiều Ken quá.
Cám ơn Bác.
Mày mò trên GPE ra cái file Tét của NDU và học vài chiêu viết code về ADOX để xóa Tbl Data nhưng không xóa được. Còn gán vào thì càng chưa biết.
Mong các anh chị hướng dẫn thêm.
PHP:
Sub XoaTbl()
  Dim objConn As ADODB.Connection, objCat As ADOX.Catalog, tbl As ADOX.Table
  On Error Resume Next
  myPath = ActiveWorkbook.Path & "\"
  myMDB = "InHDNew" & ".mdb"
  Set objConn = New ADODB.Connection
  objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
   "Data Source=" & myPath & myMDB & ";Jet OLEDB:Engine Type=5;"
  Set objCat = New ADOX.Catalog
  Set objCat.ActiveConnection = objConn
  For Each tbl In objCat.Tables
    If tbl.Name = "Data" Then
      objConn.Execute "DELETE tbl.* FROM tbl;"
      GoTo 1
    End If
  Next tbl
1:  objConn.Close
End Sub
Câu này có phái là xóa Tbl Data?
objConn.Execute "DELETE tbl.* FROM tbl;"
 
Lần chỉnh sửa cuối:
Vậy Tuân còn tiếc gì mà không làm cho 1 ví dụ. Cám ơn trước nhé.
To: Lão Chết Tiệt
Em đang muốn học hỏi để làm nhiều cách, muốn nhượng lại để lấy Ken chung Bác thì cũng phải biết mà HD người khác chớ. Lúc đó mà nhờ nữa thì nhiều Ken quá.
Cám ơn Bác.
Mày mò trên GPE ra cái file Tét của NDU và học vài chiêu viết code về ADOX để xóa Tbl Data nhưng không xóa được. Còn gán vào thì càng chưa biết.
Mong các anh chị hướng dẫn thêm.
PHP:
Sub XoaTbl()
  Dim objConn As ADODB.Connection, objCat As ADOX.Catalog, tbl As ADOX.Table
  On Error Resume Next
  myPath = ActiveWorkbook.Path & "\"
  myMDB = "InHDNew" & ".mdb"
  Set objConn = New ADODB.Connection
  objConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
   "Data Source=" & myPath & myMDB & ";Jet OLEDB:Engine Type=5;"
  Set objCat = New ADOX.Catalog
  Set objCat.ActiveConnection = objConn
  For Each tbl In objCat.Tables
    If tbl.Name = "Data" Then
      objConn.Execute "DELETE tbl.* FROM tbl;"
      GoTo 1
    End If
  Next tbl
1:  objConn.Close
End Sub
Câu này có phái là xóa Tbl Data?

Anh thử dùng code sau để xóa và cập nhật từ Excel vào bảng Data của Access nhé.

Mã:
Sub UpdateToAcc()
Dim cn As ADODB.Connection, rs As ADODB.Recordset, r As Long, strPath As String
  Set cn = New ADODB.Connection
  strPath = ThisWorkbook.Path & "\InHDNew.mdb"
  cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & "Data Source=" & strPath & ";"
    Set rs = New ADODB.Recordset
    rs.Open "Data", cn, 3, 3, adCmdTable
    cn.Execute "Delete * from Data"
    r = 2
    Do While Len(Range("A" & r)) > 0
        With rs
            .AddNew
            .Fields("Serie") = Range("A" & r).Value
            .Fields("SoHD") = Range("B" & r).Value
            .Fields("Ngay") = Range("C" & r).Value
            .Fields("nguoimua") = Range("D" & r).Value
            .Fields("DVmua") = Range("E" & r).Value
            .Fields("Diachi") = Range("F" & r).Value
            .Fields("MasoT") = Range("G" & r).Value
            .Fields("PthucTT") = Range("H" & r).Value
            .Fields("Thuesuat") = Range("I" & r).Value
            .Fields("Ghichu") = Range("J" & r).Value
            .Fields("In") = Range("K" & r).Value
            .Fields("Mhang") = Range("L" & r).Value
            .Fields("Dvt") = Range("M" & r).Value
            .Fields("Sluong") = Range("N" & r).Value
            .Fields("Dgia") = Range("O" & r).Value
            .Fields("Ttien") = Range("P" & r).Value
            .update
        End With
        r = r + 1
    Loop
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
    MsgBox "Finished !!!"
End Sub
 
Sao Dom không dùng lệnh run Query append hoặc insert?
Connect data Excel thành 1 Recordset, connect data Access thành 1 Recordset thứ 2, xoá dữ liệu trong đó, insert hoặc append dữ liệu bên này.
 
Lần chỉnh sửa cuối:
Anh thử dùng code sau để xóa và cập nhật từ Excel vào bảng Data của Access nhé.

Mã:
Sub UpdateToAcc()
...
    Do While Len(Range("A" & r)) > 0
        With rs
            .AddNew
            .Fields("Serie") = Range("A" & r).Value
            .Fields("SoHD") = Range("B" & r).Value
            .Fields("Ngay") = Range("C" & r).Value
            .Fields("nguoimua") = Range("D" & r).Value
            .Fields("DVmua") = Range("E" & r).Value
            .Fields("Diachi") = Range("F" & r).Value
            .Fields("MasoT") = Range("G" & r).Value
            .Fields("PthucTT") = Range("H" & r).Value
            .Fields("Thuesuat") = Range("I" & r).Value
            .Fields("Ghichu") = Range("J" & r).Value
            .Fields("In") = Range("K" & r).Value
            .Fields("Mhang") = Range("L" & r).Value
            .Fields("Dvt") = Range("M" & r).Value
            .Fields("Sluong") = Range("N" & r).Value
            .Fields("Dgia") = Range("O" & r).Value
            .Fields("Ttien") = Range("P" & r).Value
            .update
        End With
   ...
End Sub
Cám ơn nhiều nhé, mình đã vận dụng code trên và viết lại cho ngắn và lấy dữ liệu từ arr luôn. Domfootwear xem giúp thế nào.
Mà sao có thấy vận dụng ADOX gì cả.
PHP:
Option Explicit
Dim myPath As String, myMDB As String, tblName As String
Dim Arr(), arrField(), endR As Long, r As Long, i As Long, k As Long
Sub TaoHoaDon()
ConvertDataToArr
UpdateToAcc
OpenMdb
End Sub
Sub ConvertDataToArr()
With Sheets("Data")
  endR = .Cells(65000, 1).End(xlUp).Row
  Arr = .Range("A2:P" & endR).Value
End With
End Sub
Sub OpenMdb()
'DomFootWear'
  On Error GoTo 1
  ActiveWorkbook.FollowHyperlink myPath & myMDB, NewWindow:=True
  Exit Sub
1: MsgBox Err.Description
End Sub
Sub GetPath()
myPath = ActiveWorkbook.Path & "\"
myMDB = "InHDNew" & ".mdb"
End Sub
Sub UpdateToAcc()
'DomFootWear'
Dim cn As ADODB.Connection, rs As ADODB.Recordset
Set cn = New ADODB.Connection
GetPath
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & "Data Source=" & myPath & myMDB & ";"
Set rs = New ADODB.Recordset
tblName = "Data"
rs.Open tblName, cn, 3, 3, adCmdTable
cn.Execute "Delete * from " & tblName
arrField() = Array("Serie", "SoHD", "Ngay", "nguoimua", "DVmua", "Diachi", "MasoT", "PthucTT", "Thuesuat", "Ghichu", "In", "Mhang", "Dvt", "Sluong", "Dgia", "Ttien")
For i = 1 To UBound(Arr)
  With rs
    .AddNew
    For k = 1 To UBound(arrField) +1
      .Fields(arrField(k - 1)) = Arr(i, k)
      .Update
    Next k
  End With
Next i
Erase Arr(), arrField()
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Code anh tuy ngắn hơn code của em nhưng nó chạy chậm hơn vì nó đến 2 vòng lặp.
 
Code anh tuy ngắn hơn code của em nhưng nó chạy chậm hơn vì nó đến 2 vòng lặp.
2 vòng lặp nhưng dùng array thì cũng không chậm hơn nhiều dùng 1 vòng lặp Do While.
Có lẽ chậm là do code mở Acc.
Còn vấn đề tách Tbl Data thành master và child thì nên tách luôn từ ex hay là tách khi chạy form acc. Dom xem cách nào tối ưu hơn.
 
Lần chỉnh sửa cuối:
Còn vấn đề tách Tbl Data thành master và child thì nên tách luôn từ ex hay là tách khi chạy form acc. Dom xem cách nào tối ưu hơn.
Theo em thì nên tách khi mở form Access như trước đây Thầy Mỹ làm là khả thi hơn.
 
Mình chưa thử nhưng cảm nhận rằng hướng của Anh Mỹ mới ngon, trong phạm vi này có lẽ vòng lặp với mảng không ăn được SQL. Trong đa số các đoạn mã có liên quan hiện nay đều dùng SQL và mọi người cho rằng đó mới hiệu quả.
Anh Mỹ lên tiếng đi cho anh em học hỏi với.
 
Lần chỉnh sửa cuối:
Mình chưa thử nhưng cảm nhận rằng hướng của Anh Mỹ mới ngon, trong phạm vi này có lẽ vòng lặp với mảng không ăn được SQL. Trong đa số các đoạn mã có liên quan hiện nay đều dùng SQL và mọi người cho rằng đó mới hiệu quả.
Anh Mỹ lên tiếng đi cho anh em học hỏi với.
Em cũng kg biết nhanh hơn hay không, em thì quen dùng ex và arr nên em làm theo hướng đó.
Cũng nhanh nhưng mở acc thì hơi chậm.
Em insert vào Tbld HoaDon và Tbl ChiTiet = Ex từ 2 sh tương ứng.
PHP:
Option Explicit 'DomFootWear-PTM0412'
Dim myPath As String, myMDB As String, tblName As String
Dim ArrHD(), ArrCT(), arrFieldHD(), arrFieldCT(), endR As Long, r As Long, i As Long, k As Long
Dim cn As ADODB.Connection, rs As ADODB.Recordset
Sub TaoHoaDon()
ConvertDataToArr
UpdateToAcc
OpenMdb
End Sub
Sub ConvertDataToArr()
With Sheets("HoaDon")
  endR = .Cells(65000, 1).End(xlUp).Row
  ArrHD = .Range("A2:K" & endR).Value
End With
With Sheets("ChiTietHD")
  endR = .Cells(65000, 1).End(xlUp).Row
  ArrCT = .Range("A2:G" & endR).Value
End With
End Sub
Sub OpenMdb()
  On Error GoTo 1
  ActiveWorkbook.FollowHyperlink myPath & myMDB, NewWindow:=True
  Exit Sub
1: MsgBox Err.Description
End Sub
Sub UpdateToAcc()
KetNoi
'Gan ArrHD vao Tbl Hoadon'
tblName = "HoaDon"
rs.Open tblName, cn, 3, 3, adCmdTable
cn.Execute "Delete * from " & tblName
arrFieldHD() = Array("Serie", "SoHD", "Ngay", "nguoimua", "DVmua", "Diachi", "MasoT", "PthucTT", "Thuesuat", "Ghichu", "In")
For i = 1 To UBound(ArrHD)
  With rs
    .AddNew
    For k = 1 To UBound(arrFieldHD) + 1
      .Fields(arrFieldHD(k - 1)) = ArrHD(i, k)
      .Update
    Next k
  End With
Next i
rs.Close
'Gan ArrCT vao Tbl ChiTiet'
tblName = "ChiTiet"
rs.Open tblName, cn, 3, 3, adCmdTable
cn.Execute "Delete * from " & tblName
arrFieldCT() = Array("SoHD", "Mhang", "TenHH", "Dvt", "Sluong", "Dgia", "Ttien")
For i = 1 To UBound(ArrCT)
  With rs
    .AddNew
    For k = 1 To UBound(arrFieldCT) + 1
      .Fields(arrFieldCT(k - 1)) = ArrCT(i, k)
      .Update
    Next k
  End With
Next i
BoKetNoi
Erase ArrHD(), ArrCT(), arrFieldHD(), arrFieldCT()
End Sub
Sub KetNoi()
GetPath
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; " & "Data Source=" & myPath & myMDB & ";"
Set rs = New ADODB.Recordset
End Sub
Sub BoKetNoi()
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
End Sub
Sub GetPath()
myPath = ActiveWorkbook.Path & "\"
myMDB = "InHDNew" & ".mdb"
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Mình chưa thử nhưng cảm nhận rằng hướng của Anh Mỹ mới ngon, trong phạm vi này có lẽ vòng lặp với mảng không ăn được SQL. Trong đa số các đoạn mã có liên quan hiện nay đều dùng SQL và mọi người cho rằng đó mới hiệu quả.
Anh Mỹ lên tiếng đi cho anh em học hỏi với.
Mình chỉ chợt nảy ra ý tưởng Open 2 Recordset rồi Inseret into, nhưng khi làm thì không được: Cùng 1 lúc không xử lý được 2 recordset đang mở.
Xem lại google thì chỉ có cách dùng vòng lặp gán như Dom hoặc mảng như ThuNghi.

Tuy nhiên quan điểm ban đầu của mình là khi cần in hoá đơn:
- Mở Access (không mở Excel, hoặc Excel mở sẵn cũng kệ nó)
- Gán Startup cho 1 form để in.
- Trong sự kiện open form đó:
- import table từ Excel bằng macro.
- Tách ra 2 table Master & Child bằng cách RunSQL. (Bước này trong file cuối của ThuNghi đã bỏ, vì tạo Master & Child từ Excel.

Mỗi người mỗi cách, mình thì chọn cách đơn giản. Cải tiến là do ThuNghi muốn nghiên cứu thêm thôi. Dù gì thì cũng đã có 2 thùng Ken cho cái report in HD chính xác từng 1/20 mm rồi. Nhân tiện, ai muốn xài thì liên hệ với ThuNghi, chia bớt 1 phần, hoặc liên hệ lão chết tiệt nhận bản đơn giản mà Full có dự phòng nhiều trường hợp. Bản của Thu Nghi xoá mấy cái dự phòng rồi vì không cần.
Khà khà khà
 
Lần chỉnh sửa cuối:
Mình chỉ chợt nảy ra ý tưởng Open 2 Recordset rồi Inseret into, nhưng khi làm thì không được: Cùng 1 lúc không xử lý được 2 recordset đang mở.
Xem lại google thì chỉ có cách dùng vòng lặp gán như Dom hoặc mảng như ThuNghi.

Tuy nhiên quan điểm ban đầu của mình là khi cần in hoá đơn:
- Mở Access (không mở Excel, hoặc Excel mở sẵn cũng kệ nó)
- Gán Startup cho 1 form để in.
- Trong sự kiện open form đó:
- import table từ Excel bằng macro.
- Tách ra 2 table Master & Child bằng cách RunSQL. (Bước này trong file cuối của ThuNghi đã bỏ, vì tạo Master & Child từ Excel.

Mỗi người mỗi cách, mình thì chọn cách đơn giản. Cải tiến là do ThuNghi muốn nghiên cứu thêm thôi. Dù gì thì cũng đã có 2 thùng Ken cho cái report in HD chính xác từng 1/20 mm rồi. Nhân tiện, ai muốn xài thì liên hệ với ThuNghi, chia bớt 1 phần, hoặc liên hệ lão chết tiệt nhận bản đơn giản mà Full có dự phòng nhiều trường hợp. Bản của Thu Nghi xoá mấy cái dự phòng rồi vì không cần.
Khà khà khà

Em thử dùng cách sau, hoàn toàn có thể được Thầy à. Không dùng vòng lặp.

Mã:
"INSERT INTO ...... IN '................' SELECT ........... FROM ......."
 
Cụ thể code nó như sau:
Mã:
Sub UpdateToAcc()
Dim cn As ADODB.Connection, cn1 As ADODB.Connection, strPath As String
  Set cn = New ADODB.Connection
  Set cn1 = New ADODB.Connection
  strPath = ThisWorkbook.path
  cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & strPath & "\InHDNew.mdb;"
    cn.Execute "Delete * from Data"
    cn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath & _
        "\Data.xls;Extended Properties=Excel 8.0; Persist Security Info=False"
    cn1.Execute "INSERT INTO Data IN '" & strPath & "\InHDNew.mdb' SELECT * FROM [Data$]"
    cn.Close
    cn1.Close
    
End Sub
 
Dép Dzỏm hay quá. Mình nghĩ đúng hướng nhưng làm chưa được, thế mà Dép Dzỏm làm được.

Nếu tách ra 2 table như ThuNghi, thì phải mở 2 lần, mỗi lần 1 table.

PHP:
Sub UpdateToAcc()
Dim cn As ADODB.Connection, cn1 As ADODB.Connection, strPath As String
Dim rs As New Recordset
  Set cn = New ADODB.Connection
  Set cn1 = New ADODB.Connection
  strPath = ThisWorkbook.Path
  cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & strPath & "\InHDNew.mdb;"
    cn.Execute "Delete * from hoadon"
    cn.Execute "Delete * from Chitiet"

    cn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath & _
        "\Data.xls;Extended Properties=Excel 8.0;"
 
    cn1.Execute "INSERT INTO Hoadon IN '" & strPath & "\InHDNew.mdb' SELECT * FROM [Hoadon$]"

    cn1.Execute "INSERT INTO Chitiet IN '" & strPath & "\InHDNew.mdb' SELECT * FROM [Chitiet$]"
    
    cn.Close
    cn1.Close
    Set cn = Nothing
    Set cn1 = Nothing
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Dép Dzỏm hay quá. Mình nghĩ đúng hướng nhưng làm chưa được, thế mà Dép Dzỏm làm được.

Nếu tách ra 2 table như ThuNghi, thì phải mở 2 lần, mỗi lần 1 table.

PHP:
Sub UpdateToAcc()
Dim cn As ADODB.Connection, cn1 As ADODB.Connection, strPath As String
Dim rs As New Recordset
  Set cn = New ADODB.Connection
  Set cn1 = New ADODB.Connection
  strPath = ThisWorkbook.Path
  cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & strPath & "\InHDNew.mdb;"
    cn.Execute "Delete * from hoadon"
    cn.Execute "Delete * from Chitiet"

    cn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath & _
        "\Data.xls;Extended Properties=Excel 8.0;"
 
    cn1.Execute "INSERT INTO Hoadon IN '" & strPath & "\InHDNew.mdb' SELECT * FROM [Hoadon$]"

    cn1.Execute "INSERT INTO Chitiet IN '" & strPath & "\InHDNew.mdb' SELECT * FROM [Chitiet$]"
    
    cn.Close
    cn1.Close
    Set cn = Nothing
    Set cn1 = Nothing
End Sub

Thầy ơi, hôm nay em tìm ra được cách giải quyết cái mở record 2 lần đề thực hiện lệnh trong code trên, đó là mở 1 nó lên thực hiện lệnh xong, đóng nó lại, chuẩn bị qua lệnh mới thì tiếp tục mở nó lên.... Em đã thử và chạy tốt chỉ 1 lần rất nhanh như sau:

Mã:
Sub UpdateToAcc()
Dim cn As ADODB.Connection, strPath As String
  Set cn = New ADODB.Connection
  strPath = ThisWorkbook.Path
  
  With cn
    .Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & strPath & "\InHDNew.mdb;"
    .Execute "Delete * from hoadon"
    .Execute "Delete * from Chitiet"
    .Close
    .Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath & _
        "\Data.xls;Extended Properties=Excel 8.0;"
    .Execute "INSERT INTO Hoadon IN '" & strPath & "\InHDNew.mdb' SELECT * FROM [Hoadon$]"
    .Execute "INSERT INTO Chitiet IN '" & strPath & "\InHDNew.mdb' SELECT * FROM [Chitiet$]"
    .Close
  End With
    Set cn = Nothing
 
End Sub

Em rất cảm ơn ý tưởng của Thầy.
 
Thầy ơi, hôm nay em tìm ra được cách giải quyết cái mở record 2 lần đề thực hiện lệnh trong code trên, đó là mở 1 nó lên thực hiện lệnh xong, đóng nó lại, chuẩn bị qua lệnh mới thì tiếp tục mở nó lên.... Em đã thử và chạy tốt chỉ 1 lần rất nhanh như sau:

Mã:
Sub UpdateToAcc()
Dim cn As ADODB.Connection, strPath As String
  Set cn = New ADODB.Connection
  strPath = ThisWorkbook.Path
  
  With cn
    .Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & strPath & "\InHDNew.mdb;"
    .Execute "Delete * from hoadon"
    .Execute "Delete * from Chitiet"
    .Close
    .Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath & _
        "\Data.xls;Extended Properties=Excel 8.0;"
    .Execute "INSERT INTO Hoadon IN '" & strPath & "\InHDNew.mdb' SELECT * FROM [Hoadon$]"
    .Execute "INSERT INTO Chitiet IN '" & strPath & "\InHDNew.mdb' SELECT * FROM [Chitiet$]"
    .Close
  End With
    Set cn = Nothing
 
End Sub

Em rất cảm ơn ý tưởng của Thầy.
Cám ơn Lão Chết Tiệt và anh Dép Dzỏm rất nhiều.
Đoạn code trên gọn và rất hay, mình sẽ ứng dụng vào file trên, thử với 200.000 dòng thì nhanh hơn gấp đôi thời gian.
Thử với 1tr dòng thì dùng
- Array: 140 s
- "INSERT INTO Chitiet IN '" & strPath & "\InHDNew.mdb' SELECT * FROM [Chitiet$]" : 150s
Không có can đảm test thêm nữa.
Còn với 1000 dòng thì kg thấy khác biệt.
Từ đó => nếu dùng array thì linh động hơn trong việc trích xuất có điều kiện nhưng code dài và phức tạp còn dùng insert ADO thì gọn, nhanh nhưng với điều kiện phức tạp thì câu Sql cũng phức tạp. Và nhất là nếu sh Data mà có thêm ô nào <> phạm vi data cần lấy <> "" thì Sql sẽ khó lấy với [Data$] nó sẽ không hiểu phạm vi.
Một lần nữa xin cám ơn Lão Chết Tiệt và anh Dép Dzỏm rất nhiều. Hy vọng với sự chân thành cám ơn như vậy sẽ giảm được số 1/2 Ken phải trả.
 
1. Và nhất là nếu sh Data mà có thêm ô nào <> phạm vi data cần lấy <> "" thì Sql sẽ khó lấy với [Data$] nó sẽ không hiểu phạm vi.
Một lần nữa xin cám ơn Lão Chết Tiệt và anh Dép Dzỏm rất nhiều. Hy vọng với sự chân thành cám ơn như vậy 2. sẽ giảm được số 1/2 Ken phải trả.
1. Hoàn toàn có thể lấy được bất cứ vùng nào trên sheet mình cần anh à, anh thử nhé.
2. Để em hỏi lại Thầy Mỹ xem coi có thêm từ 2 thùng + 7 lon, lên đến 4 thùng + 14 lon không .....
 
Web KT

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

Back
Top Bottom