Bài tập về ADO căn bản.

Liên hệ QC
Chẳng hiểu sao nữa, do bị lỗi vậy nên khi chạy code lần 2 cũng không được luôn
Cảm ơn Anh nhiều

Vậy anh test thử theo cách sau coi có lỗi không nhé.

[GPECODE=sql]Sub Them1()
Dim lsSQL As String, cnn As Object, lrs As Object
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & ThisWorkbook.Path & "\Database.xls" & _
";Extended Properties=Excel 8.0;"
.Open
End With
lsSQL = "select * from [tblData$]"
With lrs
.Open lsSQL, cnn, 1, 3
.AddNew
![ID] = 415
![W_HDATE] = #10/1/2013#
![PONO] = "DW12WQ009"
![MATERIAL NAME] = "POLY ZIPPER #5"
![COLOR NAME] = "BEIGE"
![UNIT] = "M"
![SUPPLIER] = "HHH VIETNAM"
.Update
.Close
End With
Set lrs = Nothing
cnn.Close: Set cnn = Nothing

End Sub

[/GPECODE]
 
Vậy anh test thử theo cách sau coi có lỗi không nhé.

[GPECODE=sql]Sub Them1()
Dim lsSQL As String, cnn As Object, lrs As Object
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & ThisWorkbook.Path & "\Database.xls" & _
";Extended Properties=Excel 8.0;"
.Open
End With
lsSQL = "select * from [tblData$]"
With lrs
.Open lsSQL, cnn, 1, 3
.AddNew
![ID] = 415
![W_HDATE] = #10/1/2013#
![PONO] = "DW12WQ009"
![MATERIAL NAME] = "POLY ZIPPER #5"
![COLOR NAME] = "BEIGE"
![UNIT] = "M"
![SUPPLIER] = "HHH VIETNAM"
.Update
.Close
End With
Set lrs = Nothing
cnn.Close: Set cnn = Nothing

End Sub

[/GPECODE]
Oh.. Chạy ngon Anh a
Cảm ơn Anh nhiều, cũng là thêm một cái mới. Nhưng với câu lệnh trên tạo thêm 1 record mới thì tại sao lại không Insert mà lại Update nhỉ
 
Oh.. Chạy ngon Anh a
Cảm ơn Anh nhiều, cũng là thêm một cái mới. Nhưng với câu lệnh trên tạo thêm 1 record mới thì tại sao lại không Insert mà lại Update nhỉ

Máy em thì chạy ngon và trước giờ em đều sử dụng 2 cách trên nhưng không thấy lỗi.
 
[TIP]Bài tập 6: Cập nhật 1 mẫu tin vào cơ sở dữ liệu[/TIP]

1./ Cú pháp:

[GPECODE=sql]UPDATE [Tên Bảng] SET [Cột 1]=GiaTri_1, [Cột 2]=GiaTri_2, ...,[Cột n]=GiaTri_n
WHERE [Tên_Cột_Và_Điều_Kiện_Update][/GPECODE]

Lưu ý phần GiaTri:

  • Cập nhật ngày thì phải thêm # bao quanh ngày (VD:#15/06/1977#)
  • Cập nhật số thì chỉ ghi số, không cần thêm gì cả
  • Cập nhật dạng chuổi thì phải thêm dấu nháy bao quanh chuổi đó(VD: 'HLMT')

2./ Bài Tập:

[INFO1]Anh, chị hãy Cập nhật 1 mẫu tin sau vào cơ sở dữ liệu với điều kiện là cột ID=415

  • TP=C
  • POQTY=1000
  • INPUTQTY=600
  • BALANCE=-400
  • PRICE=0.1
  • M_UNIT=USD.
  • AMOUNT=60
  • ORIGIN=VIETNAM
[/INFO1]

Lưu Ý: Với csdl bên dưới, bạn phải cập nhật được 1 mẫu tin theo bài tập số 5
paperclip.png
Tập tin đính kèm
 
Lần chỉnh sửa cuối:
[TIP]Bài tập 6: Cập nhật 1 mẫu tin vào cơ sở dữ liệu[/TIP]

1./ Cú pháp:

[GPECODE=sql]UPDATE [Tên Bảng] SET [Cột 1]=GiaTri_1, [Cột 2]=GiaTri_2, ...,[Cột n]=GiaTri_n
WHERE [Tên_Cột_Và_Điều_Kiện_Update][/GPECODE]

Lưu ý phần GiaTri:

  • Cập nhật ngày thì phải thêm # bao quanh ngày (VD:#15/06/1977#)
  • Cập nhật số thì chỉ ghi số, không cần thêm gì cả
  • Cập nhật dạng chuổi thì phải thêm dấu nháy bao quanh chuổi đó(VD: 'HLMT')

2./ Bài Tập:

[INFO1]Anh, chị hãy Cập nhật 1 mẫu tin sau vào cơ sở dữ liệu với điều kiện là cột ID=415

  • TP=C
  • POQTY=1000
  • INPUTQTY=600
  • BALANCE=-400
  • PRICE=0.1
  • M_UNIT=USD.
  • AMOUNT=60
  • ORIGIN=VIETNAM
[/INFO1]

Lưu Ý: Với csdl bên dưới, bạn phải cập nhật được 1 mẫu tin theo bài tập số 5
paperclip.png
Tập tin đính kèm
Nhờ Anh test thử giúp em xem có lỗi không nhé
[GPECODE=vb]Sub Update_Data_ADO()
Dim lsSQL As String, cnn As Object, lrs As Object
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & "\Database.xls" & _
";Extended Properties=""Excel 8.0;HDR=Yes;"";"
.Open
End With
lsSQL = "UPDATE [tblData$] " & _
"SET [TP]='C', [POQTY] = 1000, [INPUTQTY] = 600, [BALANCE] = -400, [PRICE] = 0.1, [M_UNIT]='USD', [AMOUNT] = 60, [ORIGIN] = 'VIETNAM' " & _
"WHERE ID = 415"
lrs.Open lsSQL, cnn, 3, 1
Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub


[/GPECODE]
 
Nhờ Anh test thử giúp em xem có lỗi không nhé
[GPECODE=vb]Sub Update_Data_ADO()
Dim lsSQL As String, cnn As Object, lrs As Object
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & "\Database.xls" & _
";Extended Properties=""Excel 8.0;HDR=Yes;"";"
.Open
End With
lsSQL = "UPDATE [tblData$] " & _
"SET [TP]='C', [POQTY] = 1000, [INPUTQTY] = 600, [BALANCE] = -400, [PRICE] = 0.1, [M_UNIT]='USD', [AMOUNT] = 60, [ORIGIN] = 'VIETNAM' " & _
"WHERE ID = 415"
lrs.Open lsSQL, cnn, 3, 1
Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub


[/GPECODE]
Code chạy ngon, nhưng giá trị 'USD' của bài tập là 'USD.' anh thiếu mất dấu chấm :)
 
Đến đây em cũng đã biết được từ ADO
1. Lấy dữ liệu từ file đang đóng
2. Truyền dữ liệu vào file đang đóng
- Thêm record
- Cập nhật
- Xóa (học thêm từ ADO toán tập)
Bây giờ mong được học các hàm
Trước đây em có tự đọc ADO toàn tập của anh Duyệt nhưng không hiểu nổi, nhờ Topic này em đọc lại sách do Anh Duyệt viết có hiểu được phần nào
Cảm ơn Anh Hai Lúa Miền Tây rất nhiều.
-
Ah, code bài 101 của Anh máy ở cơ quan chạy vẫn bị như code của em viết (csdl bị lỗi sau khi chạy code), máy ở nhà chạy ngon. Không biết lý do gì nhỉ? Trong lúc code bài 105 của em chạy máy ở nhà bị lỗi thì Anh test lại chạy khon ???
 
Lần chỉnh sửa cuối:
Đến đây em cũng đã biết được từ ADO
1. Lấy dữ liệu từ file đang đóng
2. Truyền dữ liệu vào file đang đóng
- Thêm record
- Cập nhật
- Xóa (học thêm từ ADO toán tập)
Bây giờ mong được học các hàm
Trước đây em có tự đọc ADO toàn tập của anh Duyệt nhưng không hiểu nổi, nhờ Topic này em đọc lại sách do Anh Duyệt viết có hiểu được phần nào
Cảm ơn Anh Hai Lúa Miền Tây rất nhiều.
-
Ah, code bài 101 của Anh máy ở cơ quan chạy vẫn bị như code của em viết (csdl bị lỗi sau khi chạy code), máy ở nhà chạy ngon. Không biết lý do gì nhỉ? Trong lúc code bài 105 của em chạy máy ở nhà bị lỗi thì Anh test lại chạy khon ???

1./ Sắp xếp lại các trường theo thứ tự

*/Cú pháp:

[TIP]SELECT Cot_1,Cot_2,...,Cot_n
FROM TenBang
ORDER BY TenCotCanSapXep ASC|DESC[/TIP]

* Chú ý:

  • Asc: Sắp xếp theo thứ tự tăng dần
  • Desc: Sắp xếp theo thứ tự giảm dần

2./ Xóa 1 mẫu tin trong csdl


* Cú pháp:

[TIP]DELETE FROM TenBangCanXoa
WHERE DieuKienCacCotCanXoa[/TIP]

* Chú ý: Việc xóa 1 mẫu tin trong csdl là excel thì ado không hổ trợ nên em chưa đề cập.


Đến đây là phần căn bản đã xong, nếu có thời gian chúng ta sẽ thảo luận về 2 phần sau:
  1. Các hàm căn bản.
  2. Phần nâng cao.
 
Lần chỉnh sửa cuối:
[GPECODE=vb]
lsSQL = "UPDATE [tblData$] " & "SET [TP]='C', [POQTY] = 1000, [INPUTQTY] = 600,
[BALANCE] = -400, [PRICE] = 0.1, [M_UNIT]='USD',
[AMOUNT] = 60, [ORIGIN] = 'VIETNAM' " & "WHERE ID = 415"
[/GPECODE]

[NOTE1]
Nếu chúng ta bỏ mệnh đề Where trong câu lệnh SQL Update thì mặc định cú pháp UPDATE sẽ Update toàn bộ các giá trị trường [TP], [POQTY].... được Set trước mệnh đề Where
[/NOTE1]
 
[GPECODE=vb]
lsSQL = "UPDATE [tblData$] " & "SET [TP]='C', [POQTY] = 1000, [INPUTQTY] = 600,
[BALANCE] = -400, [PRICE] = 0.1, [M_UNIT]='USD',
[AMOUNT] = 60, [ORIGIN] = 'VIETNAM' " & "WHERE ID = 415"
[/GPECODE]

[NOTE1]
Nếu chúng ta bỏ mệnh đề Where trong câu lệnh SQL Update thì mặc định cú pháp UPDATE sẽ Update toàn bộ các giá trị trường [TP], [POQTY].... được Set trước mệnh đề Where
[/NOTE1]

Đó là điều đương nhiên thôi bạn. Where là điều kiện để chọn lọc ra những dữ liệu thỏa điều kiện để cập nhật. Do vậy điều kiện where thì không thể thiếu nếu như bạn muốn chỉnh sửa mẫu tin nào đó.
 
Lọc duy nhất khi dữ liệu vượt quá 65536 dòng

Tôi xây dựng code lọc duy nhất dùng ADO như sau:
Mã:
Sub ADO_Unique(ByVal DataRange As Range, ByVal FieldName As String, ByVal HasTitle As Boolean, ByVal Target As Range)
  Dim cnn As Object
  Dim rsData As Object
  
  Dim szConn As String, szSQL As String
  Dim wkb As Workbook, wks As Worksheet
  
  Set wks = DataRange.Parent
  Set wkb = wks.Parent

  If Val(Application.Version) < 12 Then
      szConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & wkb.FullName & ";" & _
                "Extended Properties=""Excel 8.0;HDR=" & IIf(HasTitle, "Yes", "No") & """;"
  Else
      szConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & wkb.FullName & ";" & _
                "Extended Properties=""Excel 12.0;HDR=" & IIf(HasTitle, "Yes", "No") & """;"
  End If
  
  szSQL = "SELECT DISTINCT " & FieldName & " FROM [" & wks.Name & "$" & DataRange.Address(0, 0) & "]"
     
  Set cnn = CreateObject("ADODB.Connection")
  Set rsData = CreateObject("ADODB.Recordset")
  cnn.Open szConn
  rsData.Open szSQL, cnn, 3, 3
  Target.CopyFromRecordset rsData
  rsData.Close: Set rsData = Nothing
  cnn.Close: Set cnn = Nothing
End Sub
Đương nhiên là dùng SELECT DISTINCT để lấy Unique rồi
Tiếp theo là code chính để lọc:
Mã:
Sub Main()
  Dim t As Double
  Dim rng As Range, Target As Range
  t = Timer
  Set rng = Range("A2:A[COLOR=#ff0000]65536[/COLOR]")
  Set Target = Range("E2")
  Range(Target.Offset(1), Target.Offset(1).End(xlDown)).ClearContents
  ADO_Unique rng, Target.Value, True, Target.Offset(1)
  MsgBox Format(Timer - t, "0.000")
End Sub
Vấn đề ở đây là nếu sửa số 65536 thành số lớn hơn thì code lập tức bảo lỗi
Xin hỏi:
- Có phải code tôi có sai gì đó chăng?
- Hay SELECT DISTINCT có giới hạn?
- Nếu là code của tôi bị sai thì phải sửa lại thế nào mới đúng
-------------------
Ngoài ra cũng xin hỏi thêm: Nếu biến FieldName được gán từ 1 chuổi là tiếng Việt có dấu thì code cũng lỗi. Trường hợp này ta xử lý sao?
 

File đính kèm

  • ADO_Unique.rar
    98.9 KB · Đọc: 135
Mã:
Sub Main()
  Dim t As Double
  Dim rng As Range, Target As Range
  t = Timer
  Set rng = Range("A2:A[COLOR=#ff0000]65536[/COLOR]")
  Set Target = Range("E2")
  Range(Target.Offset(1), Target.Offset(1).End(xlDown)).ClearContents
  ADO_Unique rng, Target.Value, True, Target.Offset(1)
  MsgBox Format(Timer - t, "0.000")
End Sub
Vấn đề ở đây là nếu sửa số 65536 thành số lớn hơn thì code lập tức bảo lỗi
Xin hỏi:
- Có phải code tôi có sai gì đó chăng?
- Hay SELECT DISTINCT có giới hạn?
- Nếu là code của tôi bị sai thì phải sửa lại thế nào mới đúng
-------------------
Ngoài ra cũng xin hỏi thêm: Nếu biến FieldName được gán từ 1 chuổi là tiếng Việt có dấu thì code cũng lỗi. Trường hợp này ta xử lý sao?

Có lẽ chỉ lỗi trên Excel 2003 vì 65536 là giới hạn dòng cuối.
 
Tôi xây dựng code lọc duy nhất dùng ADO như sau:

Vấn đề ở đây là nếu sửa số 65536 thành số lớn hơn thì code lập tức bảo lỗi
Xin hỏi:
- Có phải code tôi có sai gì đó chăng?
- Hay SELECT DISTINCT có giới hạn?
- Nếu là code của tôi bị sai thì phải sửa lại thế nào mới đúng
-------------------
Ngoài ra cũng xin hỏi thêm: Nếu biến FieldName được gán từ 1 chuổi là tiếng Việt có dấu thì code cũng lỗi. Trường hợp này ta xử lý sao?

Có lẽ cấu trúc của Thầy bị lỗi tại dòng này:

PHP:
rsData.Open szSQL, cnn, 3, 3

Nhưng vì trình độ em không biết giải thích như thế nào, nhưng em có giải pháp!

Thầy chép hàm ExcelConnect này vô file đó, thêm vài ngàn dòng ở cột A1 cũng OK:

Mã:
Option Explicit
Public ObjConnect As Object
Global Const adStateOpen = 1

Function ExcelConnect(ByVal AppPath As String, ByVal ExcelFileName As String) As Boolean
    On Error GoTo ErrorHandle
    
    Dim FullPath As String, ConnString As String
    
    FullPath = AppPath & "\" & ExcelFileName
    
    If Val(Application.Version) < 12 Then
        ConnString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & FullPath & ";" & _
        "Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
    Else
        ConnString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=" & FullPath & ";" & _
        "Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
    End If
    
    Set ObjConnect = CreateObject("ADODB.Connection")
    
    With ObjConnect
        .Mode = 3
        .ConnectionTimeout = 30
        .CursorLocation = 3
        .ConnectionString = ConnString
        .Open
    End With
    
    ExcelConnect = True
    
    ObjConnect.Close
    Exit Function
    
ErrorHandle:
    ExcelConnect = False
    Err.Clear
End Function

Sau đó thực hiện thủ tục sau:

Mã:
Sub LocDuyNhat()

    Dim FileName As String, SheetName As String, FieldName As String, _
        AppPath As String, sSQL As String, ObjRcs As Object
    
    AppPath = ThisWorkbook.Path
    FileName = "ADO_Unique.xlsm"
    SheetName = "[Sheet1$] "
    FieldName = "[Title] "
    
    If ExcelConnect(AppPath, FileName) = False Then
        MsgBox "Không kêt nôi", vbOKOnly + vbExclamation, "Thông báo"
        GoTo ExitSub
    Else
        sSQL = "SELECT DISTINCT " & FieldName & " FROM " & SheetName
        'sSQL = "SELECT " & FieldName & " FROM " & SheetName & "GROUP BY " & FieldName
        
        Set ObjRcs = CreateObject("ADODB.Recordset")
        
        On Error GoTo SheetFieldNameErr
        
        ObjConnect.Open
        
        ObjRcs.Open sSQL, ObjConnect, 0, 1, 1
        
        If ObjRcs.EOF Then
            MsgBox "Không có dieu kien này", vbOKOnly + vbInformation, "THÔNG BÁO"
            GoTo ExitSub
        Else
            Sheet1.Range("E3").CopyFromRecordset ObjRcs
        End If
    End If
      
ExitSub:
      
    Set ObjRcs = Nothing
    
    If Not ObjConnect Is Nothing Then
        If (ObjConnect.State And adStateOpen) = adStateOpen Then ObjConnect.Close
        Set ObjConnect = Nothing
    End If
    
    Exit Sub
    
SheetFieldNameErr:
    
    MsgBox "Ten Sheet hoac ten Tieu de cot chua dung, xin kiem tra lai!", vbCritical, "THÔNG BÁO"
    Resume ExitSub
End Sub

Thầy kiểm tra xem còn lỗi không!
 
Có lẽ chỉ lỗi trên Excel 2003 vì 65536 là giới hạn dòng cuối.

File của mình là xlsm mà Tuân
----------------------------------
Có lẽ cấu trúc của Thầy bị lỗi tại dòng này:

PHP:
rsData.Open szSQL, cnn, 3, 3
Tôi không nghĩ thế, vì thay 3, 3 thành:
0, 1
0, 2
0, 3
0, 4
....
....
3, 1
3, 2
3, 3
3, 4

Hết các trường hợp cũng vẫn lỗi
------------------
Để dùng code mới nghiên cứu xem
 
File của mình là xlsm mà Tuân
----------------------------------

Tôi không nghĩ thế, vì thay 3, 3 thành:
0, 1
0, 2
0, 3
0, 4
....
....
3, 1
3, 2
3, 3
3, 4

Hết các trường hợp cũng vẫn lỗi
------------------
Để dùng code mới nghiên cứu xem

Đã thử dữ liệu 500,000 dòng (năm trăm ngàn dòng), thời gian của DISTINCT là 74s, của GROUP BY là 66s (sao em này lại lẹ hơn nhỉ).
 
Đã thử dữ liệu 500,000 dòng (năm trăm ngàn dòng), thời gian của DISTINCT là 74s, của GROUP BY là 66s (sao em này lại lẹ hơn nhỉ).

Máy tôi chạy mất 10s cho dữ liệu 600,000 dòng
------------
Nhưng vấn đề không phải nằm ở đó, nếu tôi sửa đoạn:
Mã:
szSQL = "SELECT DISTINCT " & FieldName & " FROM [" & wks.Name & "$" & DataRange.Address(0, 0) & "]"
Thành:
Mã:
szSQL = "SELECT DISTINCT " & FieldName & " FROM [" & wks.Name & "$]"
Tức không chỉ chính xác đến vùng nào, cứ trong sheet có cái gì thì lọc hết ---> Code sẽ không lỗi
Nhưng như thế lại không hay lắm vì có phải lúc nào tôi cũng muốn lấy UserdRange đâu. Ví dụ UsedRange tại Sheet 1 là vùng A1:V100, thế nhưng tôi lại muốn lọc chính xác vùng C5:C50 thôi thì tính sao?
 
Để tự động hoá công nhiều hơn công việc đang làm , em có chập chững đoc tài liệu ADO trên diễn đàn và test thử 1 đoạn code ----> nhưng không hiểu sao ADO không lấy được hết dữ liệu trên sheets cụ thể như file đính kèm :

Kết quả là [E2:H3] không giống với giữ liệu file nguồn,

Các anh có thể chỉ giúp code mình sai và thiếu ở chỗ nào không?
 
Để tự động hoá công nhiều hơn công việc đang làm , em có chập chững đoc tài liệu ADO trên diễn đàn và test thử 1 đoạn code ----> nhưng không hiểu sao ADO không lấy được hết dữ liệu trên sheets cụ thể như file đính kèm :

Kết quả là [E2:H3] không giống với giữ liệu file nguồn,

Các anh có thể chỉ giúp code mình sai và thiếu ở chỗ nào không?

Bạn nói không đúng là không đúng cái gì hả bạn? Hay chỉ thiếu cái tiêu đề?
 
Để tự động hoá công nhiều hơn công việc đang làm , em có chập chững đoc tài liệu ADO trên diễn đàn và test thử 1 đoạn code ----> nhưng không hiểu sao ADO không lấy được hết dữ liệu trên sheets cụ thể như file đính kèm :

Kết quả là [E2:H3] không giống với giữ liệu file nguồn,

Các anh có thể chỉ giúp code mình sai và thiếu ở chỗ nào không?
Bạn thử lại hàm sau:

[GPECODE=sql]Function GetData(FileName As String, SheetName As String)
Dim cnn As Object, rst As Object, lSQL As String
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.recordset")
If Val(Application.Version) < 12 Then
With cnn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileName & ";" & _
"Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"
.Open
End With
Else
With cnn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileName & ";" & _
"Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"
.Open
End With
End If
lSQL = "SELECT * FROM [" & SheetName & "];"
rst.Open lSQL, cnn, 3, 1
GetData = rst.GetRows
rst.Close: Set rst = Nothing
cnn.Close: Set cnn = Nothing
End Function

[/GPECODE]
 
Để tự động hoá công nhiều hơn công việc đang làm , em có chập chững đoc tài liệu ADO trên diễn đàn và test thử 1 đoạn code ----> nhưng không hiểu sao ADO không lấy được hết dữ liệu trên sheets cụ thể như file đính kèm :

Kết quả là [E2:H3] không giống với giữ liệu file nguồn,

Các anh có thể chỉ giúp code mình sai và thiếu ở chỗ nào không?

Thí nghiệm thì thấy hình như vấn đề nằm ở dữ liệu tại E4:H447 của file kquaSAP.xlsx thì phải... Vì nếu chuyển dữ liệu vùng này thành text thì code chạy chính xác
Cũng lạ ghê! Không hiểu
 
Web KT
Back
Top Bottom