Nhờ anh chụ giúp hiện tôi đang kết nối SQL Server lấy dữ liệu nhưng bị lỗi nên nhờ anh chị giúp

Liên hệ QC
Tham gia
30/7/06
Bài viết
409
Được thích
377
Nghề nghiệp
GTVT
Hiện tôi có 02 sheet sheet chưa mã học viện từ C3 đến C & dòng cuối. Tại sheet LocKhoaHoc lấy dữ liệu SQL dán vào cột A, B, C
Có code và file đính kèm
Sub ADOExcelSQLServer_HangGPLX_Dtao()
' Carl SQL Server Connection
'
' FOR THIS CODE TO WORK
' In VBE you need to go Tools References and check Microsoft Active X Data Objects 2.x library
'

Dim Cn As ADODB.Connection
Dim Server_Name As String
Dim Database_Name As String
Dim User_ID As String
Dim Password As String
Dim SQLStr As String
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Dim i As Long
Dim Lr As Long, j As Long
Dim Ma_hoc_vien As String
Dim Arr()
With Sheet2
Lr = .Range("C1000").End(xlUp).Row
Arr = .Range("C3:D" & Lr)
'where madk in('madk1','madk2',...... )
Ma_hoc_vien = "(Ma_hoc_vien ='" & Arr(1, 1) & "'"

For j = 1 To UBound(Arr) ' Da co arr(1,1) tren do vay j = 3
Ma_hoc_vien = Ma_hoc_vien & ",'" & Arr(j, 1) & "'"
Next
Ma_hoc_vien = Ma_hoc_vien & ")"

End With

Sheet10.Range("a5:I10000").Clear

Server_Name = "113.161.13.207,1708" ' Enter your server name here
Database_Name = "gplx_sogtvt" ' Enter your database name here
User_ID = "gplx" ' enter your user ID here
Password = "gplx123!@#" ' Enter your password here
SQLStr = "SELECT MADK, HO_VA_TEN, HangDaoTao FROM [GPLX_SoGTVT].[dbo].[NguoiLX_HoSo] where IN Ma_hoc_vien" ' Enter your SQL here


Set Cn = New ADODB.Connection
Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & _
";Uid=" & User_ID & ";Pwd=" & Password & ";"


rs.Open SQLStr, Cn, adOpenStatic
' Dump to spreadsheet
With Worksheets("HangDTao") ' Enter your sheet name and range here
.Range("A4").CurrentRegion.ClearContents
For i = 0 To rs.Fields.Count - 1
.Cells(3, i + 1).Value = rs.Fields(i).Name
Next
.Range("A4").CopyFromRecordset rs
.Columns.AutoFit
End With


' Tidy up
rs.Close
Set rs = Nothing
Cn.Close
Set Cn = Nothing
End Sub

Nhờ anh chị cùng các bạn trên diên đàn giúp
 

File đính kèm

  • Data_Ketnoi.xlsb
    316.4 KB · Đọc: 5
Lần chỉnh sửa cuối:
Bạn kiểm tra xem có mở Port chưa nhé. Mở port router và firewall luôn.
 
Hiện vận kết nối bình thường
Bạn bị sai câu lệnh SQL.
Sửa lại như bên dưới là chạy ngon lành.

Mã:
Arr = .Range("C3:D" & Lr)
    For j = 1 To UBound(Arr) ' Da co arr(1,1) tren do vay j = 3
        Ma_hoc_vien = Ma_hoc_vien & ",'" & Arr(j, 1) & "'"
    Next
        Ma_hoc_vien = Mid(Ma_hoc_vien, 2)

Mã:
SQLStr = "SELECT MADK, HangDaoTao FROM [GPLX_SoGTVT].[dbo].[NguoiLX_HoSo] where MADK IN (" & Ma_hoc_vien & ")"

Screen Shot 2024-06-24 at 23.56.12.png
 
Bạn bị sai câu lệnh SQL.
Sửa lại như bên dưới là chạy ngon lành.

Mã:
Arr = .Range("C3:D" & Lr)
    For j = 1 To UBound(Arr) ' Da co arr(1,1) tren do vay j = 3
        Ma_hoc_vien = Ma_hoc_vien & ",'" & Arr(j, 1) & "'"
    Next
        Ma_hoc_vien = Mid(Ma_hoc_vien, 2)

Mã:
SQLStr = "SELECT MADK, HangDaoTao FROM [GPLX_SoGTVT].[dbo].[NguoiLX_HoSo] where MADK IN (" & Ma_hoc_vien & ")"

View attachment 301945
Cám ơn bạn rất nhiều file đã chạy
 
Tiếp tục hỏi kết nối dữ liệu File trên
Tại Cột J3 của Sheet LocKhoaHoc tôi cần thay hàm Vlookup bằng ADO như sau nhưng bị lỗi tiếp tục nhờ anh chị cùng các bạn giúp
Option Explicit
Sub ADO_Ghep_Sheet()
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.FullName & _
";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1"";"

.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "select [HangDTao$].HangDaoTao from [HangDTao$] INNER JOIN [LocKhoaHoc$] on [LocKhoaHoc$].MADK = [HangDTao$].MADK"
End With
With Sheet2
.[J3:J1000].ClearContents
.[J3].CopyFromRecordset adoRS
End With
adoRS.Close: Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing


End Sub
 

File đính kèm

  • Data_Ketnoi.xlsb
    317.7 KB · Đọc: 6
Nên cho vào trong thẻ code cho gọn.
Mã:
Sub ADO_Ghep_Sheet()
        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.FullName & _
             ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1"";"
            .Open
        End With
        With adoRS
            .ActiveConnection = adoConn
            .Open "select [HangDTao$].HangDaoTao from [HangDTao$] INNER JOIN [LocKhoaHoc$] on [LocKhoaHoc$].MADK = [HangDTao$].MADK"
        End With
        With Sheet2
            .[J3:J1000].ClearContents
            .[J3].CopyFromRecordset adoRS
        End With
        adoRS.Close: Set adoRS = Nothing
        adoConn.Close: Set adoConn = Nothing
End Sub
 
Tiếp tục hỏi kết nối dữ liệu File trên
Tại Cột J3 của Sheet LocKhoaHoc tôi cần thay hàm Vlookup bằng ADO như sau nhưng bị lỗi tiếp tục nhờ anh chị cùng các bạn giúp
Option Explicit
Sub ADO_Ghep_Sheet()
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.FullName & _
";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1"";"

.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "select [HangDTao$].HangDaoTao from [HangDTao$] INNER JOIN [LocKhoaHoc$] on [LocKhoaHoc$].MADK = [HangDTao$].MADK"
End With
With Sheet2
.[J3:J1000].ClearContents
.[J3].CopyFromRecordset adoRS
End With
adoRS.Close: Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing


End Sub
Sao bạn không lấy thẳng trên SQL server khi tải dữ liệu các lần trước luôn?
 
Hì mình đang học cách ADO nên thử từng cách
Cám ơn bạn đã quan tâm và giúp đỡ
:) làm theo cách của bạn, nếu lấy được dữ liệu thì khi đổ xuống sheet cũng sẽ bị sai vì bạn lấy gì đảm bảo cái ADO recordset nó cũng sắp xếp thứ tự MaDK như Mã_HV của sheet LocKhoaHoc?
Do đó tốt nhất là lấy hết dữ liệu đó 1 lần từ SQL Server. Bạn lấy dữ liệu từ SQL SV là cũng dùng thư viện ADODB rồi đó.
 
:) làm theo cách của bạn, nếu lấy được dữ liệu thì khi đổ xuống sheet cũng sẽ bị sai vì bạn lấy gì đảm bảo cái ADO recordset nó cũng sắp xếp thứ tự MaDK như Mã_HV của sheet LocKhoaHoc?
Do đó tốt nhất là lấy hết dữ liệu đó 1 lần từ SQL Server. Bạn lấy dữ liệu từ SQL SV là cũng dùng thư viện ADODB rồi đó.
Cám ơn bạn rất nhiều
 
Hì mình đang học cách ADO nên thử từng cách
Cám ơn bạn đã quan tâm và giúp đỡ
Bạn dùng câu lệnh SQL bêb dưới để lấy luôn các thông tin khóa học, họ tên, hạng đào tạo... khỏi Vlookup.
Các thông tin còn lại như: giờ đêm, số giờ tự động v.v.. bạn lấy từ Table nào?

JavaScript:
SELECT Top (1000) dbo.NguoiLX_GPLX.MaDK, dbo.NguoiLX_GPLX.HoVaTen, dbo.KhoaHoc.TenKH, dbo.NguoiLX_HoSo.HangDaoTao, dbo.NguoiLX_HoSo.MaKhoaHoc
FROM  dbo.NguoiLX_GPLX INNER JOIN
         dbo.NguoiLX_HoSo ON dbo.NguoiLX_GPLX.MaDK = dbo.NguoiLX_HoSo.MaDK INNER JOIN
         dbo.KhoaHoc ON dbo.NguoiLX_HoSo.MaKhoaHoc = dbo.KhoaHoc.MaKH
 
Hiện tôi có 02 sheet sheet chưa mã học viện từ C3 đến C & dòng cuối. Tại sheet LocKhoaHoc lấy dữ liệu SQL dán vào cột A, B, C
Có code và file đính kèm
Sub ADOExcelSQLServer_HangGPLX_Dtao()
' Carl SQL Server Connection
'
' FOR THIS CODE TO WORK
' In VBE you need to go Tools References and check Microsoft Active X Data Objects 2.x library
'

Dim Cn As ADODB.Connection
Dim Server_Name As String
Dim Database_Name As String
Dim User_ID As String
Dim Password As String
Dim SQLStr As String
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Dim i As Long
Dim Lr As Long, j As Long
Dim Ma_hoc_vien As String
Dim Arr()
With Sheet2
Lr = .Range("C1000").End(xlUp).Row
Arr = .Range("C3:D" & Lr)
'where madk in('madk1','madk2',...... )
Ma_hoc_vien = "(Ma_hoc_vien ='" & Arr(1, 1) & "'"

For j = 1 To UBound(Arr) ' Da co arr(1,1) tren do vay j = 3
Ma_hoc_vien = Ma_hoc_vien & ",'" & Arr(j, 1) & "'"
Next
Ma_hoc_vien = Ma_hoc_vien & ")"

End With

Sheet10.Range("a5:I10000").Clear

Server_Name = "113.161.13.207,1708" ' Enter your server name here
Database_Name = "gplx_sogtvt" ' Enter your database name here
User_ID = "gplx" ' enter your user ID here
Password = "gplx123!@#" ' Enter your password here
SQLStr = "SELECT MADK, HO_VA_TEN, HangDaoTao FROM [GPLX_SoGTVT].[dbo].[NguoiLX_HoSo] where IN Ma_hoc_vien" ' Enter your SQL here


Set Cn = New ADODB.Connection
Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & _
";Uid=" & User_ID & ";Pwd=" & Password & ";"


rs.Open SQLStr, Cn, adOpenStatic
' Dump to spreadsheet
With Worksheets("HangDTao") ' Enter your sheet name and range here
.Range("A4").CurrentRegion.ClearContents
For i = 0 To rs.Fields.Count - 1
.Cells(3, i + 1).Value = rs.Fields(i).Name
Next
.Range("A4").CopyFromRecordset rs
.Columns.AutoFit
End With


' Tidy up
rs.Close
Set rs = Nothing
Cn.Close
Set Cn = Nothing
End Sub

Nhờ anh chị cùng các bạn trên diên đàn giúp
Vãi thế ... Tôi mới thử thấy OK ... Tôi sử dụng FireDAC trên Delphi không sử dụng ADODB của Ms ... có gì liên quan cứ nói ( Mô tả chi tiết ) nếu được Tôi xuất cho vài Hàm API xong chỉ dùng ... cái AddIns này có sẳn trên GPE tìm là thấy

1719383373307.png
 
Bạn dùng câu lệnh SQL bêb dưới để lấy luôn các thông tin khóa học, họ tên, hạng đào tạo... khỏi Vlookup.
Các thông tin còn lại như: giờ đêm, số giờ tự động v.v.. bạn lấy từ Table nào?

JavaScript:
SELECT Top (1000) dbo.NguoiLX_GPLX.MaDK, dbo.NguoiLX_GPLX.HoVaTen, dbo.KhoaHoc.TenKH, dbo.NguoiLX_HoSo.HangDaoTao, dbo.NguoiLX_HoSo.MaKhoaHoc
FROM  dbo.NguoiLX_GPLX INNER JOIN
         dbo.NguoiLX_HoSo ON dbo.NguoiLX_GPLX.MaDK = dbo.NguoiLX_HoSo.MaDK INNER JOIN
         dbo.KhoaHoc ON dbo.NguoiLX_HoSo.MaKhoaHoc = dbo.KhoaHoc.MaKH
Cám ơn bạn đã gợi ý
 
Web KT

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

Back
Top Bottom