Page 3 of 4

Re: ค้นหาข้อมูลจากอีก Sheet

Posted: Tue Dec 06, 2022 7:06 pm
by snasui
:D รายการก่อนหน้าและถัดไปต้องใช้รายการปัจจุบันเข้าไปค้น เมื่อทราบรายการปัจจุบันแล้วจึงจะหารายการก่อนหน้าหรือรายการถัดไปได้

ไม่ทราบว่าดูรายการปัจจุบันจากค่าใดกรุณาอธิบายพร้อมทั้งอธิบายว่าหากทราบค่านั้นแล้วจะดูรายการก่อนหน้าด้วยวิธีใด ดูรายการถัดไปด้วยวิธีใดครับ หากเป็นลำดับที่จะหามาได้ง่ายมากครับ

Re: ค้นหาข้อมูลจากอีก Sheet

Posted: Wed Dec 07, 2022 7:18 am
by wisitsakbenz
เรียน อาจารย์ snasui

ดูรายการปัจจุบันจาก ---> "ลำดับ" ครับ
เมื่อได้ค่าแล้วให้แสดงใน ช่องต่าง ๆ ในหน้า input ครับ (ผมเข้าใจถูกหรือไม่ครับอาจารย์)
ขอบคุณครับ

Re: ค้นหาข้อมูลจากอีก Sheet

Posted: Wed Dec 07, 2022 9:51 am
by snasui
:D Field ไหนคือลำดับ เขียนใน SQL Statement สำหรับการดึงลำดับที่ว่านั้นไว้อย่างไรครับ :?:

Re: ค้นหาข้อมูลจากอีก Sheet

Posted: Wed Dec 07, 2022 10:14 am
by wisitsakbenz
เรียน อาจารย์ snasui

ถ้าไม่มี Field "ลำดับ" สามารถเพิ่มไปในข้อมูลได้ใช่หรือไม่ครับ
หรือสามารถดึงจาก Row สุดท้ายได้หรือไม่ครับ ขอบคุณครับ

Re: ค้นหาข้อมูลจากอีก Sheet

Posted: Wed Dec 07, 2022 10:25 am
by snasui
:D หากเราออกแบบเองจะเพิ่มอะไรเข้าไปหรือลบอะไรออกไปก็แล้วแต่ต้องการอันนี้เป็นเรื่องพื้นฐานครับ

การดึงจากรายการสุดท้ายก็ต้องบอกว่าโปรแกรมว่าดึงโดยหลักการใด เช่นที่ผ่านมาคือดึงโดยการเรียงคอลัมน์ (Field) ใด ๆ จากมากไปน้อยแล้วเอารายการแรกมาแสดง แต่หาก Field นั้นไม่สามารถเรียงแล้วตรงกับที่ต้องการได้ก็ย่อมไม่ได้รายการสุดท้ายที่แท้จริงครับ

Re: ค้นหาข้อมูลจากอีก Sheet

Posted: Wed Dec 07, 2022 10:44 am
by wisitsakbenz
เรียน อาจารย์ snasui

ไม่เช่นนั้นสามารถดึงข้อมูลจาก "RefNo" ได้ เพราะมันสามารถเรียงข้อมูลจากมากไปน้อยได้
SQL Statement สำหรับการดึงลำดับ

Code: Select all

'Other code...
    sFile = "\\10.21.4.97\File Sharing2\DataPricing\All Data Estimated.xlsx"
    shtName = "[Data$]"
        sql = "select * from " & shtName & " Order By [RefNo] DESC"
        sCnstr.CursorLocation = adUseClient
        sCnstr.Open "Provider=Microsoft.ACE.OLEDB.12.0;" _
    & "Data Source=" & sFile & ";" _
    & "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
        rs.Open sql, sCnstr
 'Other code...
แบบนี้ได้หรือไม่ครับ อาจารย์ หรือต้องปรับในส่วนใดครับ ขอบคุณครับ

Re: ค้นหาข้อมูลจากอีก Sheet

Posted: Wed Dec 07, 2022 11:59 am
by snasui
:D หากต้องการจะหาจาก RefNo ก็ต้องทราบว่าต้องการอ้างอิงจาก RefNo ใด เบอร์ก่อนหน้าคือคือค่าใด เบอร์ถัดไปคือค่าใด

เช่นหากจากเบอร์ xxx8 เบอร์ก่อนหน้าคือ xxx7 เบอร์ ถัดไปคือ xxx9 สามารถปรับ SQL เป็น

sql = "select * from " & shtName & "Where RefNo IN ('xxx7','xxx8','xxx9') Order By [RefNo] ASC" เช่นนี้เป็นต้น

เนื่องจากเป็นการหาแบบเรียงลำดับ จึงต้อง Order By แบบเรียงจากน้อยไปหามากครับ

หากต้องการหา 3 รายการสุดท้ายสามารถปรับได้เป็น

sql = "select top 3 * from " & shtName & " Order By [RefNo] DESC"

จะต้องศึกษาเกี่ยวกับ SQL Statement เพิ่มเติมในการทำงานลักษณะนี้ครับ

Re: ค้นหาข้อมูลจากอีก Sheet

Posted: Wed Dec 07, 2022 2:07 pm
by wisitsakbenz
เรียน อาจารย์ Snasui
หากต้องการหา 3 รายการสุดท้ายสามารถปรับได้เป็น

sql = "select top 3 * from " & shtName & " Order By [RefNo] DESC"

จะต้องศึกษาเกี่ยวกับ SQL Statement เพิ่มเติมในการทำงานลักษณะนี้ครับ
ผมจะศึกษา SQL ให้มากกว่านี้ครับ ขอบคุณอาจารย์มากครับ

ผมลองเขียน Code ตามคำแนะนำอาจารย์แล้ว แต่ยัง error อยู่
ต้องปรับ Code อย่างไรครับ ขอบคุณครับ

Code: Select all

Sub DataReview(ByVal GoToRow As Integer)

    Dim sFile As String, sh As Worksheet
    Dim sCnstr As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim sql As String, shtName As String
    Dim arr() As Variant, i As Integer, j As Integer, k As Integer
    Dim strS As String
    
    sFile = "\\10.21.4.97\File Sharing2\DataPricing\All Data Estimated.xlsx"
    shtName = "[Data$]"
        sql = sql = "select top 3 * from " & shtName & " Order By [RefNo] DESC"
        sCnstr.CursorLocation = adUseClient
        sCnstr.Open "Provider=Microsoft.ACE.OLEDB.12.0;" _
    & "Data Source=" & sFile & ";" _
    & "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
        rs.Open sql, sCnstr
    
With Sheets("input")
    .Range("InputRefNo") = rs.Fields(GoToRow, 0).Value
    .Range("InputName") = rs.Fields(GoToRow, 5).Value
    .Range("InputHN").Value = rs.Fields(GoToRow, 6).Value
    .Range("C12").Value = rs.Fields(GoToRow, 7).Value
     .Range("InputPayer").Value = rs.Fields(GoToRow, 8).Value
     .Range("InputEstimateDateTime").Value = rs.Fields(GoToRow, 94).Value
End With
        Set sCnstr = Nothing
End Sub

Sub PreviousData()

Dim GoToRow As Integer
    Dim sFile As String, sh As Worksheet
    Dim sCnstr As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim sql As String, shtName As String
    Dim arr() As Variant, i As Integer, j As Integer, k As Integer
    Dim strS As String
    
    sFile = "\\10.21.4.97\File Sharing2\DataPricing\All Data Estimated.xlsx"
    shtName = "[Data$]"
        sql = "select top 3 * from " & shtName & " Order By [RefNo] DESC"
        sCnstr.CursorLocation = adUseClient
        sCnstr.Open "Provider=Microsoft.ACE.OLEDB.12.0;" _
    & "Data Source=" & sFile & ";" _
    & "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
        rs.Open sql, sCnstr


If Worksheets("Input").Range("InputRow") = "" Then
    GoToRow = rs.Fields
Else
    GoToRow = rs.Fields.Range("InputRow").Value - 1

End If

Worksheets("Input").Range("InputRow").Value = GoToRow
DataReview (GoToRow)

End Sub

Re: ค้นหาข้อมูลจากอีก Sheet

Posted: Wed Dec 07, 2022 3:09 pm
by snasui
:D จาก Code sql = sql = "select top 3 * from " & shtName & " Order By [RefNo] DESC" ให้ลบ sql = ออกไป 1 ชุดครับ

Error บรรทัดไหนใน Code ครับ :?:

Re: ค้นหาข้อมูลจากอีก Sheet

Posted: Wed Dec 07, 2022 3:15 pm
by wisitsakbenz
เรียน อาจารย์ snasui

ลบออกแล้วครับ
error ดังภาพครับ ขอบคุณครับ

Re: ค้นหาข้อมูลจากอีก Sheet

Posted: Wed Dec 07, 2022 3:19 pm
by snasui
:D ค่านั้นต้องบอกว่าด้วย Field ที่เท่าไร เช่น Fields(0) แปลว่า Field ที่ 1 เป็นต้น หากไม่บอกค่าลำดับมันจะ Error ครับ

Re: ค้นหาข้อมูลจากอีก Sheet

Posted: Wed Dec 07, 2022 3:50 pm
by wisitsakbenz
เรียน อาจารย์ snasui

แก้ไขแล้วครับ
error ดังภาพครับ ขอบคุณครับ

Code: Select all

    sFile = "\\10.21.4.97\File Sharing2\DataPricing\All Data Estimated.xlsx"
    shtName = "[Data$]"
        sql = "select top 3 * from " & shtName & " Order By [RefNo] DESC"
        sCnstr.CursorLocation = adUseClient
        sCnstr.Open "Provider=Microsoft.ACE.OLEDB.12.0;" _
    & "Data Source=" & sFile & ";" _
    & "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
        rs.Open sql, sCnstr

If Worksheets("Input").Range("InputRow") = "" Then
    GoToRow = rs.Fields(0)
Else
    GoToRow = rs.Fields.Range("InputRow").Value - 1

End If

Re: ค้นหาข้อมูลจากอีก Sheet

Posted: Wed Dec 07, 2022 4:11 pm
by snasui
:D กรุณาทำความเข้าใจโพสต์ที่ผมตอบไปด้านบนหรือตามโพสต์ก่อนหน้าที่ตอบไปแล้ว สังเกตว่ามีการใช้ Fields ลักษณะใดครับ

Re: ค้นหาข้อมูลจากอีก Sheet

Posted: Thu Dec 08, 2022 9:02 am
by wisitsakbenz
เรียน อาจารย์ snasui

ผมลองเอา Else ออก > error ดังภาพครับอาจารย์
รบกวนขอคำแนะนำจากอาจารย์ด้วยครับ ขอบคุณครับ

Code: Select all

If Worksheets("Input").Range("InputRow") = "" Then
    GoToRow = rs.Fields(0)
End If

Re: ค้นหาข้อมูลจากอีก Sheet

Posted: Thu Dec 08, 2022 9:26 am
by snasui
:D GoToRow ประกาศตัวแปรเป็น Integer ดังนั้น Data Type ของ rs.Fields(0) ก็ต้องเป็นเป็น Integer เช่นเดียวกัน ไม่เช่นนั้นก็จะ Error

ประกาศตัวแปรให้มี Data Type เป็นแบบใด เมื่อ Assign ค่าให้กับตัวแปรนั้นจะต้องเป็น Data Type เดียวกันเสมอครับ

Re: ค้นหาข้อมูลจากอีก Sheet

Posted: Thu Dec 08, 2022 10:47 am
by wisitsakbenz
เรียน อาจารย์ snasui

ปรับ Code เป็น Dim GoToRow As String แล้ว
แต่ GoToRow จะต้องแสดงเป็น integer (Row ที่ข้อมูลจะแสดง ดังภาพ)
เช่น SQL จะเลือกข้อมูล top3 จาก database
เมื่อคลิก previous >> GoToRow = 11
ในส่วนของ input ตรง "InputRow" จะแสดงเลข 11 เช่นกัน
ต้องปรับ Code ในส่วนนี้อย่างไรครับ ขอคำแนะนำอาจารย์ด้วยครับ ขอบคุณครับ

Code: Select all

Dim GoToRow As String
    Dim sFile As String, sh As Worksheet
    Dim sCnstr As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim sql As String, shtName As String
    Dim arr() As Variant, i As Integer, j As Integer, k As Integer
    Dim strS As String
    
    sFile = "\\10.21.4.97\File Sharing2\DataPricing\All Data Estimated.xlsx"
    shtName = "[Data$]"
        sql = "select top 3 * from " & shtName & " Order By [RefNo] DESC"
        sCnstr.CursorLocation = adUseClient
        sCnstr.Open "Provider=Microsoft.ACE.OLEDB.12.0;" _
    & "Data Source=" & sFile & ";" _
    & "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
        rs.Open sql, sCnstr

If Worksheets("Input").Range("InputRow") = "" Then
    GoToRow = rs.Fields(0)

End If        
Worksheets("Input").Range("InputRow").Value = GoToRow
DataReview (GoToRow)

Re: ค้นหาข้อมูลจากอีก Sheet

Posted: Thu Dec 08, 2022 6:39 pm
by snasui
wisitsakbenz wrote: Thu Dec 08, 2022 10:47 am GoToRow จะต้องแสดงเป็น integer
:D จาก Code ที่เขียนมา GoToRow จะเป็น Integer ไม่ได้ เพราะถูกกำหนดให้รับค่ามาจาก rs.Fields(0) ซึ่ง rs.Fields(0) คือค่าในคอลัมน์ A ซึ่งเป็น Text หากต้องการหาเลขลำดับต้องใช้ Statement อื่นไม่ใช่นำ rs.Fields(0) มาใช้ครับ

Re: ค้นหาข้อมูลจากอีก Sheet

Posted: Fri Dec 09, 2022 8:46 am
by wisitsakbenz
เรียน อาจารย์ snasui

ผมแก้ไข Database ให้มี ลำดับเข้ามา
และลองแก้ไข Code เมื่อคลิก Previous ครั้งแรกได้ แต่คลิกอีกครั้งเป็น 0 (ดัง Video)
อยากให้เป็นลำดับถัดไปจาก 11 คือ 10 ,9,8,... ไปเรื่อยๆ
ต้องปรับ Code อย่างไรครับ ขอบคุณครับ

Code: Select all

Sub DataReview(ByVal GoToRow As Integer)

    Dim sFile As String, sh As Worksheet
    Dim sCnstr As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim sql As String, shtName As String
    Dim arr() As Variant, i As Integer, j As Integer, k As Integer
    Dim strS As String
    
    sFile = "\\10.21.4.97\File Sharing2\DataPricing\All Data Estimated.xlsx"
    shtName = "[Data$]"
        sql = "select top 3 * from " & shtName & " Order By [RefNo] DESC"
        sCnstr.CursorLocation = adUseClient
        sCnstr.Open "Provider=Microsoft.ACE.OLEDB.12.0;" _
    & "Data Source=" & sFile & ";" _
    & "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
        rs.Open sql, sCnstr
    
With Sheets("input")
    .Range("InputRefNo") = rs.Fields(1)
    .Range("InputName") = rs.Fields(6)
    .Range("InputHN").Value = rs.Fields(7)
    .Range("C12").Value = rs.Fields(8)
     .Range("InputPayer").Value = rs.Fields(9)
     .Range("InputEstimateDateTime").Value = rs.Fields(95)
End With
        Set sCnstr = Nothing
End Sub

Sub PreviousData()

Dim GoToRow As Integer
    Dim sFile As String, sh As Worksheet
    Dim sCnstr As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim sql As String, shtName As String
    Dim arr() As Variant, i As Integer, j As Integer, k As Integer
    Dim strS As String
    
    sFile = "\\10.21.4.97\File Sharing2\DataPricing\All Data Estimated.xlsx"
    shtName = "[Data$]"
        sql = "select top 3 * from " & shtName & " Order By [RefNo] DESC"
        sCnstr.CursorLocation = adUseClient
        sCnstr.Open "Provider=Microsoft.ACE.OLEDB.12.0;" _
    & "Data Source=" & sFile & ";" _
    & "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
        rs.Open sql, sCnstr

If Worksheets("Input").Range("InputRow") = "" Then
    GoToRow = rs.Fields(0)
    
End If
        
Worksheets("Input").Range("InputRow").Value = GoToRow
DataReview (GoToRow)

End Sub

Re: ค้นหาข้อมูลจากอีก Sheet

Posted: Fri Dec 09, 2022 9:56 am
by snasui
:D ตัวอย่างการปรับ Code ครับ

Code: Select all

Sub DataReview(ByVal GoToRow As Integer)

    Dim sFile As String, sh As Worksheet
    Dim sCnstr As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim sql As String, shtName As String
    Dim arr() As Variant, i As Integer, j As Integer, k As Integer
    Dim strS As String
    
    sFile = "\\10.21.4.97\File Sharing2\DataPricing\All Data Estimated.xlsx"
    shtName = "[Data$]"
    sql = "select * from " & shtName & " where [No] = " & GoToRow
    sCnstr.CursorLocation = adUseClient
    sCnstr.Open "Provider=Microsoft.ACE.OLEDB.12.0;" _
        & "Data Source=" & sFile & ";" _
        & "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
    rs.Open sql, sCnstr
    
    With Sheets("input")
        .Range("InputRow").Value = rs.Fields(0)
        .Range("InputRefNo") = rs.Fields(1)
        .Range("InputName") = rs.Fields(6)
        .Range("InputHN").Value = rs.Fields(7)
        .Range("C12").Value = rs.Fields(8)
        .Range("InputPayer").Value = rs.Fields(9)
        .Range("InputEstimateDateTime").Value = rs.Fields(95)
    End With
    Set sCnstr = Nothing
End Sub

Sub PvLine()
    If Range("InputRow").Value = 1 Then Exit Sub
    Call DataReview(Range("InputRow").Value - 1)
End Sub

Sub NxLine()
    Call DataReview(Range("InputRow").Value + 1)
End Sub

Sub PreviousData()

    Dim GoToRow As Integer
    Dim sFile As String, sh As Worksheet
    Dim sCnstr As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim sql As String, shtName As String
    Dim arr() As Variant, i As Integer, j As Integer, k As Integer
    Dim strS As String
    
    sFile = "\\10.21.4.97\File Sharing2\DataPricing\All Data Estimated.xlsx"
    shtName = "[Data$]"
    sql = "select top 3 * from " & shtName & " Order By [RefNo] DESC"
    sCnstr.CursorLocation = adUseClient
    sCnstr.Open "Provider=Microsoft.ACE.OLEDB.12.0;" _
        & "Data Source=" & sFile & ";" _
        & "Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
    rs.Open sql, sCnstr

    Worksheets("Input").Range("InputRow") = rs.Fields(0)

End Sub
หลักการคือเขียนให้ดึงค่าออกมาเพื่อให้ทราบว่าค่า No เป็นค่าใดก่อน จากนั้นเมื่อคลิก Previous หรือ Next ก็ค่อยนำค่า No ไปค้นต่อ

อย่าลืม Assign Macro ให้กับปุ่ม Previous และ Next ก่อนการรัน

Re: ค้นหาข้อมูลจากอีก Sheet

Posted: Fri Dec 09, 2022 11:02 am
by wisitsakbenz
เรียน อาจารย์ Snasui
อย่าลืม Assign Macro ให้กับปุ่ม Previous และ Next ก่อนการรัน
Assign Macro ปุ่ม Previous > PvLine() และปุ่ม ปุ่ม Next > NxLine() ใช่หรือไม่ครับอาจารย์
ถ้าใช่ error ดังภาพ error1 และ error2 ครับ
ถ้า Assign Macro ปุ่ม Previous และปุ่ม Next > Sub PreviousData() จะแสดงผลดัง Video ครับ
หรือทางผมทำผิดพลาดตรงส่วนไหนครับ ขอบคุณครับ