Page 1 of 1
สอบถามเรื่องการ connect sql ด้วย vba ครับ
Posted: Thu Nov 22, 2018 2:27 pm
by boongum
ผมเขียน vba connect กับ sql ครับ ซึ่งทำได้แล้ว แต่ติดปัญหาคือ
Column ที่จะให้โชว์ข้อมูลไม่ได้อยู่ติดกันทั้งหมดครับ ตอนนี้ผมใช้วิธี เขียนดึงข้อมูลตามจำนวนช่อง เช่น อันแรกช่อง A - E อันกที่ 2 E -G แบบนี้ก็ทำการดึง 2 รอบครับ
ถ้ามีข้อมูลเยอะๆ ทำให้ดึงข้อมูลช้ามากๆ ไม่ทราบว่าพอจะมีวิธีที่ดึงข้อมูลคั้งเดียว แล้วให้ไปออกตามช่องที่ต้องการไหมครับ
Code: Select all
Function DataIB()
Dim rs As ADODB.Recordset
Dim Connected As Boolean
Dim sql As String
Dim tName As String
Connected = ConnectToDB("10.10.0.0", "Data", "user", "")
tName = "Data"
If Connected Then
sql = "SELECT WR_CarID,WR_ID,WR_Date "
sql = sql & "FROM V_PlanSVOut "
'sql = sql & "Order By WR_ID ASC"
Set rs = New ADODB.Recordset
rs.Open sql, Conn
Sheets(tName).Cells(5, 1).CopyFromRecordset rs
rs.Close
'´Ö§ª×èͺÃÔÉÑ· 䫵ì§Ò¹
sql = "SELECT CustomerName,SiteName "
sql = sql & "FROM V_PlanSVOut "
'sql = sql & "Order By WR_ID ASC"
Set rs = New ADODB.Recordset
rs.Open sql, Conn
Sheets(tName).Cells(5, 5).CopyFromRecordset rs
rs.Close
Conn.Close
Set Conn = Nothing
Set rs = Nothing
DataIB = True
Else
DataIB = False
End If
End Function
ขอบคุณครับ
Re: สอบถามเรื่องการ connect sql ด้วย vba ครับ
Posted: Thu Nov 22, 2018 8:36 pm
by snasui
เราสามารถเขียน Statement ของ SQL เป็น
SELECT WR_CarID,WR_ID,WR_Date,CustomerName,SiteName
เพื่อให้ดึงมาทีเดียว กรณีต้องการวางคอลัมน์ไม่ติดกันสามารถใช้การ Loop เข้ามาช่วยครับ
ตัวอย่างเช่นการ Loop ด้านล่าง สามารถประยุกต์ให้วางตรงไหน อย่างไรก็ได้ครับ
Code: Select all
rs.MoveFirst
iCount = 1: rws = 2: col = 0
Do While rs.EOF = False
With wb.Sheets(1)
For Each fld In rs.Fields(iCount)
.Range("a" & rws).Offset(0, col).Value = fld
col = col + 1
Next fld
iCount = iCount + 1
rs.MoveNext
End With
Loop
rs.Close
Re: สอบถามเรื่องการ connect sql ด้วย vba ครับ
Posted: Fri Nov 23, 2018 11:17 am
by boongum
ผมลองทำแล้ว แต่ยังไม่เข้าใจ พอรันแล้ว ขึ้น error รูปครับ error ตรง
ครับ
ขอบคุณครับ
Image 1.jpg
Code: Select all
Function DataIB()
Dim rs As ADODB.Recordset
Dim Connected As Boolean
Dim sql As String
Dim tName As String
Dim iCount, Rws, Col As Integer
Dim fld As Range
Connected = ConnectToDB("Server", "Data", "user", "")
tName = "Data"
If Connected Then
sql = "SELECT top 10 * "
sql = sql & "FROM V_PlanSVOut "
Set rs = New ADODB.Recordset
rs.Open sql, Conn
rs.MoveFirst
iCount = 1: Rws = 5: Col = 0
Do While rs.EOF = False
With Sheets(tName)
[b]For Each fld In rs.Fields(iCount)[/b]
.Range("a" & Rws).Offset(0, Col).Value = fld
Col = Col + 1
Next fld
iCount = iCount + 1
rs.MoveNext
End With
Loop
rs.Close
Conn.Close
Set Conn = Nothing
Set rs = Nothing
DataIB = True
Else
DataIB = False
End If
End Function
Re: สอบถามเรื่องการ connect sql ด้วย vba ครับ
Posted: Fri Nov 23, 2018 9:19 pm
by snasui
Code นั้นคือตัวอย่างเท่านั้น กรณีประกาศเป็น Option Explicit จะต้องประกาศตัวแปรทุกตัว นอกจากนั้นจะต้องประกาศตัวแปร Field เพิ่มด้วย ฯลฯ
ควรแนบไฟล์ประกอบคำถามจะได้สะดวกกับการตอบของเพื่อนสมาชิกครับ
Re: สอบถามเรื่องการ connect sql ด้วย vba ครับ
Posted: Tue Nov 27, 2018 4:42 pm
by boongum
ตอนนี้ผมดึงข้อมูลได้แล้วครับ แต่ติดปัญหาการดึงข้อมูลยังช้าอยู่ครับ
ไม่ทราบว่ามันสามารถทำให้เร็วกว่านี้ได้ไหมครับ
อันเป็นโค้ดที่ผมใช้ครับ
Code: Select all
Do While rs.EOF = False
Sheets(tName).Cells(i + 5, 1).Value = rs.Fields("CarID")
Sheets(tName).Cells(i + 5, 2).Value = rs.Fields("ID")
rs.MoveNext
i = i + 1
Loop
Book12.xlsm
Re: สอบถามเรื่องการ connect sql ด้วย vba ครับ
Posted: Tue Nov 27, 2018 10:43 pm
by snasui
ลองวางที่ชีตใด ๆ ดูก่อนว่าเร็วขึ้นหรือไม่ครับ
ตัวอย่าง Code การวางทั้ง Recordset ลงในเซลล์
Code: Select all
'Other code
Set rs = New ADODB.Recordset
rs.Open sql, Conn
Sheets("x").Range("a2").CopyFromRecordset rs
'Other code
Sheets("x") คือชีตใด ๆ ให้เปลี่ยนเป็นชีตที่ใช้จริงครับ
Re: สอบถามเรื่องการ connect sql ด้วย vba ครับ
Posted: Wed Nov 28, 2018 9:33 am
by boongum
ถ้าใช้อันนี้เร็วครับ ตอนแรกผมก็ใช้โค้ดนี้ครับ แต่ติดตรงที่ว่า ข้อมูลที่วางลงในเซลล์ มันอยู่ไม่ต่อเนื่องกันครับ มีเว้น A1:E1 แล้วข้ามไป G1:F1 ประมาณนี้ครับ และข้อมูลมีหมื่น ถึง สีหมื่น แถว เลยต้องหาโค้ดใหม่ เพื่อมาช่วยให้เร็วขึ้นครับ
ขอบคุณครับ
snasui wrote: Tue Nov 27, 2018 10:43 pm
ลองวางที่ชีตใด ๆ ดูก่อนว่าเร็วขึ้นหรือไม่ครับ
ตัวอย่าง Code การวางทั้ง Recordset ลงในเซลล์
Code: Select all
'Other code
Set rs = New ADODB.Recordset
rs.Open sql, Conn
Sheets("x").Range("a2").CopyFromRecordset rs
'Other code
Sheets("x") คือชีตใด ๆ ให้เปลี่ยนเป็นชีตที่ใช้จริงครับ
Re: สอบถามเรื่องการ connect sql ด้วย vba ครับ
Posted: Wed Nov 28, 2018 10:50 am
by astalavista
ลองเพิ่ม
Code: Select all
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
ไว้ส่วนบนของ function
และ
Code: Select all
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
ไว้ตอนก่อนออกจาก function ดูครับ
Re: สอบถามเรื่องการ connect sql ด้วย vba ครับ
Posted: Wed Nov 28, 2018 11:18 am
by boongum
ได้แล้วครับ ขอบคุณมากๆๆ ครับ
astalavista wrote: Wed Nov 28, 2018 10:50 am
ลองเพิ่ม
Code: Select all
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
ไว้ส่วนบนของ function
และ
Code: Select all
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
ไว้ตอนก่อนออกจาก function ดูครับ