Bài tập về ADO căn bản. (3 người xem)

Liên hệ QC

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

Hi Anh Hungpecc1!

Mình có cách nào duyệt qua file csv và cop chỉ range B19:B26 không ạ?
Vì em chỉ cần dùng vùng dữ liệu này thôi, nếu cop cả sheet thì em cần phải lưu ở sheet 2 sau đó lọc lấy range B19:B26 đưa qua Sheet1. Như vậy tốc độ sẽ chậm hơn.

Và cho em hỏi thêm là có cách nào để duyệt từ hàng thứ 8 chẳng hạn trong file csv không tương tự như mình duyệt theo fields của Recordset ấy anh?

Mong anh giúp đỡ.
Bestregard!
Nhân.
 
Lần chỉnh sửa cuối:
Hi Anh!

Nó báo lỗi Can't find project ỏ library của hàm TransArr().

Rgs!
 
Hi Anh Hungpecc1!

Mình có cách nào duyệt qua file csv và cop chỉ range B19:B26 không ạ?
Vì em chỉ cần dùng vùng dữ liệu này thôi, nếu cop cả sheet thì em cần phải lưu ở sheet 2 sau đó lọc lấy range B19:B26 đưa qua Sheet1. Như vậy tốc độ sẽ chậm hơn.

Và cho em hỏi thêm là có cách nào để duyệt từ hàng thứ 8 chẳng hạn trong file csv không tương tự như mình duyệt theo fields của Recordset ấy anh?

Mong anh giúp đỡ.
Bestregard!
Nhân.

Tổng quát nhất bạn đưa toàn bộ recordset vào mảng rồi xử lý trong mảng,:
Thích copy từ dòng nào, duyệt từ dòng nào cũng được tuốt !
 
Đã lấy được dữ liệu theo vùng mong muốn trong csv file!

Hi A Hungpecc1!

Em đã lấy được dữ liệu theo vùng mong muốn dùng Getrows như code bên dưới, nếu cần lấy nhiều dữ liệu em sẽ quét luôn theo field:

Sub GPE()
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
Dim arrayRows As Variant
Dim x As Integer
With cnn
.CursorLocation = 3
.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & "\" & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
End With
rst.Open "SELECT * FROM 001.csv", cnn, 3, 3, adCmdText
arrayRows = rst.GetRows(26)
For x = 1 To 8
Cells(x, 10) = arrayRows(1, x + 16)
Next x

rst.Close: Set rst = Nothing
cnn.Close: Set cnn = Nothing
End Sub

Cảm ơn anh rất nhiều!
Giờ em phải nghiên cứu làm sao lưu range nào đó vào file xlsx đang đóng.

Thanks
Nhân
 
Lần chỉnh sửa cuối:
Hi A Hungpecc1!

Em đã lấy được dữ liệu theo vùng mong muốn dùng Getrows như code bên dưới, nếu cần lấy nhiều dữ liệu em sẽ quét luôn theo field:

Cảm ơn anh rất nhiều!
Giờ em phải nghiên cứu làm sao lưu range nào đó vào file xlsx đang đóng.

Thanks
Nhân
Làm gì mà " phức tạp " dữ vậy :
thử thay bằng code sau xem :
[GPECODE=vb]
Sub GPE1()
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset, lzSQL As String


Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
With cnn
.CursorLocation = 3
.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & "\" & ";" & _
"Extended Properties=""text;HDR=NO;FMT=Delimited"""
End With
lzSQL = "SELECT * FROM 001.csv WHERE Isnumeric(f1)"
rst.Open lzSQL, cnn, 3, 3, 1
Range("A1").CopyFromRecordset rst
rst.Close: Set rst = Nothing
cnn.Close: Set cnn = Nothing
End Sub
[/GPECODE]

Muốn ghi vào phải đóng thì vọc thêm câu lệnh SQL INSERT hoặc UPDATE ( có thể kết hợp thêm các phép nối bảng )
 
Làm gì mà " phức tạp " dữ vậy :
thử thay bằng code sau xem :
[GPECODE=vb]
Sub GPE1()
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset, lzSQL As String


Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
With cnn
.CursorLocation = 3
.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & "\" & ";" & _
"Extended Properties=""text;HDR=NO;FMT=Delimited"""
End With
lzSQL = "SELECT * FROM 001.csv WHERE Isnumeric(f1)"
rst.Open lzSQL, cnn, 3, 3, 1
Range("A1").CopyFromRecordset rst
rst.Close: Set rst = Nothing
cnn.Close: Set cnn = Nothing
End Sub
[/GPECODE]

Muốn ghi vào phải đóng thì vọc thêm câu lệnh SQL INSERT hoặc UPDATE ( có thể kết hợp thêm các phép nối bảng )


Hi Anh,

Em thử với cách trên tuy nhiên câu lệnh nạy copy cả hàng khi cột A có giá trị số, nhưng em chỉ cần copy ở cột B thôi.
Anh có tài liệu giải thích các tham số trong các câu lệnh như select, update, insert thì cho em xin với. Vì em chưa hiểu cấu trúc các lệnh trên nên không biết thử sao cả.
Nếu anh có ví dụ về copy range (có thể là 1 cell hay một range bất kì) vào file xlsx thì cho em xin tham khảo với.

Thanks
Nhan
 
Copy range B10:B20 từ workbk xlsm sang range B10:B20 của file xlsx đang đóng use ADO.

Hi Mọi Người!

Em sưu tầm module bên dưới đề copy dữ liệu từ 1 workbook đang đóng sang 1 workbook đang mở. Moi người giúp em chuyển đổi để em copy được 1 range từ file đang mở sang đang đóng nhé!

Public Sub GetDataADO(SourceFile As Variant, SourceSheet As String, SourceRange As String, desRange As Range)
Dim rsCon As Object: Dim rsData As Object: Dim szConnect As String: Dim szSQL As String
' Create the connection string
szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & SourceFile & ";" & _
"Extended Properties=""Excel 12.0;HDR=No"";"
szSQL = "SELECT * FROM [" & SourceSheet$ & "$" & SourceRange$ & "];"
On Error GoTo SomethingWrong
Set rsCon = CreateObject("ADODB.Connection")
Set rsData = CreateObject("ADODB.Recordset")
rsCon.Open szConnect: rsData.Open szSQL, rsCon, 0, 1, 1
' Check to make sure we received data and copy the data
If Not rsData.EOF Then
desRange.CopyFromRecordset rsData
Else: MsgBox "No records returned from : " & SourceFile, vbCritical
End If
' Clean up our Recordset object.
rsData.Close: Set rsData = Nothing
rsCon.Close: Set rsCon = Nothing
Exit Sub
SomethingWrong:
MsgBox "The file name, Sheet name or Range is invalid of : " & SourceFile, vbExclamation, "Error"
On Error GoTo 0
End Sub

Hi Anh Hungpecc1!

Khi sáng anh giúp em chỗ file csv có dạng 001.csv, tuy nhiên khi em chuyển file thành 001.dat.csv thì lại báo lỗi.
Có cách nào khắc phục khi vẫn để là 001.dat.csv không anh? Vì công ty em xuất dữ liệu từ hệ thống ra đã theo định dạng này!

Thanks
BestRegards
 

File đính kèm

Lần chỉnh sửa cuối:
Hi Mọi Người!

Em sưu tầm module bên dưới đề copy dữ liệu từ 1 workbook đang đóng sang 1 workbook đang mở. Moi người giúp em chuyển đổi để em copy được 1 range từ file đang mở sang đang đóng nhé!

Hi Anh Hungpecc1!

Khi sáng anh giúp em chỗ file csv có dạng 001.csv, tuy nhiên khi em chuyển file thành 001.dat.csv thì lại báo lỗi.
Có cách nào khắc phục khi vẫn để là 001.dat.csv không anh? Vì công ty em xuất dữ liệu từ hệ thống ra đã theo định dạng này!

Thanks
BestRegards

Thay vì bạn cóp nhặt các đoạn code để ghi dữ liệu vào file xls đóng, --> bạn đọc các bài tập từ page1 của topic này ,ngâm cứu 1 tẹo là có code ngay!
nếu file có định dạng .dat.csv --> thì dùng FilesystemOject để rename nó thành đuôi .csv thôi !
ví dụ :
PHP:
set fso = CreateObject("Scripting.FileSystemObject") 
    set file = fso.GetFile(thisworkbook.path & "\001.dat.csv") 
    file.name = "001.csv" 
    set file = nothing 
    set fso = nothing

hoặc :
PHP:
set fso = CreateObject("Scripting.FileSystemObject") 
    fso.MoveFile thisworkbook.path & "\001.dat.csv", "thisworkbook.path & "\001.csv"" 
    set fso = Nothing
PHP:
Sub DOITEN()   
 Filename = ThisWorkbook.Path & "\001.dat.csv"   
 newfilename = ThisWorkbook.Path & "\001" & skill & ".csv"   
 Name Filename As newfilename
End Sub
 
Các anh chị cho DHN46 hỏi: làm cách nào để đếm số lượng các mã số của 4 Sheet rồi hiển thị kết quả tại Sheet1, không đảo thứ tự sắp xếp các mã trên sheet1.
Xin cảm ơn GPE!
Nhờ các anh chị giúp đỡ dhn46 đã biết cách giải quyết vấn đề đặt ra, chỉ dùng 1 câu truy vấn duy nhất. dhn46 mượn Code anh HLMT để sửa theo hướng 1 truy vấn.
Mã:
Sub GopSheet()
    Dim cn As Object, rst As Object, cat As Object, tbl As Object, str$, str1 As String, i As Integer
    Set cn = CreateObject("ADODB.Connection")
    Set cat = CreateObject("ADOX.Catalog")
    Set tbl = CreateObject("ADOX.Table")
    Set rst = CreateObject("ADODB.Recordset")
    With cn
        .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=" & ThisWorkbook.FullName & _
                ";Extended Properties=""Excel 8.0;HDR=Yes;"";"
        .Open
    End With
    cat.ActiveConnection = cn
    For Each tbl In cat.Tables
        If Right(Replace(tbl.Name, "'", ""), 1) = "$" Then
            str = str & " union all SELECT * from [" & _
                    Replace(Replace(tbl.Name, "$", ""), "'", "") & "$A1:A1000] where ma is not null"
            str1 = Right(str, Len(str) - 10)
        End If
    Next
    
    str1 = "Select Tb2.Dem From [sheet1$A1:A1000] as Tb1 " & _
            "Inner Join " & _
            "(select T2.ma as Ma1, count(T2.ma) as Dem from (" & str1 & ") AS T2 group by T2.ma) AS TB2 " & _
            "On Tb1.ma=Tb2.ma1"
            
    With rst
        .ActiveConnection = cn
        .Open str1
    End With
    
    [D2:D65536].ClearContents
    Range("B2").CopyFromRecordset rst
    rst.Close: Set rst = Nothing
    cn.Close: Set cn = Nothing
    Set cat = Nothing: Set tbl = Nothing
End Sub
Qua ví dụ này dhn46 rút ra kinh nghiệm: khi viết sql thì có thể chia sql thành các truy vấn nhỏ rồi ghép nối. Việc định danh bảng, cột rất quan trọng trong quá trình viết câu lệnh.
 

File đính kèm

Lần chỉnh sửa cuối:
Nhờ các anh chị giúp đỡ dhn46 đã biết cách giải quyết vấn đề đặt ra, chỉ dùng 1 câu truy vấn duy nhất. dhn46 mượn Code anh HLMT để sửa theo hướng 1 truy vấn.
Mã:
Sub GopSheet()
    Dim cn As Object, rst As Object, cat As Object, tbl As Object, str$, str1 As String, i As Integer
    Set cn = CreateObject("ADODB.Connection")
    Set cat = CreateObject("ADOX.Catalog")
    Set tbl = CreateObject("ADOX.Table")
    Set rst = CreateObject("ADODB.Recordset")
    With cn
        .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=" & ThisWorkbook.FullName & _
                ";Extended Properties=""Excel 8.0;HDR=Yes;"";"
        .Open
    End With
    cat.ActiveConnection = cn
    For Each tbl In cat.Tables
        If Right(Replace(tbl.Name, "'", ""), 1) = "$" Then
            str = str & " union all SELECT * from [" & _
                    Replace(Replace(tbl.Name, "$", ""), "'", "") & "$A1:A1000] where ma is not null"
            str1 = Right(str, Len(str) - 10)
        End If
    Next
    
    str1 = "Select Tb2.Dem From [sheet1$A1:A1000] as Tb1 " & _
            "Inner Join " & _
            "(select T2.ma as Ma1, count(T2.ma) as Dem from (" & str1 & ") AS T2 group by T2.ma) AS TB2 " & _
            "On Tb1.ma=Tb2.ma1"
            
    With rst
        .ActiveConnection = cn
        .Open str1
    End With
    
    [D2:D65536].ClearContents
    Range("B2").CopyFromRecordset rst
    rst.Close: Set rst = Nothing
    cn.Close: Set cn = Nothing
    Set cat = Nothing: Set tbl = Nothing
End Sub
Qua ví dụ này dhn46 rút ra kinh nghiệm: khi viết sql thì có thể chia sql thành các truy vấn nhỏ rồi ghép nối. Việc định danh bảng, cột rất quan trọng trong quá trình viết câu lệnh.
Không đúng yêu cầu ban đầu bạn đặt ra, đây chỉ select và đếm bình thường, hên là nó trùng vào mã trường hợp không khớp mã thì sao bạn? Ví dụ bạn xóa mã số, nó vẫn ra số lượng cột kế bên.
 
Không đúng yêu cầu ban đầu bạn đặt ra, đây chỉ select và đếm bình thường, hên là nó trùng vào mã trường hợp không khớp mã thì sao bạn? Ví dụ bạn xóa mã số, nó vẫn ra số lượng cột kế bên.
Về cơ bản thì Code đúng, lúc test Code mình cho vào cột D nên bạn xóa cột C trước khi chạy Code sẽ không xảy ra hiện tượng bạn nêu. Hoặc bạn có thể sửa 1 chút trong Code (cái này đơn giản), bạn sửa đoạn
Mã:
[D2:D65536].ClearContents
thành
Mã:
[C2:C65536].ClearContents
 
Về cơ bản thì Code đúng, lúc test Code mình cho vào cột D nên bạn xóa cột C trước khi chạy Code sẽ không xảy ra hiện tượng bạn nêu. Hoặc bạn có thể sửa 1 chút trong Code (cái này đơn giản), bạn sửa đoạn
Mã:
[D2:D65536].ClearContents
thành
Mã:
[C2:C65536].ClearContents
Vẫn chưa ổn lắm bạn à, bạn thử xóa vài mã trong ở cột A rồi chạy code trên thử nhé.
 
Vẫn chưa ổn lắm bạn à, bạn thử xóa vài mã trong ở cột A rồi chạy code trên thử nhé.
Cảm ơn bạn quan tâm, chắc vội nên mình không để ý, xóa dữ liệu cột B chứ không phải cột C. tức là:
Mã:
[B2:B65536].ClearContents
Mình nghĩ nếu ai biết ít nhiều về Code cũng sẽ biết cách sửa vấn đề này. Mình Post lại File.
 

File đính kèm

Cảm ơn bạn quan tâm, chắc vội nên mình không để ý, xóa dữ liệu cột B chứ không phải cột C. tức là:
Mã:
[B2:B65536].ClearContents
Mình nghĩ nếu ai biết ít nhiều về Code cũng sẽ biết cách sửa vấn đề này. Mình Post lại File.
Cái gì vậy bạn? ý mình là khi bạn xóa 1 vài mã ở cột A đi và chạy code nó vẫn ra kết quả kế bên, không thể gán ghép kiểu này được, rất nguy hiểm, bởi vì nó không có 1 mối quan hệ nào với cột A, có thể gán sai dữ liệu.
 
Nếu chỉ đếm xem ở sheet2, 3, 4 có bao nhiêu lần xuất hiện của mã số và cập nhật Sheet1 (viết tắt Sheet1 lá S1, Sheet2 là S2... cho nhanh):

Update S1 set Dem=tt2.Dem From S1 as tt1 Inner Join (
Select t1.MS, count(t2.MS)+count(t3.MS)+count(t4.MS) As Dem
From S1 As t1 Left Join S2 As t2 on t1.MS=t2.MS Left Join S3 As t3 on t1.MS=t3.MS Left Join S4 As t4 on t1.MS=t4.MS
Group By t1.MS ) As tt2 on tt2.MS = tt1.MS

Hàm count tự động loại bỏ null nên dùng vời Left Join không có vấn đề

Lưu ý là câu truy vấn trên viết cho SQL tiêu chuẩn. Access không thích lệnh join nhiều hơn 2 bảng nên phải dùng dấu ngoặc

From S1 As t1 Left Join S2 As t2 on t1.MS=t2.MS Left Join S3 As t3 on t1.MS=t3.MS Left Join S4 As t4 on t1.MS=t4.MS

phải viết là

From ((S1 As t1 Left Join S2 As t2 on t1.MS=t2.MS) Left Join S3 As t3 on t1.MS=t3.MS) Left Join S4 As t4 on t1.MS=t4.MS
Hãy làm thử ở excel để mọi người cùng học hỏi.
 
Hãy làm thử ở excel để mọi người cùng học hỏi.

Trong mục này tôi chỉ thích đóng góp kinh nghiệm về SQL chứ không phải Excel. Nói cách khác, tôi chỉ đưa ra chiều hướng, còn code thực tiễn thì khi nào xét cần thiết tôi mới làm.
Tôi làm việc với Excel chủ yếu chuyên về thiết kế chứ không chuyên về các kỹ thuật code kiếc.
 
Trong mục này tôi chỉ thích đóng góp kinh nghiệm về SQL chứ không phải Excel. Nói cách khác, tôi chỉ đưa ra chiều hướng, còn code thực tiễn thì khi nào xét cần thiết tôi mới làm.
Tôi làm việc với Excel chủ yếu chuyên về thiết kế chứ không chuyên về các kỹ thuật code kiếc.
Vậy ở đây người ta đang vướng về excel bạn nói bâng quơ ở đâu ai mà áp dụng cho được. Bạn hãy áp dụng update trong trường hợp này mà bạn nói ở Excel thử nhé.
 
Cảm ơn bạn quan tâm, chắc vội nên mình không để ý, xóa dữ liệu cột B chứ không phải cột C. tức là:
Mã:
[B2:B65536].ClearContents
Mình nghĩ nếu ai biết ít nhiều về Code cũng sẽ biết cách sửa vấn đề này. Mình Post lại File.

Bạn không cần phải xoá cột.
Lúc lập danh sách UNION aLL thì bạn đưa cả sheet1 vào.
Lúc tính số đếm (group by + count) thì bạn dùng count(*) - 1 để trừ số của sheet1 ra.

Như vậy tất cả các dòng ở sheet1 nhưng không có trong các sheet kia sẽ có trị dem=0
 
Bạn không cần phải xoá cột.
Lúc lập danh sách UNION aLL thì bạn đưa cả sheet1 vào.
Lúc tính số đếm (group by + count) thì bạn dùng count(*) - 1 để trừ số của sheet1 ra.

Như vậy tất cả các dòng ở sheet1 nhưng không có trong các sheet kia sẽ có trị dem=0
Yêu cầu của người ta là đếm luôn shéet1 mà bạn.

Các anh chị cho DHN46 hỏi: làm cách nào để đếm số lượng các mã số của 4 Sheet rồi hiển thị kết quả tại Sheet1, không đảo thứ tự sắp xếp các mã trên sheet1.
Xin cảm ơn GPE!
 
... Qua ví dụ này dhn46 rút ra kinh nghiệm: khi viết sql thì có thể chia sql thành các truy vấn nhỏ rồi ghép nối. Việc định danh bảng, cột rất quan trọng trong quá trình viết câu lệnh.

Căn bản của SQL và CSDL LH chỉ có thế thôi. Biết cách chia nhỏ yêu cầu ra thành từng truy vấn con rồi ráp lại là đã nắm vững được cơ cấu của SQL rồi.
Phần kế tiếp bạn cần học là làm thế nào để nhìn vào yêu cầu mà biết cách định dạng bảng. Trong lý thuyết CSDL LH có các dạng chuẩn, nếu có thì giờ thì cũng nên tìm hiểu.

Xin lỗi chủ thớt nói chuyện ngoài lề ADO một chút.
 
Lần chỉnh sửa cuối:
- Xin cảm ơn các anh chị đã quan tâm giúp đỡ và chỉ ra những điểm vấn đề cho dhn46. Quả thực bạn đầu dhn46 chưa hiểu hết sự nhận xét của bạn Xi tin. Sau khi nghiên cứu lại Inner Join dhn46 mới nhận ra 1 điều là mình chưa tìm hiểu kỹ nên gây sai sót.

- Inner Join: trả về tất cả các hàng từ hai bảng khi điều kiện được so trùng. Nếu các hàng trong bảng 1 không so trùng trong bảng 2, hàng đó sẽ không được liệt kê ra. => đây là cái mà dhn46 chưa tìm hiểu thấu đáo

- Nếu dùng Left Join: trả về tất cả các hàng từ bảng thứ nhất , cho dù nó không được so trùng trong bảng thứ hai. Nếu các hàng trong bảng Employees không so trùng trong bảng Orders, những hàng này cũng được liệt kê.

Trong các bài hướng dẫn của anh VetMini đã khéo léo đề cập tới vấn đề này nhưng do dhn46 mới “tập tành” nên chưa hiểu được ý hay trong các lời hường dẫn.
=> Câu lệnh dhn46 thay Inner Join bằng Left Join sẽ được kết quả

Đúng như anh VetMini đã nhận xét tại bài #220. Qua ví dụ này dhn46 đã biết thêm 1 chút về việc chia nhỏ SQL và định danh cột, bảng khi sử dụng hàm gộp để lập câu lệnh SQL.

Xin cảm ơn các anh chị rất nhiều!
 
Nếu chỉ đếm xem ở sheet2, 3, 4 có bao nhiêu lần xuất hiện của mã số và cập nhật Sheet1 (viết tắt Sheet1 lá S1, Sheet2 là S2... cho nhanh):

Update S1 set Dem=tt2.Dem From S1 as tt1 Inner Join (
Select t1.MS, count(t2.MS)+count(t3.MS)+count(t4.MS) As Dem
From S1 As t1 Left Join S2 As t2 on t1.MS=t2.MS Left Join S3 As t3 on t1.MS=t3.MS Left Join S4 As t4 on t1.MS=t4.MS
Group By t1.MS ) As tt2 on tt2.MS = tt1.MS

Hàm count tự động loại bỏ null nên dùng vời Left Join không có vấn đề

Lưu ý là câu truy vấn trên viết cho SQL tiêu chuẩn. Access không thích lệnh join nhiều hơn 2 bảng nên phải dùng dấu ngoặc

From S1 As t1 Left Join S2 As t2 on t1.MS=t2.MS Left Join S3 As t3 on t1.MS=t3.MS Left Join S4 As t4 on t1.MS=t4.MS

phải viết là

From ((S1 As t1 Left Join S2 As t2 on t1.MS=t2.MS) Left Join S3 As t3 on t1.MS=t3.MS) Left Join S4 As t4 on t1.MS=t4.MS

Đó là theo lý thuyết, trên thực tế nó có khác nhiều lắm đó bạn. Ở Access, bạn hãy thử tạo 1 SubQuery để đếm hết các mã số của 4 bảng rồi update vào bảng 1 thử coi nó báo thế nào nhé, mặc dù subquery đó nó có kết quả giống y hệt như 1 table khác nhưng với 1 table thì có thể update bình thường còn query thì nó sẽ báo lỗi. Đó là vấn đề mình muốn nói để khắc phục.
 
Vậy thì gay dữ. Để tôi hỏi mấy người bạn tôi chuyên môn về ngành chuyển đổi dữ liệu xem họ có giải pháp không.
Kiến thức bản thân tôi chỉ biết cơ cấu Access chứ không có đi vào chi tiết.
 
Hi All,

Mọi người giúp em với, trong máy em dù chỉnh sửa IMEX như thế nào, bỏ khoảng trắng hay thêm gì thì vẫn không lấy được dữ liệu dạng Text lẫn với số trên cùng 1 Field. Mọi người giúp em với nhé! (Em đã đọc rất kĩ các hướng dẫn trong trang 12, 13 của page này.

Thanks!

[GPECODE=vb]Sub getDataFromcsvfiles(csvPath As Variant, csvFilename As String, desColumn As Integer) Dim rsCon As Object: Dim rsData As Object
Dim arrayRows As Variant
Dim rowloops As Integer
Set rsCon = New ADODB.Connection
Set rsData = New ADODB.Recordset
With rsCon
.CursorLocation = 3
.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & csvPath & ";" & _
"Extended Properties=""text;HDR=NO;FMT=Delimited;IMEX=1"";"
End With
rsData.Open "SELECT * FROM " & csvFilename, rsCon, 0, 1, 1
Cells(5, desColumn).Value = rsData.Fields(1)
arrayRows = rsData.GetRows(26)
Range(Cells(7, desColumn), Cells(14, desColumn)) = ""
For rowloops = 7 To 14
Cells(rowloops, desColumn).Value = arrayRows(1, rowloops + 11) * 10 ^ 9
Next rowloops
rsData.Close: Set rsData = Nothing
rsCon.Close: Set rsCon = Nothing
End Sub[/GPECODE]

Hi!

Em sửa được rồi nhé mọi người, nhưng ở file csv thì không được. Mong mọi người tìm giúp em lôix trong đoạn code trên.

Regards
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Hi All,

Mọi người giúp em với, trong máy em dù chỉnh sửa IMEX như thế nào, bỏ khoảng trắng hay thêm gì thì vẫn không lấy được dữ liệu dạng Text lẫn với số trên cùng 1 Field. Mọi người giúp em với nhé! (Em đã đọc rất kĩ các hướng dẫn trong trang 12, 13 của page này.

Thanks!

[GPECODE=vb]Sub getDataFromcsvfiles(csvPath As Variant, csvFilename As String, desColumn As Integer) Dim rsCon As Object: Dim rsData As Object
Dim arrayRows As Variant
Dim rowloops As Integer
Set rsCon = New ADODB.Connection
Set rsData = New ADODB.Recordset
With rsCon
.CursorLocation = 3
.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & csvPath & ";" & _
"Extended Properties=""text;HDR=NO;FMT=Delimited;IMEX=1"";"
End With
rsData.Open "SELECT * FROM " & csvFilename, rsCon, 0, 1, 1
Cells(5, desColumn).Value = rsData.Fields(1)
arrayRows = rsData.GetRows(26)
Range(Cells(7, desColumn), Cells(14, desColumn)) = ""
For rowloops = 7 To 14
Cells(rowloops, desColumn).Value = arrayRows(1, rowloops + 11) * 10 ^ 9
Next rowloops
rsData.Close: Set rsData = Nothing
rsCon.Close: Set rsCon = Nothing
End Sub[/GPECODE]

Hi!

Em sửa được rồi nhé mọi người, nhưng ở file csv thì không được. Mong mọi người tìm giúp em lôix trong đoạn code trên.

Regards

Chịu thôi, bởi vì kiểu dữ liệu cột A của file 001.csv là dạng text nên nó chỉ hiểu là text
 
Chịu thôi, bởi vì kiểu dữ liệu cột A của file 001.csv là dạng text nên nó chỉ hiểu là text

Dạ khi cột B hoàn toàn là số hoặc text thì Ok, nhưng khi một số ô là text thì nó chỉ lấy được số còn text thì không hiểu.
File xlsx vẫn là cột A là text tuy nhiên vẫn lấy đủ dữ liệu.
Em thử chuyển dữ liệu cột A trong file csv hoàn toàn về số nhưng kết quả vẫn vậy, không hiểu vì sau IMEX không có tác dụng với file csv.

Rgds
 

File đính kèm

Chịu thôi, bởi vì kiểu dữ liệu cột A của file 001.csv là dạng text nên nó chỉ hiểu là text

Hi Anh Hai Lúa!

Vấn đề trên em mò hoài cũng không được, em có bài tập thế này để học và cũng có thể áp dụng vào công việc. Anh xem giúp em với nhé:
1/ Lấy dữ liệu từ csv file đang đóng để đưa vào excel.
2/ Từ dữ liệu này và dữ liệu mẫu ta vẽ đồ thị đường dích dắc để so sánh (theo cách chia toạ độ excel).
3/ Lưu dữ liệu vào file xlsx hoặc xls để sau này cần truy xuất (không cần vẽ đồ thị).

Trong 3 bước trên thì 2 bước đầu em đã hoàn thành, chỉ còn bước thứ ba đọc tài liệu hoài mà không biết xử lý thế nào, vì dữ liệu của em không có Header cũng như ID cho cột đầu tiên. Attached file mẫu lên mọi người giúp em với.
Đề bài này là:

Khi thay đổi một ô C6 chẳng hạn trong vùng từ C6:AY6 tại file Source thì dữ liệu từ C3:C22 truyền sang file xlsx đang đóng ở cùng vị trí này. Nếu B6 thay đổi thì B3:B22 được truyền đi.

Em mới tìm hiểu thêm về ADO mong mọi người giúp đỡ!
 

File đính kèm

Dạ khi cột B hoàn toàn là số hoặc text thì Ok, nhưng khi một số ô là text thì nó chỉ lấy được số còn text thì không hiểu.
File xlsx vẫn là cột A là text tuy nhiên vẫn lấy đủ dữ liệu.
Em thử chuyển dữ liệu cột A trong file csv hoàn toàn về số nhưng kết quả vẫn vậy, không hiểu vì sau IMEX không có tác dụng với file csv.

Rgds
Trong CSDL qui định kiểu dữ liệu của các trường 1 cách rõ ràng, hoặc là số hoặc text... Kiểu dữ liệu của bạn vừa là số vừa là text trong cùng 1 trường thì nó sẽ tự hiểu trường đó là text là phải rồi.
 

File đính kèm

Hi Anh Hai Lúa!

Vấn đề trên em mò hoài cũng không được, em có bài tập thế này để học và cũng có thể áp dụng vào công việc. Anh xem giúp em với nhé:
1/ Lấy dữ liệu từ csv file đang đóng để đưa vào excel.
2/ Từ dữ liệu này và dữ liệu mẫu ta vẽ đồ thị đường dích dắc để so sánh (theo cách chia toạ độ excel).
3/ Lưu dữ liệu vào file xlsx hoặc xls để sau này cần truy xuất (không cần vẽ đồ thị).

Trong 3 bước trên thì 2 bước đầu em đã hoàn thành, chỉ còn bước thứ ba đọc tài liệu hoài mà không biết xử lý thế nào, vì dữ liệu của em không có Header cũng như ID cho cột đầu tiên. Attached file mẫu lên mọi người giúp em với.
Đề bài này là:

Khi thay đổi một ô C6 chẳng hạn trong vùng từ C6:AY6 tại file Source thì dữ liệu từ C3:C22 truyền sang file xlsx đang đóng ở cùng vị trí này. Nếu B6 thay đổi thì B3:B22 được truyền đi.

Em mới tìm hiểu thêm về ADO mong mọi người giúp đỡ!
Nhìn bảng dữ liệu của bạn mình rối quá, trộn ô nhiều quá, để làm = ado thì csdl phải chuẩn mới có thể làm đúng yêu cầu bạn được.
 
Nhìn bảng dữ liệu của bạn mình rối quá, trộn ô nhiều quá, để làm = ado thì csdl phải chuẩn mới có thể làm đúng yêu cầu bạn được.

Hi Anh,

Vậy anh chỉ dùm em cách chuyển dữ liệu vùng từ C3:C22 vào range C3:C22 file xlsx đang đóng ạ, phần còn lại em sẽ tự tìm hiểu thêm.

Em cảm ơn!
 
Các anh chị cho Dhn46 hỏi:
- Dùng câu lệnh SQL đơn giản nhất để lọc ra danh sách những dòng có Qty lớn thứ 2 (hoặc thứ n) tương ứng với mỗi ID.
- Dhn46 đính kèm file mẫu để anh chị hiểu hơn câu hỏi.
Xin cảm ơn GPE
 

File đính kèm

Nguyên tắc giải đề này là sô lớn thứ 2 cách số lớn nhất 1 khoảng nhỏ nhất
- dùng group by để nhóm ra theo ID và dùng hàm max để lấy qty lớn nhất, gọi là qmax
- dùng inner join để kết nối câu truy vấn con trên với bảng chính theo ID
- tạo trường qmax - qty as khoangCach
- group by lần nữa để nhóm ra theo ID, qmax và dùng hàm min để lấy khoangCach nhỏ nhất, goi là kcMin
- inner join với bảng chính theo ID lần nữa và lọc thoe điều kiện qmax-qty = kcMin

Chạy thử, nếu thấy ra đúng thì tìm cách rút gọn.

??? Đây không phải là một vấn đề đơn giản để gọi là "bài tập căn bản". Mục đích truy vấn này quá sức rắc rối.
Theo nguyên tắc CSDL, việc truy vấn phải tương đối dễ dàng. Nếu có sự rắc rối thì bảng và CSDL nên thiết kế lại cho phù hợp.
 
Lần chỉnh sửa cuối:
Các anh chị cho Dhn46 hỏi:
- Dùng câu lệnh SQL đơn giản nhất để lọc ra danh sách những dòng có Qty lớn thứ 2 (hoặc thứ n) tương ứng với mỗi ID.
- Dhn46 đính kèm file mẫu để anh chị hiểu hơn câu hỏi.
Xin cảm ơn GPE
Không biết đây là câu đố hay là vướng mắc của bạn? Nếu đố thì mình sẽ di chuyển bài này sang topic khác.

Nguyên tắc giải đề này là sô lớn thứ 2 cách số lớn nhất 1 khoảng nhỏ nhất
- dùng group by để nhóm ra theo ID và dùng hàm max để lấy qty lớn nhất, gọi là qmax
- dùng inner join để kết nối câu truy vấn con trên với bảng chính theo ID
- tạo trường qmax - qty as khoangCach
- group by lần nữa để nhóm ra theo ID, qmax và dùng hàm min để lấy khoangCach nhỏ nhất, goi là kcMin
- inner join với bảng chính theo ID lần nữa và lọc thoe điều kiện qmax-qty = kcMin

Chạy thử, nếu thấy ra đúng thì tìm cách rút gọn.

??? Đây không phải là một vấn đề đơn giản để gọi là "bài tập căn bản". Mục đích truy vấn này quá sức rắc rối.
Theo nguyên tắc CSDL, việc truy vấn phải tương đối dễ dàng. Nếu có sự rắc rối thì bảng và CSDL nên thiết kế lại cho phù hợp.

Không nhất thiết phải group quá nhiều lần như vậy đâu bạn.
 
...
Không nhất thiết phải group quá nhiều lần như vậy đâu bạn.

Đơn giản cho dễ thôi. Tôi có nói là sau khi chạy ra kết quả thì tìm cách rút gọn lại.
Nếu dùng thủ thuật nội kết (correlated query) thì có thể không phải group lần nào cả. Tuy nhiên nội kết nhiều lần xem chẳng ai hiểu gì cả, lúc cần chỉnh sửa có mà tỏi.
 
Đơn giản cho dễ thôi. Tôi có nói là sau khi chạy ra kết quả thì tìm cách rút gọn lại.
Nếu dùng thủ thuật nội kết (correlated query) thì có thể không phải group lần nào cả. Tuy nhiên nội kết nhiều lần xem chẳng ai hiểu gì cả, lúc cần chỉnh sửa có mà tỏi.

Chỉ cần select 3 cột, join, group và 1 điều kiện là đủ. Không cần dùng sub query chi cho rắc rối.
 
Lần chỉnh sửa cuối:
Không biết đây là câu đố hay là vướng mắc của bạn? Nếu đố thì mình sẽ di chuyển bài này sang topic khác..

Anh HLMT, đây là vướng mắc của em anh ah. Em cũng mới đang tìm hiểu ADO nên có rất nhiều vướng mắc mong các anh chị quan tâm và cho câu trả lời. Cảm ơn anh!
 
Anh HLMT, đây là vướng mắc của em anh ah. Em cũng mới đang tìm hiểu ADO nên có rất nhiều vướng mắc mong các anh chị quan tâm và cho câu trả lời. Cảm ơn anh!
Vậy thì bạn thử làm như sau, không biết có trúng hay không, phần điều kiện tôi làm theo ý bạn, bạn muốn chỉnh sửa thì thay đổi lại theo ý muốn nhé.

[GPECODE=sql]Sub Loc_HLMT()
Set adoConn = CreateObject("ADODB.Connection")
Set adoRS = CreateObject("ADODB.Recordset")
With adoConn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "SELECT a.id,a.qty,a.remarks " & _
"FROM [Sheet1$a1:C1000] AS a " & _
"INNER JOIN [Sheet1$a1:C1000] AS b ON (a.id = b.id) AND (a.qty < b.qty) " & _
"GROUP BY a.id,a.qty,a.remarks " & _
"HAVING COUNT(*) = 1"
End With
Sheet1.[H2:J1000].Clear
If adoRS.EOF Then
MsgBox "Khong co du lieu roi", vbCritical
Else
Sheet1.[H2].CopyFromRecordset adoRS
End If
adoRS.Close: Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing

End Sub

[/GPECODE]

P/S: Đang tìm hiểu mà có cái "vướng mắc" không hề đơn giản :)
 

File đính kèm

Nếu mỗi tổ hợp ID và Qty là duy nhất thì đúng (mỗi ID có thể nhiều Qty, nhưng các Qty không được giống nhau)
Nếu không có điều kiện trên thìn không làm vậy được.
 
Nếu mỗi tổ hợp ID và Qty là duy nhất thì đúng (mỗi ID có thể nhiều Qty, nhưng các Qty không được giống nhau)
Nếu không có điều kiện trên thìn không làm vậy được.

Để xử lý cái này dể mà bạn, chỉ cần thêm 1 subquery là ra, chứ không nhiều sub như bạn nói.
 
Vậy thì bạn thử làm như sau, không biết có trúng hay không, phần điều kiện tôi làm theo ý bạn, bạn muốn chỉnh sửa thì thay đổi lại theo ý muốn nhé.
P/S: Đang tìm hiểu mà có cái "vướng mắc" không hề đơn giản :)
- Cảm ơn anh HLMT, kết quả đúng ý em rồi ạ. Mặc dù em chưa nghĩ đến tình huống bài #234 nhưng sẽ tìm hiểu sau khi hiểu thấu đáo câu truy vấn của anh.
- Anh có thể giải thích cho em kỹ hơn 1 chút về đoạn Count(*) được không ạ? Em đọc 1 số tài liệu nhưng chưa hiểu thấu đáo cái này.

* Em xin giải thích 1 chút về phần chữ màu xanh và bài #233:
Trong quá trình tìm hiểu ADO em có đọc topic này : http://www.giaiphapexcel.com/forum/showthread.php?82846-Gi%C3%BAp-m%C3%ACnh-code-loc-d%E1%BB%AF-li%E1%BB%87u-theo-%C4%91i%E1%BB%81u-ki%E1%BB%87n và em thấy có thể giải quyết được bằng SQL. Trích lọc Max, Min thì em làm được còn lấy giá trị Max2 thì đang gặp khó nên hỏi (và e hỏi mở rộng 1 chút là lấy Max thứ n nữa). Mới tìm hiểu nên đâu dám thách đố ai đâu anh.

dhn46 cảm ơn anh và các anh chị đã quan tâm giúp đỡ.
 
Đại khái thì lý thuyết nó như thế này, cũng chưa thử

Mã:
select * from Bang B1 where 
 (N - 1) = (select count(distinct(Qty)) 
            from Bang B2 
            where B2.ID = B1.ID 
            and B2.Qty > B1.Qty )
-- muốn số lớn thứ mấy thì thay vào N. Trong đề bài này, muốn số lớn thứ 2 nên N=2
-- đối với loại truy vấn này, câu truy vấn con đề cập đến phần tử (bảng) của câu bọc ngoài nó
-- nên được gọi là correlated subquery

=== chỉnh sửa
where B2.ID > B1.ID ) ===> sửa thành where B2.ID = B1.ID

Đã thử, kết quả chính xác với mọi giá trị của N
 
Lần chỉnh sửa cuối:
Mọi người xem giúp mình câu lệnh dùng UNION ALL sai ở chổ nào mà khi thực hiện riêng lẽ từng câu lệnh thì ra kết quả còn khi kết hợp với UNION ALL thì chỉ ra kết quả của câu lệnh thứ 2 thôi. Xin cám ơn rất nhiều.

mySql = "SELECT NHT, SH, NCT, NDTH, TST, 0 AS TT, 0 As NT FROM [DL] "
 
Lần chỉnh sửa cuối:
Mọi người xem giúp mình câu lệnh dùng UNION ALL sai ở chổ nào mà khi thực hiện riêng lẽ từng câu lệnh thì ra kết quả còn khi kết hợp với UNION ALL thì chỉ ra kết quả của câu lệnh thứ 2 thôi. Xin cám ơn rất nhiều.

mySql = "SELECT NHT, SH, NCT, NDTH, TST, 0 AS TT, 0 As NT FROM [DL] " & Chr(10)
mySql = mySql & "WHERE (MK='" & Kh & "') And (TKC='" & TK & "') And (MNV='" & LTU & "') And TST Is not null And (NHT BETWEEN " & Date1 & " And " & Date2 & ")"
mySql = mySql & "UNION ALL" & Chr(10)
mySql = "SELECT NHT, SH, NCT, NDTH, 0, TST, 0 FROM [DL] " & Chr(10)
mySql = mySql & "WHERE (MK='" & Kh & "') And (MNV='" & NV & "') And TST Is not null And (NHT BETWEEN " & Date1 & " And " & Date2 & ");"
Đưa dữ liệu lên test thử nha bạn.
 
Bạn chưa biết luật debug câu SQL trong code à? Đưa code như vậy lấy gì thử?
Dùng debug in giá trị cuối cùng của mySQL của cả hai trường hợp riêng lẻ và union hai khối đưa lên đây. Đọc code cộng tới cộng lui mỏi mắt quá. Thông số tùm lum, biết đâu mà mò.
Phần lớn trường hợp là sau khi in ra mySQL thì bạn sẽ tự nhìn thấy chỗ sai.
 
Vâng! em đưa file lên mấy anh xem giúp dùm em. Nó chỉ ra kết quả của câu lệnh cuối cùng thôi.
Cho em hỏi thêm mệnh đề COMPUTE BY có sử dụng được trong ADO không? Sao em đưa vào nó cứ báo lỗi? Cám ơn các anh rất nhiều.
 

File đính kèm

Lần chỉnh sửa cuối:
Vâng! em đưa file lên mấy anh xem giúp dùm em. Nó chỉ ra kết quả của câu lệnh cuối cùng thôi.
Cho em hỏi thêm mệnh đề COMPUTE BY có sử dụng được trong ADO không? Sao em đưa vào nó cứ báo lỗi? Cám ơn các anh rất nhiều.

Chỉnh lại như sau, bạn biết sai chổ nào rồi chứ?
mySql = "SELECT NHT, SH, NCT, NDTH, TST, 0 As TT, 0 As NT FROM [DL] " & Chr(10)
mySql = mySql & "WHERE (MK='" & Kh & "') And (TKC='" & TK & "') And (MNV='" & LTU & "') And TST Is not null And (NHT BETWEEN " & Date1 & " And " & Date2 & ")"
mySql = mySql & "UNION ALL" & Chr(10)
mySql = mySql & "SELECT NHT, SH, NCT, NDTH, 0, TST, 0 FROM [DL] " & Chr(10)
mySql = mySql & "WHERE (MK='" & Kh & "') And (MNV='" & NV & "') And TST Is not null And (NHT BETWEEN " & Date1 & " And " & Date2 & ");"
mySql = mySql & "UNION ALL" & Chr(10)
mySql = mySql & "SELECT NHT, SH, NCT, NDTH, 0, 0, TST FROM [DL] " & Chr(10)
mySql = mySql & "WHERE (MK='" & Kh & "') And (TKN='" & TK & "') And (MNV='NTU') And TST Is not null And (NHT BETWEEN " & Date1 & " And " & Date2 & ")"
COMPUTE là lệnh thực hiện ở SQL Server, trên Excel bạn không thực hiện được lệnh này.
 
Lần chỉnh sửa cuối:
Cám ơn Anh rất nhiều. Em hiện đang áp dụng ODA vào trong công tác kế toán thay thế cho các công thức phải chạy ì ạch khi dử liệu nhiều để lập các BC tài chính và Sổ sách kế toán. Nhưng em còn nhiều chổ "bí" quá anh có thể gíup em k?
Anh làm ơn xem giúp Câu lệnh của Báo cáo tài chính giúp em, xem coi có thể rút gọn lại đc k hay dùng câu lệnh khác hay hơn không. Với lại em muốn nó chỉ ra kết quả của những dòng có dử liệu thôi nhưng em dùng HAVING mà nó cứ báo lỗi.
Anh xem giúp em nhé. Cám ơn anh rất nhiều!
 

File đính kèm

Lần chỉnh sửa cuối:

File đính kèm

Lần chỉnh sửa cuối:
Mọi người xem dùng mình mệnh đề HAVING sai chổ nào mà nó báo lỗi. Mình cám ơn rất nhiều.

Tạo thêm 1 sub query nữa xem sao bạn:
mySql = "SELECT MK, M, TM, " & Chr(10)
mySql = mySql & "SUM(IIf(((TKC = '" & TK4 & "') And MCP = 'DT' And(NHT>=" & Date1 & ")) Or ((TKN = '" & TK6 & "') And MNKP = 'PLP' And (NTT>=" & Date1 & ")), [ST],0)) AS KPKN, " & Chr(10)
mySql = mySql & "SUM(IIf(((TKC = '" & TK4 & "') And MCP = 'DT') Or ((TKN = '" & TK6 & "') And MNKP = 'PLP' And NTT > 0), [ST],0)) AS KPLK, " & Chr(10)
mySql = mySql & "SUM(IIf(((TKN = '" & TK6 & "') And (MNKP = 'NS' Or (MNKP = 'PLP' And (NTT>=" & Date1 & "))) And (NHT>=" & Date1 & ")) Or ((TKC = '" & TK4 & "') And (TKN Like '33%') And MNKP = 'NS' And MNV = 'TC' And (NHT>=" & Date1 & ")), [ST],0)) AS QTKN, " & Chr(10)
mySql = mySql & "SUM(IIf((TKN = '" & TK6 & "') And (MNKP = 'NS' Or (MNKP = 'PLP' And NTT > 0)) Or ((TKC = '" & TK4 & "') And (TKN Like '33%') And MNKP = 'NS' And MNV = 'TC'), [ST],0)) AS QTLK, " & Chr(10)
mySql = mySql & "SUM(IIf((TKN = '" & TK4 & "') And (NHT>=" & Date1 & "), [ST],0)) AS NopKN, " & Chr(10)
mySql = mySql & "SUM(IIf((TKN = '" & TK4 & "'), [ST],0)) AS NopLK" & Chr(10)
mySql = mySql & "FROM [DL] " & Chr(10)
mySql = mySql & "WHERE (MK = '" & Kh & "') And (NHT<=" & Date2 & ") And TM > 6000 " & Chr(10)
mySql = mySql & "GROUP BY MK, M, TM " & Chr(10)
mySql = mySql & "Order by MK, M, TM"
Recex.Open "select * from ( " & mySql & ") where ([KPKN] + [KPLK] + [QTKN] + [QTLK])>0", Cnex, adOpenKeyset, adLockOptimistic
 
Làm hẳn 1 hàm chuyển đổi luôn

Mã:
Function TransArr(sArr As Variant) As Variant
    Dim cllX As Long, cllY As Long, tmpX As Long, tmpY As Long, tmpArr As Variant
    tmpX = UBound(sArr, 2):    tmpY = UBound(sArr, 1)
    ReDim tmpArr(tmpX, tmpY)
    For cllX = 0 To tmpX
        For cllY = 0 To tmpY
            tmpArr(cllX, cllY) = sArr(cllY, cllX)
        Next cllY
    Next cllX
    TransArr = tmpArr

End Function

Chạy thử code sau:

[GPECODE=sql]Sub LayDL_ADO()
Dim lsSQL As String, cnn As Object, lrs As Object, rstArr As Variant, lFields As Long, lRecrds As Long
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;"
 

File đính kèm

Lần chỉnh sửa cuối:
Cách trích dữ liệu từ CSDL bằng ADO.

Chào mọi người!

Mình có file dữ liệu như đính kèm, ID là trường AutoNumber.
Các bạn giúp mình code ADO để lấy dữ liệu của machine SW1 hoặc SW2 v.v...Nói chung là lấy theo machine với điều kiện chỉ cần lấy thêm 7 record trước đó (của máy cần lấy).
Vì hiện tại khi mình cần lấy dữ liệu của máy SW1 mình phải select * from ...rồi mình cho vòng lặp chạy ngược để lấy dữ liệu cần, theo mình nghĩ khi dữ liệu của machine này càng lên thì câu lệnh truy vấn sẽ càng chậm.
Rất mong mọi người giúp đỡ!

Mình cảm ơn.
 

File đính kèm

Chào mọi người!

Mình có file dữ liệu như đính kèm, ID là trường AutoNumber.
Các bạn giúp mình code ADO để lấy dữ liệu của machine SW1 hoặc SW2 v.v...Nói chung là lấy theo machine với điều kiện chỉ cần lấy thêm 7 record trước đó (của máy cần lấy).
Vì hiện tại khi mình cần lấy dữ liệu của máy SW1 mình phải select * from ...rồi mình cho vòng lặp chạy ngược để lấy dữ liệu cần, theo mình nghĩ khi dữ liệu của machine này càng lên thì câu lệnh truy vấn sẽ càng chậm.
Rất mong mọi người giúp đỡ!

Mình cảm ơn.
Bạn giải thích rõ hơn phần in đậm được không?
 
Hi Bạn!

Giả sử trong CSDL của mình có 100 dòng của máy SW1 thì khi lấy mình chỉ lấy 7 dòng cuối cùng với câu lệnh SQL mà không phải lặp qua Table.

Thanks!
Bạn thử với Code sau
Mã:
Sub Loc()
    On Error GoTo Handle
    Dim cnn As Object, lsSQL As String, lrs As Object, FileFullName As String
    Set cnn = CreateObject("ADODB.Connection")
    Set lrs = CreateObject("ADODB.Recordset")
    FileFullName = Application.ThisWorkbook.FullName
    With cnn
        If Val(Application.Version) < 12 Then
            .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileFullName & ";Extended Properties=""Excel 8.0;HDR=No"";"
        Else
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileFullName & ";Extended Properties=""Excel 12.0;HDR=No"";"
        End If
        .Open
    End With
    lsSQL = "Select * From [DATATABLESPC$A2:AL65536] " _
            & " Where f5 ='SW1' " _
            & "And f1 > (Select Max(f1) As Mx From [DATATABLESPC$A2:AL65536]" _
            & "Where F5='SW1')-7"
            
    lrs.Open lsSQL, cnn, 3, 1
    Sheet2.[A2:AL65536].ClearContents
    Sheet2.Range("A2").CopyFromRecordset lrs
    Set lrs = Nothing
    cnn.Close: Set cnn = Nothing
    Exit Sub
Handle:
    MsgBox Err.Description
End Sub
 
Bạn thử với Code sau
Mã:
Sub Loc()
    On Error GoTo Handle
    Dim cnn As Object, lsSQL As String, lrs As Object, FileFullName As String
    Set cnn = CreateObject("ADODB.Connection")
    Set lrs = CreateObject("ADODB.Recordset")
    FileFullName = Application.ThisWorkbook.FullName
    With cnn
        If Val(Application.Version) < 12 Then
            .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileFullName & ";Extended Properties=""Excel 8.0;HDR=No"";"
        Else
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileFullName & ";Extended Properties=""Excel 12.0;HDR=No"";"
        End If
        .Open
    End With
    lsSQL = "Select * From [DATATABLESPC$A2:AL65536] " _
            & " Where f5 ='SW1' " _
            & "And f1 > (Select Max(f1) As Mx From [DATATABLESPC$A2:AL65536]" _
            & "Where F5='SW1')-7"
            
    lrs.Open lsSQL, cnn, 3, 1
    Sheet2.[A2:AL65536].ClearContents
    Sheet2.Range("A2").CopyFromRecordset lrs
    Set lrs = Nothing
    cnn.Close: Set cnn = Nothing
    Exit Sub
Handle:
    MsgBox Err.Description
End Sub

Dùng câu lệnh select top sẽ nhanh hơn nhiều đó bạn.
 
Em lại học thêm được một cái mới, cảm ơn anh HLMT
Mã:
    lsSQL = "Select Top 7 f1,* from [DATATABLESPC$A2:AL65536] Where f5='SW2' Order By f1 Desc"
Hi 2 Bạn,

Mình cảm ơn nhiều nha, thật ra thì ứng dụng của mình viết trên vb.net nhưng về sql chắc giống nhau. Mình sẽ thử và ứng dụng cho phù hợp.
Bây giờ mình lại có thêm 1 yêu cầu mới: record của mình có các cột như: machine, stock, lot, REV
Khi tìm 1 lot theo REV từ CSDL mình làm như sau:
1/ Chọn dữ liệu theo Lot (để lấy REV)
SELECT DISTINCT [REV] FROM [DATATABLESPC] WHERE [lot] ='" & Trim(Me.tbLotFind.Text.ToUpper) & "'"
REVString = REV cuối cùng trong kết quả của câu lệnh trên.
2/ Tìm dữ liệu liên quan đến lot và REV trên.
SELECT * FROM [DATATABLESPC] WHERE [stock] ='" & Trim(partString) & "' AND [machine] ='" & Trim(machineString) & "' AND [REV] ='" & REVString & "'"

Các bạn giúp mình gộp lại trong 1 câu lệnh truy vấn với nhé!

Thanks!

Em lại học thêm được một cái mới, cảm ơn anh HLMT
Mã:
    lsSQL = "Select Top 7 f1,* from [DATATABLESPC$A2:AL65536] Where f5='SW2' Order By f1 Desc"

Mình vừa thử Code của bạn trên SQL, kết quả trả về đúng số record mình cần nhưng lại sắp xếp theo thứ tự giảm dần mất.
Mình muốn lấy 7 hàng cuối nhưng vẫn theo thứ tự cái nào có trước thì nằm trước được không bạn?

Thanks

Hi

Mình làm lại như thế này không biết có ảnh hưởng đến tốc độ của lệnh truy vấn không các bạn giúp mình kiểm tra với

SELECT * FROM (SELECT TOP 10 * FROM [DATATABLESPC] WHERE [stock] ='" & Trim(partNumberString) & "' AND [machine] = '" & machineName & "' AND [REV] ='" & revPart & "' ORDER BY ID DESC) ORDER BY ID ASC"

Thanks
 
Chỉnh sửa lần cuối bởi điều hành viên:
Hi 2 Bạn,

Mình cảm ơn nhiều nha, thật ra thì ứng dụng của mình viết trên vb.net nhưng về sql chắc giống nhau. Mình sẽ thử và ứng dụng cho phù hợp.
Bây giờ mình lại có thêm 1 yêu cầu mới: record của mình có các cột như: machine, stock, lot, REV
Khi tìm 1 lot theo REV từ CSDL mình làm như sau:
1/ Chọn dữ liệu theo Lot (để lấy REV)
SELECT DISTINCT [REV] FROM [DATATABLESPC] WHERE [lot] ='" & Trim(Me.tbLotFind.Text.ToUpper) & "'"
REVString = REV cuối cùng trong kết quả của câu lệnh trên.
2/ Tìm dữ liệu liên quan đến lot và REV trên.
SELECT * FROM [DATATABLESPC] WHERE [stock] ='" & Trim(partString) & "' AND [machine] ='" & Trim(machineString) & "' AND [REV] ='" & REVString & "'"

Các bạn giúp mình gộp lại trong 1 câu lệnh truy vấn với nhé!

Thanks!

Tôi cũng chưa hình dung được chính xác dữ liệu của bạn như thế nào nhưng sau khi dùng SELECT DISTINCT bạn nói:
REVString = REV cuối cùng trong kết quả của câu lệnh trên.
là như thế nào? Bạn dùng vòng lặp để lấy?

Và dường như vấn đề chỉ là lấy dữ liệu dòng cuối cùng REV vậy bạn lại sử dụng câu lệnh Select Top 1 rồi gán vào vị trí của câu lệnh thứ 2.


SELECT * FROM (SELECT TOP 10 * FROM [DATATABLESPC] WHERE [stock] ='" & Trim(partNumberString) & "' AND [machine] = '" & machineName & "' AND [REV] ='" & revPart & "' ORDER BY ID DESC) ORDER BY ID ASC"

Bạn có thể tự test tốc độ nhưng đã có thêm thao tác thì kiểu gì tốc độ cũng ảnh hưởng bạn à.
 
Tôi cũng chưa hình dung được chính xác dữ liệu của bạn như thế nào nhưng sau khi dùng SELECT DISTINCT bạn nói:

là như thế nào? Bạn dùng vòng lặp để lấy?

Và dường như vấn đề chỉ là lấy dữ liệu dòng cuối cùng REV vậy bạn lại sử dụng câu lệnh Select Top 1 rồi gán vào vị trí của câu lệnh thứ 2.




Bạn có thể tự test tốc độ nhưng đã có thêm thao tác thì kiểu gì tốc độ cũng ảnh hưởng bạn à.

Hi Bạn
Cảm ơn nhiều nha!
Không biết như thế nào nhưng sao mình đọc tài liệu thấy khi dùng ORDER BY thì tốc độ chậm vì SQL phải sort trước mới lấy dữ liệu, vậy nên chắc mình sẽ làm theo cách trên chứ lồng vào thì khi CSDL của máy SW1 tăng lên tốc độ sẽ chậm hơn mất.
Nếu lấy theo cách cũ thì câu lệnh đầu tiên của mình chỉ trích tối đa 10 hàng theo lot mà thôi. Sau đó mình lấy REV rồi truy vấn tiếp cũng được.
Hay chắc mình thử dùng Max thử đã, có gì mình nt cho bạn sau nha.

Thân
 
Lần chỉnh sửa cuối:
Tại sao AddIn không hoạt động?

Mình thấy mỗi lần viết code dùng đến ADO thì cứ viết mấy dòng code giống nhau nên mình nghĩ có thể viết 1 hàm này để mở kết nối
PHP:
Public Function MoketNoi(path As String, Optional ByVal Headers As Boolean = True) As Object
    Dim strConn As String, objConn As Object
    Set objConn = CreateObject("ADODB.Connection")
    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
              "Data Source=" & path & ";" & _
              "Extended Properties=""Excel 8.0;HDR=" & _
              IIf(Headers, "Yes", "No") & """"
    objConn.Open strConn
    Set MoketNoi = objConn
End Function
Khi hàm này nằm trong file thì hoạt động tốt, nhưng khi lưu hàm này thành 1 addin riêng biệt thì hàm không hoạt động.
Các anh chị vui lòng giải thích giúp tại sao và làm sao khắc phục điều này.
 
Mình thấy mỗi lần viết code dùng đến ADO thì cứ viết mấy dòng code giống nhau nên mình nghĩ có thể viết 1 hàm này để mở kết nối

Khi hàm này nằm trong file thì hoạt động tốt, nhưng khi lưu hàm này thành 1 addin riêng biệt thì hàm không hoạt động.
Các anh chị vui lòng giải thích giúp tại sao và làm sao khắc phục điều này.

Vụ này tôi không biết giải thích, nhưng Hải thử viết module và chọn lựa viết Macro trong "Personal Macro workbook" xem sao.

Ghi chú:
Personal macro workbook là 1 workbook mở đồng thời với Excel tương tự Add-in và template.

Ngoài ra tôi nghĩ rằng nếu gọi hàm từ workbook khác có lẽ phải gọi cả tên workbook chứa hàm? (Chưa thử)
 
Lần chỉnh sửa cuối:
Mình thấy mỗi lần viết code dùng đến ADO thì cứ viết mấy dòng code giống nhau nên mình nghĩ có thể viết 1 hàm này để mở kết nối
PHP:
Public Function MoketNoi(path As String, Optional ByVal Headers As Boolean = True) As Object
    Dim strConn As String, objConn As Object
    Set objConn = CreateObject("ADODB.Connection")
    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
              "Data Source=" & path & ";" & _
              "Extended Properties=""Excel 8.0;HDR=" & _
              IIf(Headers, "Yes", "No") & """"
    objConn.Open strConn
    Set MoketNoi = objConn
End Function
Khi hàm này nằm trong file thì hoạt động tốt, nhưng khi lưu hàm này thành 1 addin riêng biệt thì hàm không hoạt động.
Các anh chị vui lòng giải thích giúp tại sao và làm sao khắc phục điều này.

Hàm này chưa tổng quát để thực hiện được với những câu lệnh khác.
 
Hàm này chưa tổng quát để thực hiện được với những câu lệnh khác.
Ui da, HLMT trả lời vậy thì mình pó tay rồi. Trước mắt mình cần biết tại sao hàm nằm trong file thì chạy, nhưng lưu thành addin không xài được. Còn chuyện tổng quát từ từ tính sau.
Mục tiêu của mình là khi dùng ADO không phải viết lại những câu lệnh này nữa, file nào cũng có thể mở kết nối thông qua hàm này.
 
Ui da, HLMT trả lời vậy thì mình pó tay rồi. Trước mắt mình cần biết tại sao hàm nằm trong file thì chạy, nhưng lưu thành addin không xài được. Còn chuyện tổng quát từ từ tính sau.
Mục tiêu của mình là khi dùng ADO không phải viết lại những câu lệnh này nữa, file nào cũng có thể mở kết nối thông qua hàm này.

Ngay cả hàm bình thường như hàm đọc số, hàm tính bình phương, ... trong add-in cũng không gọi được từ file khác.

Ở trên tôi có viết là hãy thử trong Personal macro workbook, nhưng xin lỗi, khi tôi thử cũng không gọi được.
 
Ui da, HLMT trả lời vậy thì mình pó tay rồi. Trước mắt mình cần biết tại sao hàm nằm trong file thì chạy, nhưng lưu thành addin không xài được. Còn chuyện tổng quát từ từ tính sau.
Mục tiêu của mình là khi dùng ADO không phải viết lại những câu lệnh này nữa, file nào cũng có thể mở kết nối thông qua hàm này.
Thì có những câu lệnh nằm "trong file" cũng có chạy được đâu.
 
Ngay cả hàm bình thường như hàm đọc số, hàm tính bình phương, ... trong add-in cũng không gọi được từ file khác.

Ở trên tôi có viết là hãy thử trong Personal macro workbook, nhưng xin lỗi, khi tôi thử cũng không gọi được.

Vậy là ý tưởng đơn giản hóa cho việc viết code dùng Ado của em bị phá sản rồi. Nhưng em cũng là có ý tưởng tích cực.
Thì có những câu lệnh nằm "trong file" cũng có chạy được đâu.
Đây là file mình test thì hàm chạy được
 

File đính kèm

Lần chỉnh sửa cuối:
Vậy là ý tưởng đơn giản hóa cho việc viết code dùng Ado của em bị phá sản rồi. Nhưng em cũng là có ý tưởng tích cực.

Đây là file mình test thì hàm chạy được
Với câu lệnh này thì không cần khởi tạo (Set REC = CreateObject("ADODB.Recordset")) ==> Nếu dùng cách không khởi tạo sẽ phát sinh lỗi.
 
Với câu lệnh này thì không cần khởi tạo (Set REC = CreateObject("ADODB.Recordset")) ==> Nếu dùng cách không khởi tạo sẽ phát sinh lỗi.

Đọc tới đọc lui vẫn không suy ra được ý nghĩa của lời giải thích này. Kỳ quá hà.
Không cần khởi tạo vậy khởi tạo là thừa, nhưng nếu không khởi tạo thì có lỗi >>> Vậy là sao?
 
ADO có ngầm chứa từ "ActiveX". Nó là một công cụ nguy hiểm. Khi nói "nguy hiểm", không phải tôi bàn không nên dùng, chỉ nhấn mạnh không nên dùng bừa bãi.

Những công cụ nguy hiểm không ai cho vào Personal hay Add-ín cả. Bình thường người ta cô lập chúng vào một vài modules đặc biệt và export ra một file .bas để dành đó. Khi cần thì import vào.

Mẹo nhỏ:

Sau khi export ra một file .bas rồi, dùng NotePad mở ra và thay dòng đầu tiên:

Attribute VB_Name = "TienIch_ADO"
...
Option Explicit
'

Dòng Attribute này bảo Project import tạo Module tên như vậy. Thay vì Module1, Module2, vv...
 
Hi All

Các bạn nào có kinh nghệm về SQL server cho mình hỏi tí nhé!
Vấn đề là mình muốn tạo 1 cơ chế tự động cho 1 file SQL, khi mình insert 1 dòng vào file này thì file tự động đếm số hàng đã có, nếu số hàng >100 thì tự động Delete 1 dòng cũ nhất.
Nếu SQL mình dùng lâu ngày dữ liệu tăng cao, số record cho mỗi lần truy xuất lớn thì tốc độ có chậm như khi mình dùng với access không các bạn?

Thanks
Thân
 
Hi All

Các bạn nào có kinh nghệm về SQL server cho mình hỏi tí nhé!
Vấn đề là mình muốn tạo 1 cơ chế tự động cho 1 file SQL, khi mình insert 1 dòng vào file này thì file tự động đếm số hàng đã có, nếu số hàng >100 thì tự động Delete 1 dòng cũ nhất.
Nếu SQL mình dùng lâu ngày dữ liệu tăng cao, số record cho mỗi lần truy xuất lớn thì tốc độ có chậm như khi mình dùng với access không các bạn?

Thanks
Thân

Vấn đề của SQL Server thì kiếm mấy diễn đàn chuyên về MSSQL mà hỏi. Đề bài này chuyên về ADO, chỉ là một công cụ lấy dữ liệu.

Dân làm việc với CSDL không ai xoá dòng tự động như thế. Người ta dời nó sang một cái archive table. Đối với CSDL lớn thì có nhiều partitions, người ta dời nó snag partition khác.

Theo tôi hiểu thì cái bạn muốn là sẽ dùng trigger để tự động sửa đổi dữ liệu. Nếu bạn vào mấy trang CSDL chuyên nghiệp sẽ thấy dân làm việc với số dữ liệu lớn rất hiếm khi dùng trigger. Hầu hết những liên hệ khoá đều được hiểu ngầm. Nếu bạn có một CSDL lớn mà phải dùng đến những công việc tự động như thế thì tốt hơn hết nên thiết kế lại.
 
Vấn đề của SQL Server thì kiếm mấy diễn đàn chuyên về MSSQL mà hỏi. Đề bài này chuyên về ADO, chỉ là một công cụ lấy dữ liệu.

Dân làm việc với CSDL không ai xoá dòng tự động như thế. Người ta dời nó sang một cái archive table. Đối với CSDL lớn thì có nhiều partitions, người ta dời nó snag partition khác.

Theo tôi hiểu thì cái bạn muốn là sẽ dùng trigger để tự động sửa đổi dữ liệu. Nếu bạn vào mấy trang CSDL chuyên nghiệp sẽ thấy dân làm việc với số dữ liệu lớn rất hiếm khi dùng trigger. Hầu hết những liên hệ khoá đều được hiểu ngầm. Nếu bạn có một CSDL lớn mà phải dùng đến những công việc tự động như thế thì tốt hơn hết nên thiết kế lại.

Hi Bạn

Cảm ơn thông tin của bạn, CSDL của mình 1 ngày có thể lên đến 2000 record, nếu quản lý truy xuất và Insert bình thường thì mình không có vấn đề gì. Tuy nhiên mỗi lần đo dữ liệu mình phải lấy lên tất cả dữ liệu liên quan từ trước(áp dụng cho SPC), để nhìn được tổng quan quá trình.
Ví dụ ở xưởng mình có 100 máy, mỗi máy chạy nhiều part number khác nhau. Mỗi lần đo SPC trên 1 máy ứng với partnumber đó thì phải có dữ liệu cũ.
Mình có ý định sẽ lưu 1 CSDL riêng và 1 CSDL tạm thời (mỗi máy mỗi part chỉ tối đa 1000 record). Lúc lưu dữ liệu mình sẽ lưu vào cả 2 CSDL trên. Một CSDL sẽ tự động xoá đi khi đầy lên để tránh tình trạng chậm tốc độ (dùng trong đo SPC). Còn truy xuất sẽ lấy ở CSDL đầy đủ.
Vì mình chưa thực hiện trên SQL nên mong bạn thông cảm.
Còn về tốc độ truy xuất không biết trên SQL có chậm đi khi dữ liệu tăng lên nhiều không bạn?

Thân
 
Thiết kế dở bẹt.
Sợ đầy thì đặt một chương trình dọn rác. Cuối ngày (nếu không làm việc ban đêm) chương trình đọc bảng và dọn đi những dữ liệu cũ quá. Thế nào là cũ và xử lý những trường hợp ra sao thì thiết kế xong sẽ thấy.

Sợ chậm mà dùng trigger/auto delete là nhìn lạc đường rồi; những cái này chỉ tổ làm chậm thêm.

Sử dụng SQL Server thì tối thiểu bạn phải có một kiến thức về index và key của nó thì mới truy vấn được. Đi gu gô từ khoá "SQL Việt" rồi vào đó mà hỏi (mình quảng cáo không công cho thằng Vũ Huy Tâm rồi!)
 
Thiết kế dở bẹt.
Sợ đầy thì đặt một chương trình dọn rác. Cuối ngày (nếu không làm việc ban đêm) chương trình đọc bảng và dọn đi những dữ liệu cũ quá. Thế nào là cũ và xử lý những trường hợp ra sao thì thiết kế xong sẽ thấy.

Sợ chậm mà dùng trigger/auto delete là nhìn lạc đường rồi; những cái này chỉ tổ làm chậm thêm.

Sử dụng SQL Server thì tối thiểu bạn phải có một kiến thức về index và key của nó thì mới truy vấn được. Đi gu gô từ khoá "SQL Việt" rồi vào đó mà hỏi (mình quảng cáo không công cho thằng Vũ Huy Tâm rồi!)

Hi

Qua đó thấy ngợp quá à, chắc tìm lớp online học thôi. hic. Ngày tháng còn dài

Cảm ơn VietMini
 
Hi All,

Các bạn cho mình hỏi vấn đề này với, có cách nào chỉ viết 1 câu lệnh SQL cho mục đích sau được không:
"Nếu A đã tồn tại trong CSDL thì Select thông tin của A, nếu không thì InSert 1 hàng mới cho A"
A là tên của khách hàng!

Thanks
 
Hi All,

Các bạn cho mình hỏi vấn đề này với, có cách nào chỉ viết 1 câu lệnh SQL cho mục đích sau được không:
"Nếu A đã tồn tại trong CSDL thì Select thông tin của A, nếu không thì InSert 1 hàng mới cho A"
A là tên của khách hàng!

Thanks

Chả có một câu lệnh nào làm được chuyện này cả.
Một bên trả về một dãy dữ liệu. Một bên trả về số dãy dữ liệu. Làm sao mà dùng lẫn lộn được?

Bắt buộc dùng một nhóm lệnh. Nhưng tốt hơn hết là dùng hai đoạn code riêng nhau.

*** Tôi dị ứng với các câu chào hỏi bằng tiếng tây tiếng u lắm! Du cặp với ai gió.
 
[TIP]Bài tập 5: Chèn 1 mẫu tin vào cơ sở dữ liệu[/TIP]

1./ Cú pháp:

[GPECODE=sql]INSERT INTO [Tên Bảng] ([Cột 1], [Cột 2], ...,[Cột n])
VALUES (GiaTri_1, GiaTri_2, ...,GiaTri_n)[/GPECODE]

Lưu ý phần GiaTri:

  • Nhập ngày thì phải thêm # bao quanh ngày (VD:#15/06/1977#)
  • Nhập số thì chỉ ghi số, không cần thêm gì cả
  • Nhập 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 nhập liệu 1 mẫu tin sau vào cơ sở dữ liệu
  • ID=415
  • W_HDATE=10/01/2013
  • PONO=DW12WQ009
  • MATERIAL NAME=POLY ZIPPER #5
  • COLOR NAME=BEIGE
  • UNIT=M
  • SUPPLIER=HHH VIETNAM
[/INFO1]
Mã:
Sub GHI_DL2()
Dim cn As Object
Dim rs As Object
Dim mysql As String
Set cn = CreateObject("ADODB.connection")
Set rs = CreateObject("ADODB.recordset")
With cn
    .ConnectionString = "provider=microsoft.ACE.OLEDB.12.0;" & _
                        "data source=" & ThisWorkbook.Path & _
                        "\data.xlsm;extended properties=""excel 12.0;HDR=Yes"";"
    .Open
End With
    mysql = "INSERT INTO [data$] (SELECT Stt,Ten,Ma,SL)" & _
            "VALUES ('123','HH','12H','1214')"
    rs.Open mysql, cn, 3, 3
cn.Close: Set cn = Nothing
End Sub
code này luôn báo lỗi
Mã:
Sub ghidl3()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim mysql As String
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
With cn
    .ConnectionString = "provider=microsoft.ACE.OLEDB.12.0;" & _
                        "data source=" & ThisWorkbook.Path & _
                        "\data.xlsm;extended properties=""excel 12.0;HDR=No;"";"
    .Open
End With
mysql = "INSERT INTO [data$] SELECT f1,f2,f3,f4 FROM [excel 12.0;database=" & _
                ThisWorkbook.FullName & ";HDR=No].[sheet1$A2:D17]"
rs.Open mysql, cn, 3, 3
cn.Close: Set cn = Nothing
End Sub
code này chạy vẫn bình thường
Mã:
Sub ghidl3()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim mysql As String
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
With cn
    .ConnectionString = "provider=microsoft.ACE.OLEDB.12.0;" & _
                        "data source=" & ThisWorkbook.Path & _
                        "\data.xlsm;extended properties=""excel 12.0;HDR=yes;"";"
    .Open
End With
mysql = "INSERT INTO [data$] SELECT stt,ten,ma,sl FROM [excel 12.0;database=" & _
                ThisWorkbook.FullName & ";HDR=yes].[sheet1$A1:D17]"
rs.Open mysql, cn, 3, 3
cn.Close: Set cn = Nothing
End Sub
cũng chạy bình thường
>>>>Anh giải thích giúp em với được không ạ!
(code ở file "chạy" ghi dữ liệu ở sheet :"sheet1" vào sheet: "data" của file "data"
 

File đính kèm

Lần chỉnh sửa cuối:
Mã:
Sub GHI_DL2()
Dim cn As Object
Dim rs As Object
Dim mysql As String
Set cn = CreateObject("ADODB.connection")
Set rs = CreateObject("ADODB.recordset")
With cn
    .ConnectionString = "provider=microsoft.ACE.OLEDB.12.0;" & _
                        "data source=" & ThisWorkbook.Path & _
                        "\data.xlsm;extended properties=""excel 12.0;HDR=Yes"";"
    .Open
End With
    mysql = "INSERT INTO [data$] ([B][COLOR=#ff0000]SELECT [/COLOR][/B]Stt,Ten,Ma,SL)" & _
            "VALUES ([COLOR=#ff0000][B]'[/B][/COLOR]123[B][COLOR=#ff0000]'[/COLOR][/B],'HH','12H',[B][COLOR=#ff0000]'[/COLOR][/B]1214[B][COLOR=#ff0000]'[/COLOR][/B])"
    rs.Open mysql, cn, 3, 3
cn.Close: Set cn = Nothing
End Sub
code này luôn báo lỗi
Mã:
Sub ghidl3()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim mysql As String
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
With cn
    .ConnectionString = "provider=microsoft.ACE.OLEDB.12.0;" & _
                        "data source=" & ThisWorkbook.Path & _
                        "\data.xlsm;extended properties=""excel 12.0;HDR=No;"";"
    .Open
End With
mysql = "INSERT INTO [data$] SELECT f1,f2,f3,f4 FROM [excel 12.0;database=" & _
                ThisWorkbook.FullName & ";HDR=No].[sheet1$A2:D17]"
rs.Open mysql, cn, 3, 3
cn.Close: Set cn = Nothing
End Sub
code này chạy vẫn bình thường
Mã:
Sub ghidl3()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim mysql As String
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
With cn
    .ConnectionString = "provider=microsoft.ACE.OLEDB.12.0;" & _
                        "data source=" & ThisWorkbook.Path & _
                        "\data.xlsm;extended properties=""excel 12.0;HDR=yes;"";"
    .Open
End With
mysql = "INSERT INTO [data$] SELECT stt,ten,ma,sl FROM [excel 12.0;database=" & _
                ThisWorkbook.FullName & ";HDR=yes].[sheet1$A1:D17]"
rs.Open mysql, cn, 3, 3
cn.Close: Set cn = Nothing
End Sub
cũng chạy bình thường
>>>>Anh giải thích giúp em với được không ạ!
(code ở file "chạy" ghi dữ liệu ở sheet :"sheet1" vào sheet: "data" của file "data"

Lỗi sai cú pháp, bạn nên đọc lại chổ tôi tô đỏ ở trên và cú pháp Insert tôi đã viết như sau:
INSERT INTO [Tên Bảng] ([Cột 1], [Cột 2], ...,[Cột n])
VALUES (GiaTri_1, GiaTri_2, ...,GiaTri_n)

Code chỉnh lại như sau:

[GPECODE=sql]Sub GHI_DL2()
Dim cn As Object
Set cn = CreateObject("ADODB.connection")
With cn
.ConnectionString = "provider=microsoft.ACE.OLEDB.12.0;" & _
"data source=" & ThisWorkbook.Path & _
"\data.xlsm;extended properties=""excel 12.0;HDR=Yes"";"
.Open
.Execute "INSERT INTO [data$] (Stt,Ten,Ma,SL)" & _
"VALUES (123,'HH','12H',1214)"
End With
cn.Close: Set cn = Nothing
End Sub[/GPECODE]
 
[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]
Mã:
Sub ghidl3()
Dim cn As Object
Dim rs As Object
Dim mysql As String
Set cn = CreateObject("ADODB.connection")
Set rs = CreateObject("ADODB.recordset")
With cn
    .ConnectionString = "provider=microsoft.ACE.OLEDB.12.0;" & _
                        "data source=" & ThisWorkbook.Path & _
                        "\data.xlsm;extended properties=""excel 12.0;HDR=yes;"";"
    .Open
End With
mysql = "UPDATE [data$] " & _
         "SET sl=12345" & _
         "WHERE stt =3"
rs.Open mysql, cn, 3, 1
cn.Close: Set cn = Nothing
End Sub
Cảm ơn anh! anh lại giúp kiểm tra cho em code tren vơi ạ! loay hoay mãi vẫn lối ạ.
 

File đính kèm

Bạn thay đổi đoạn code nay thêm dấu nháy vào
PHP:
"WHERE stt ='3'"
Vì dữ liệu ở file data là kiểu text nên nó không hiểu khi bạn dùng where stt=3 khi đó là kiểu số
 
Bạn thay đổi đoạn code nay thêm dấu nháy vào
PHP:
"WHERE stt ='3'"
Vì dữ liệu ở file data là kiểu text nên nó không hiểu khi bạn dùng where stt=3 khi đó là kiểu số

Thank bạn nhé! đúng là tiền bối đi trước có khác!
Mã:
mysql = "UPDATE [data$] " & _
         "SET sl=[COLOR=#ff0000]'[/COLOR]12345[COLOR=#ff0000]'[/COLOR]" & _
         "WHERE stt like '3'"
Vậy đồng nghĩa với chỗ gán sl = 12345 cũng phải cho trong dấu nháy " ' "
 
Lần chỉnh sửa cuối:
Thank bạn nhé! đúng là tiền bối đi trước có khác!
Mã:
mysql = "UPDATE [data$] " & _
         "SET sl=[COLOR=#ff0000]'[/COLOR]12345[COLOR=#ff0000]'[/COLOR]" & _
         "WHERE stt like '3'"
Vậy đồng nghĩa với chỗ gán sl = 12345 cũng phải cho trong dấu nháy " ' "
Có thể không dùng dấu nháy đơn như trên.
[GPECODE=sql]Sub ghidl3()
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
With cn
.ConnectionString = "provider=microsoft.ACE.OLEDB.12.0;" & _
"data source=" & ThisWorkbook.Path & _
"\data.xlsm;extended properties=""excel 12.0;HDR=yes;"";"
.Open
.Execute "UPDATE [data$] " & _
"SET sl=12345 " & _
"WHERE VAL(stt)=3"
End With
cn.Close: Set cn = Nothing
End Sub[/GPECODE]
 
Bạn dùng code sau nhé:

[GPECODE=sql]Private Sub UserForm_Initialize()
Dim cnn As New ADODB.Connection, lrs As New ADODB.Recordset, i As Integer
cnn.Open "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & _
ThisWorkbook.FullName & ";Extended Properties=Excel 8.0;"
lrs.Open "select * From [Temp$] ", cnn
With Me.ComboBox1
.Clear
Do
.AddItem lrs![LastName]
lrs.MoveNext
Loop Until lrs.EOF
End With
lrs.Close: Set lrs = Nothing
cnn.Close: Set cnn = Nothing

End Sub[/GPECODE]
Cho em hỏi đôi chút kiến thức về EOF với ạh!!
 
Thường thường người ta dùng
Do Until rs.EOF
...
Loop

Thay vì
Do
...
Loop Until rs.EOF

Lý do: tránh bị lỗi nếu recordset chả có hàng nào.

 
Để đọc dữ liệu từ file cvs , bạn có thể dùng nhiều cách , còn muốn dùng ADO thì tham khảo code sau :
[GPECODE=vb]
Sub GPE()
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
With cnn
.CursorLocation = 3
.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & "\" & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
End With

rst.Open "SELECT * FROM 001.csv", cnn, 3, 3, adCmdText
Range("A1:D100").ClearContents
Range("A1").CopyFromRecordset rst
rst.Close: Set rst = Nothing
cnn.Close: Set cnn = Nothing
End Sub
[/GPECODE]

Bạn giải thích thêm cho 3 cái này với : adCmdText và FMT=Delimited và Extended Properties=""text
 
Ví dụ mình có đoạn code như bên dưới, các bạn cho hỏi là giữa inner join, left join và right join có sự khác biệt hay là không? Xin giải thích.

[GPECODE=sql]Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$4" Then
Dim adoConn As Object, adoRS As Object
Set adoConn = CreateObject("ADODB.Connection")
Set adoRS = CreateObject("ADODB.Recordset")
With adoConn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "select T1.MS,T2.ten,T2.mau,T1.soluong " _
& "from [Data1$] T1 " _
& Sheet3.Range("C4").Value & " [Data2$] T2 " _
& "on T1.ms = T2.ms"
End With
With Sheet3
.[B8:E120].ClearContents
.[B8].CopyFromRecordset adoRS
End With
adoRS.Close: Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing

End If

End Sub

[/GPECODE]
P/s: Do các phần trên chưa nói đến phần căn bản này nên xin bổ sung thêm, mong các bạn hưởng ứng.
Xin lỗi anh HL nhưng vô tình em thấy file của anh Join.xlsm chạy rất tốt trên kingsoft ở dạng "KẾT NỐI ADO & SQL " tới chính file đang chạy. Cái này em thử và tìm hiểu rất nhiều mà không có được kết quả.Em tiếp tục đưa các code tương tự vào file của anh để truy vấn trên chính file Join.xlsm của anh mà trước đó hoàn toàn không kết nối được thì vẫn chạy bình thường.Em tắt file của anh đi và đưa lại những code đó vào workbook mới của kingsoft thì hoàn toàn lại không được gì cả dù đổi đuôi đủ thứ.Em lại mở file của anh lên và làm gì cũng được với chính file đó "ADO và SQL" . Nhưng chết cái save lại thì không được vì kiểm tra thấy file anh để dạng "Read-only" . Em save as lại ".xlsm" thì code lại không chạy được. Em bỏ read-only của file của anh cũng không chạy được. Em thử làm code truy vấn trên chính file hiện hành băng office 2007 OK và mở lại bằng kingsoft vẫn không được. Không biết file của anh trước khi gủi lên diễn đàn đã để read-only chưa vậy ạ hay em load về tự nó chuyển sang read-only. Nữa là file của anh có gì đặc biệt không mà chạy được trên kingsoft vậy ạ. ANH CÓ THỂ BỎ READ ONLY FILE JION TRÊN MÁY ANH VÀ GỦI LẠI CHO EM XIN FILE ĐÓ EM THỬ ĐƯỢC KHÔNG A" và có gì đó khác anh chỉ dẫn cho em với. XIN LỖI VÌ CHEN NGANG VẤN ĐỀ KHÁC Ạ. "Nhưng vẫn là muốn áp dụng cái ADO của anh rộng dãi thôi mà. Cảm ơn anh nhiều!!!
 
Xin lỗi anh HL nhưng vô tình em thấy file của anh Join.xlsm chạy rất tốt trên kingsoft ở dạng "KẾT NỐI ADO & SQL " tới chính file đang chạy. Cái này em thử và tìm hiểu rất nhiều mà không có được kết quả.Em tiếp tục đưa các code tương tự vào file của anh để truy vấn trên chính file Join.xlsm của anh mà trước đó hoàn toàn không kết nối được thì vẫn chạy bình thường.Em tắt file của anh đi và đưa lại những code đó vào workbook mới của kingsoft thì hoàn toàn lại không được gì cả dù đổi đuôi đủ thứ.Em lại mở file của anh lên và làm gì cũng được với chính file đó "ADO và SQL" . Nhưng chết cái save lại thì không được vì kiểm tra thấy file anh để dạng "Read-only" . Em save as lại ".xlsm" thì code lại không chạy được. Em bỏ read-only của file của anh cũng không chạy được. Em thử làm code truy vấn trên chính file hiện hành băng office 2007 OK và mở lại bằng kingsoft vẫn không được. Không biết file của anh trước khi gủi lên diễn đàn đã để read-only chưa vậy ạ hay em load về tự nó chuyển sang read-only. Nữa là file của anh có gì đặc biệt không mà chạy được trên kingsoft vậy ạ. ANH CÓ THỂ BỎ READ ONLY FILE JION TRÊN MÁY ANH VÀ GỦI LẠI CHO EM XIN FILE ĐÓ EM THỬ ĐƯỢC KHÔNG A" và có gì đó khác anh chỉ dẫn cho em với. XIN LỖI VÌ CHEN NGANG VẤN ĐỀ KHÁC Ạ. "Nhưng vẫn là muốn áp dụng cái ADO của anh rộng dãi thôi mà. Cảm ơn anh nhiều!!!

File mình gửi lên không set gì cả và cũng không có gì là đặc biệt. Để test trên kingsoft gì gì đó thì xin lỗi mình không biết.
 
mình thấy các ban thảo luận với nhau hay quá - xin lỗi vì chen ngang.
minh có copy code của các bạn vào file của mình. file chuong trình khi thực hiện sẽ ghi dữ liệu vào fìle data rất tốt bây giờ mình muốn làm ngược lại từ file chương trình Sheet2 lấy dữ liệu ở sheet tổng hợp của file data mà chưa làm được mong các bạn trợ giúp code ghi như sau:
file kèm
Sub ChuyenDL()
Dim Cnn As Object
Set Cnn = CreateObject("ADODB.Connection")
With Cnn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.Path & _
"\data.xlsb;Extended Properties=""Excel 12.0;HDR=No;"""
.Open
.Execute "INSERT INTO [Sheet1$] SELECT F1,F2,F3,F4,F5,F6,F7 FROM [Excel 12.0;Database=" & _
ThisWorkbook.FullName & ";HDR=No].[Sheet1$A6:G82]"
End With
Cnn.Close: Set Cnn = Nothing
End Sub
 

File đính kèm

mình thấy các ban thảo luận với nhau hay quá - xin lỗi vì chen ngang.
minh có copy code của các bạn vào file của mình. file chuong trình khi thực hiện sẽ ghi dữ liệu vào fìle data rất tốt bây giờ mình muốn làm ngược lại từ file chương trình Sheet2 lấy dữ liệu ở sheet tổng hợp của file data mà chưa làm được mong các bạn trợ giúp code ghi như sau:
file kèm
Sub ChuyenDL()
Dim Cnn As Object
Set Cnn = CreateObject("ADODB.Connection")
With Cnn
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & ThisWorkbook.Path & _
"\data.xlsb;Extended Properties=""Excel 12.0;HDR=No;"""
.Open
.Execute "INSERT INTO [Sheet1$] SELECT F1,F2,F3,F4,F5,F6,F7 FROM [Excel 12.0;Database=" & _
ThisWorkbook.FullName & ";HDR=No].[Sheet1$A6:G82]"
End With
Cnn.Close: Set Cnn = Nothing
End Sub
Bạn chạy code sau thử:

Mã:
Private Sub CommandButton1_Click()
    Dim adoConn As Object, adoRS As Object
    Set adoConn = CreateObject("ADODB.Connection")
    Set adoRS = CreateObject("ADODB.Recordset")
    With adoConn
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                            "Data Source=" & ThisWorkbook.Path & _
                            "\data.xlsb;Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
        .Open
    End With
    With adoRS
        .ActiveConnection = adoConn
        .Open "select * from [tonh hop$] "
    End With
    With Sheet2
        .[A2:G120].ClearContents
        .[A2].CopyFromRecordset adoRS
    End With
    adoRS.Close: Set adoRS = Nothing
    adoConn.Close: Set adoConn = Nothing
End Sub
 
Nếu mình muốn chỉnh sửa dữ liệu giữa 2 file A và B không cung 1 Folder thì sao?
Giả sử file A lưu ở Desktop, con file B lưu tại ổ D.
 
Nếu mình muốn chỉnh sửa dữ liệu giữa 2 file A và B không cung 1 Folder thì sao?
Giả sử file A lưu ở Desktop, con file B lưu tại ổ D.
Vẫn có thể được bạn à, chỉ chỉnh lại chuổi kết nối dữ liệu chút xíu là được.
 
[GPECODE=sql]
Sub Some_function_ADO_test()
'Declare some various connection objects
Dim cnn1 As New ADODB.Connection
Dim cnn2 As ADODB.Connection
Dim cnn3 As ADODB.Connection
Dim cnn4 As ADODB.Connection
Dim rcSet As New Recordset
Dim sqlStr As String
Dim DataSource1, DataSource2 As String
DataSource1 = "C:\Users\Nhat\Desktop\"
DataSource2 = "D:\Data\"
'Open a connection using a Data Source Name (DSN).
Set cnn1 = New ADODB.Connection
Set rcSet = New ADODB.Recordset

cnn1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & DataSource1 & "\IpAddress.xls" & _
";Extended Properties=""Excel 8.0;HDR=Yes;"";"
cnn1.ConnectionTimeout = 30
cnn1.Open

'Set SQL string command in copy from Workbook A to Workbook b
sqlStr = "INSERT INTO [Sheet2$] IN '" & DataSource & _
"\Book1.xls ' 'Excel 8.0;' SELECT f1,f2,f3,f4 FROM [Data$A1:D15]"



cnn1.Execute (sqlStr)
Set rcSet = Nothing
cnn1.Close
Set cnn1 = Nothing


End Sub[/GPECODE]
Mình đã chỉnh sửa theo như mình hiểu và mình đảm bảo là thong tin về đường dẫn cũng như thông tin các sheet trên các workbooks đều tồn tại, tuy nhiên khi chạy mình lại nhận được lỗi như hình dưới đây. Mong bạn chỉ giáo !


Error_8004e10.jpg
 
Chỉnh sửa lần cuối bởi điều hành viên:
[GPECODE]
Sub Some_function_ADO_test()
'Declare some various connection objects
Dim cnn1 As New ADODB.Connection
Dim cnn2 As ADODB.Connection
Dim cnn3 As ADODB.Connection
Dim cnn4 As ADODB.Connection
Dim rcSet As New Recordset
Dim sqlStr As String
Dim DataSource1, DataSource2 As String
DataSource1 = "C:\Users\Nhat\Desktop\"
DataSource2 = "D:\Data\"
'Open a connection using a Data Source Name (DSN).
Set cnn1 = New ADODB.Connection
Set rcSet = New ADODB.Recordset

cnn1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & DataSource1 & "\IpAddress.xls" & _
";Extended Properties=""Excel 8.0;HDR=Yes;"";"
cnn1.ConnectionTimeout = 30
cnn1.Open

'Set SQL string command in copy from Workbook A to Workbook b
sqlStr = "INSERT INTO [Sheet2$] IN '" & DataSource & _
"\Book1.xls ' 'Excel 8.0;' SELECT f1,f2,f3,f4 FROM [Data$A1:D15]"



cnn1.Execute (sqlStr)
Set rcSet = Nothing
cnn1.Close
Set cnn1 = Nothing


End Sub
[/GPECODE]
Mình đã chỉnh sửa theo như mình hiểu và mình đảm bảo là thong tin về đường dẫn cũng như thông tin các sheet trên các workbooks đều tồn tại, tuy nhiên khi chạy mình lại nhận được lỗi như hình dưới đây. Mong bạn chỉ giáo !

Bạn đưa 2 file đó lên xem cấu trúc thế nào nhé, mà nhìn code bạn viết thấy nó không ổn đã HDR=Yes thì sao bên dưới lại ghi F1,F2,F3...? Tôi chưa kể khai báo kết nối nhiều???
 
Book 1 là 1 wb rỗng có 3 sheet là “Sheet1”, “Sheet2”,”Sheet3” mình để ngay desktop nhằm mục đích test thôi nên có lẽ không cần đưa lên. IpAddress có 1 sheet là “Data”.
Mình khai báo kết nối nhiều căn bản là vì mình muốn phục vụ bài tập lớn hơn, nhân tiện đây cũng xin ý kiến các bạn luôn. Mình có 1 server có địa chỉ IP, UserName và Password. Mình muốn sau khi xử lý dữ liệu excel xong, sẽ gửi các thông tin cần thiết lên 1 file excel có mẫu sẵn trên server. Liệu có thể dung ADODB được không?
Cảm ơn cac bạn nhiều !
 

File đính kèm

Book 1 là 1 wb rỗng có 3 sheet là “Sheet1”, “Sheet2”,”Sheet3” mình để ngay desktop nhằm mục đích test thôi nên có lẽ không cần đưa lên. IpAddress có 1 sheet là “Data”.
Mình khai báo kết nối nhiều căn bản là vì mình muốn phục vụ bài tập lớn hơn, nhân tiện đây cũng xin ý kiến các bạn luôn. Mình có 1 server có địa chỉ IP, UserName và Password. Mình muốn sau khi xử lý dữ liệu excel xong, sẽ gửi các thông tin cần thiết lên 1 file excel có mẫu sẵn trên server. Liệu có thể dung ADODB được không?
Cảm ơn cac bạn nhiều !

Tôi không hiểu bạn muốn đưa cái gì vào file mà bạn để ở Desktop? Dữ liệu như thế này mà bạn đòi làm bàng ADO sao?
 
Tôi không hiểu bạn muốn đưa cái gì vào file mà bạn để ở Desktop? Dữ liệu như thế này mà bạn đòi làm bàng ADO sao?

Thật ra mình muốn test xem ADO hoạt động như thế nào thôi. Mình đang có bài toán là gửi những thông tin cần thiết lên server nên mình tạo các file trên máy mình để test trước khi xem liệu có thể làm tương tự trên server ko, vì vậy dữ liệu có thể hơi linh tinh mong bạn thông cảm.
Mình cũng không hiểu ý bạn là dữ liệu như thế nào thì làm bằng ADODB?
 
Thật ra mình muốn test xem ADO hoạt động như thế nào thôi. Mình đang có bài toán là gửi những thông tin cần thiết lên server nên mình tạo các file trên máy mình để test trước khi xem liệu có thể làm tương tự trên server ko, vì vậy dữ liệu có thể hơi linh tinh mong bạn thông cảm.
Mình cũng không hiểu ý bạn là dữ liệu như thế nào thì làm bằng ADODB?
Nếu bạn là người quản trị CSDL thì không cần phải hỏi tôi câu hỏi đó rồi. Còn nếu như chưa phải thì có thể từ từ nghiên cứu đi bạn.
 
Nếu bạn là người quản trị CSDL thì không cần phải hỏi tôi câu hỏi đó rồi. Còn nếu như chưa phải thì có thể từ từ nghiên cứu đi bạn.
Mình chưa từng quản trị dữ liệu nhưng mình nghĩ là làm được vì mình có đọc sách về ADO thấy họ truy cập và sửa dữ liệu trên SQL server với cấu trúc tương tự. Mình nghĩ tới việc là thử truy cập giữa các file excel khác nhau trên các thư mục khác nhau sau đó là truy cập file excel trên hai máy tính cùng mang LAN . Vấn đề quản trị dữ liệu mình sẽ tìm hiểu sau nhưng bài toán truy cập filex excel trên 2 thư mục khác nhau luôn gặp lỗi mà mình không nghĩ ra cách sửa. Nếu được bạn viết giúp mình code minh họa còn mình tự tìm hiểu các bài toán còn lại.
 

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

Back
Top Bottom