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
:D เราสามารถเขียน 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 ตรง

Code: Select all

For Each fld In rs.Fields(iCount)
ครับ
ขอบคุณครับ
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
:D 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
:D ลองวางที่ชีตใด ๆ ดูก่อนว่าเร็วขึ้นหรือไม่ครับ

ตัวอย่าง 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 :D ลองวางที่ชีตใด ๆ ดูก่อนว่าเร็วขึ้นหรือไม่ครับ

ตัวอย่าง 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 ดูครับ