Page 1 of 1

รบกวนดู เรื่องการแสดงข้อมูลจากฐานข้อมูลตามเงื่อนไขด้วย VBA

Posted: Fri Nov 25, 2011 1:14 pm
by snoopy1150
เรียน อาจารย์ ครับ

จาก http://snasui.blogspot.com/2011/06/vba_26.html
ที่ อาจารย์เคยได้เขียนไว้ ผมลองนำมาแก้บางจุด vba สามารถรันได้ แต่ข้อมูลไม่ show ครับ
จึงรบกวน อาจารย์ ตรวจสอบที่ครับ

Re: รบกวนดู เรื่องการแสดงข้อมูลจากฐานข้อมูลตามเงื่อนไขด้วย V

Posted: Fri Nov 25, 2011 1:43 pm
by bank9597
:lol: :lol: บุคคลที่ได้ชื่อเป็นอาจารยื ท่านใช้ชื่อว่า "คนควน" น่ะครับ

ส่วนผม Bank9597 คือศิษย์ของอาจารย์อีกทีนึงครับ ที่ผมอ้างชื่ออาจารย์บ่อยๆในเว็บอื่น นั่นก็คือ "คนควน" นั่นเองครับ

ส่วนโค๊ดที่มีปัญหานั่น ในโค๊ดยังผิดอยู่ครับ หากจะเลือกรายการแล้วข้อมูลแสดงเลยโดยไม่ต้องกดปุ่ม ก็จะต้องเพิ่มเติมโค๊ดลงในชีทนั้นด้วยครับ

ดูจากไฟล์ที่แนบมาให้นั้น ไม่ได้บันทึกแบบใช้มาโคร ฉะนั้นก้เป็นเหตุผลหนึ่งที่รันโค๊ดไม่ได้ครับ :D

ถ้ามาถามในเว็บแห่งนี้ ก็จะเป็นหน้าที่ของอาจารย์ให้คำตอบ ซึ่งจะให้คำตอบได้ดีกว่าผมมากมายหลายเท่าครับ :D

และอยากบอกว่าคิดถุกที่สุดที่มาตั้งคำถามในเว็บแห่งนี้ครับ :D

Re: รบกวนดู เรื่องการแสดงข้อมูลจากฐานข้อมูลตามเงื่อนไขด้วย V

Posted: Fri Nov 25, 2011 1:46 pm
by snoopy1150
:D :D ขอบคุณครับคุณ Bank9597 เจอกันอีกแล้วน่ะครับ งั้นผมขอถามว่าผมต้องเพิ่มหรือปก้ไขส่วนไหนบ้างครับ

Re: รบกวนดู เรื่องการแสดงข้อมูลจากฐานข้อมูลตามเงื่อนไขด้วย V

Posted: Fri Nov 25, 2011 1:49 pm
by snasui
bank9597 wrote:ที่ผมอ้างชื่ออาจารย์บ่อยๆในเว็บอื่น นั่นก็คือ "คนควน" นั่นเองครับ
ถ้างดเว้นการอ้างถึงได้ก็จะดีครับ อย่าพยายามอ้างถึงเพื่อความน่าเชื่อถือของข้อมูลครับ เพราะมีโอกาสที่ผมจะถูกหมั่นไส้ได้โดยง่าย
snoopy1150 wrote:เรียน อาจารย์ ครับ

จาก http://snasui.blogspot.com/2011/06/vba_26.html
ที่ อาจารย์เคยได้เขียนไว้ ผมลองนำมาแก้บางจุด vba สามารถรันได้ แต่ข้อมูลไม่ show ครับ
จึงรบกวน อาจารย์ ตรวจสอบที่ครับ
สำหรับการเขียน Code ถ้ายังไม่แม่นก็ควรจะค่อย ๆ เรียนรู้ไปครับ Code ตาม Link นั้นไม่ง่ายนัก เพราะใช้ Array เข้ามาประกอบอยู่ด้วย การทำเช่นตัวอย่างไฟล์ที่แนบมาไม่จำเป็นต้องใช้ VBA ครับ

สำหรับ VBA ผมปรับมาให้ดูเป็นตัวอย่างตามด้านล่างครับ

Code: Select all

Option Explicit
Option Base 1
Sub ShowEmp()
    Dim a() As Variant, lng As Long
    Dim r As Range, rAll As Range
    Dim rt As Range, rl As Long
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    rl = Rows.Count
    With Worksheets("2703")
      Set rAll = .Range("F2", .Range("F" & rl).End(xlUp))
    End With
    For Each r In rAll
        If r = Worksheets("From").Range("A2") Then
            lng = lng + 1
            ReDim Preserve a(5, lng)
            a(1, lng) = lng
            a(2, lng) = r.Offset(0, -5)
            a(3, lng) = r.Offset(0, -4)
            a(4, lng) = r.Offset(0, -3)
            a(5, lng) = r.Offset(0, -2)
        End If
    Next r
    If lng > 0 Then
        With Worksheets("From")
        Set rt = .Range("B4", .Range("F" & lng - 1 + 4))
            If .Range("B4") <> "" Then
              .Range("B4", .Range("B" & rl).End(xlUp).Offset(0, 4)).ClearContents
            End If
        .Range("B4:F4").Copy
        rt.PasteSpecial xlPasteFormats
        rt = Application.Transpose(a)
        .Range(.Range("B3").End(xlDown).Offset(1, 0), .Range("F" & rl)).ClearContents
      End With
    Else
      MsgBox "Data not found."
    End If
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub

Re: รบกวนดู เรื่องการแสดงข้อมูลจากฐานข้อมูลตามเงื่อนไขด้วย V

Posted: Fri Nov 25, 2011 2:07 pm
by bank9597
:shock: โอ๊ว....ไม่ต้องห่วงครับ ทุกอย่างอยู่ในขอบเขตที่เคยกล่าวไว้แล้วครับ :D

Re: รบกวนดู เรื่องการแสดงข้อมูลจากฐานข้อมูลตามเงื่อนไขด้วย V

Posted: Fri Nov 25, 2011 3:27 pm
by snoopy1150
ขอบคุณครับ แต่มีบางข้อมูลที่ดึงออกมา show ยังไม่ค่อยตรงอ่ะครับ ถ้าจะแก้ สูตรที่ดึงข้อมูลมา Show ต้องแก้ตรงไหนครับ

Re: รบกวนดู เรื่องการแสดงข้อมูลจากฐานข้อมูลตามเงื่อนไขด้วย V

Posted: Fri Nov 25, 2011 3:38 pm
by snasui
:? ช่วยระบุตำแหน่งที่บอกว่าไม่ตรงครับ ค่าที่ถูกควรเป็นค่าใด กรณีเป็น Error ช่วยจับภาพ Error นั้นมาแสดงด้วยครับ

Re: รบกวนดู เรื่องการแสดงข้อมูลจากฐานข้อมูลตามเงื่อนไขด้วย V

Posted: Fri Nov 25, 2011 4:06 pm
by bank9597
:D ลองตามนี้ครับ ว่าใช่หรือไม่

Code: Select all

Option Explicit
Option Base 1
Sub ShowEmp()
    Dim a() As Variant, lng As Long
    Dim r As Range, rAll As Range
    Dim rt As Range, rl As Long
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    rl = Rows.Count
    With Worksheets("2703")
      Set rAll = .Range("F2", .Range("F" & rl).End(xlUp))
    End With
    For Each r In rAll
        If r = Worksheets("From").Range("A2") Then
            lng = lng + 1
            ReDim Preserve a(5, lng)
            a(1, lng) = lng
            a(2, lng) = r.Offset(0, -4)
            a(3, lng) = r.Offset(0, -3)
            a(4, lng) = r.Offset(0, -2) And r.Offset(0, -1)
            a(5, lng) = r.Offset(0, 0)
        End If
    Next r
    If lng > 0 Then
        With Worksheets("From")
        Set rt = .Range("B4", .Range("F" & lng - 1 + 4))
            If .Range("B4") <> "" Then
              .Range("B4", .Range("B" & rl).End(xlUp).Offset(0, 4)).ClearContents
            End If
        .Range("B4:F4").Copy
        rt.PasteSpecial xlPasteFormats
        rt = Application.Transpose(a)
        .Range(.Range("B3").End(xlDown).Offset(1, 0), .Range("F" & rl)).ClearContents
      End With
    Else
      MsgBox "Data not found."
    End If
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub

Re: รบกวนดู เรื่องการแสดงข้อมูลจากฐานข้อมูลตามเงื่อนไขด้วย V

Posted: Fri Nov 25, 2011 4:13 pm
by snasui
:lol:

Code: Select all

a(4, lng) = r.Offset(0, -2) And r.Offset(0, -1)
มีความหมายว่าอย่างไรครับ :mrgreen:

Re: รบกวนดู เรื่องการแสดงข้อมูลจากฐานข้อมูลตามเงื่อนไขด้วย V

Posted: Fri Nov 25, 2011 4:25 pm
by bank9597
:mrgreen: นั่นไง ผมคงจะโดนเชือดคอโชว์ซะเเล้ว :lol: :lol:
อธิบายตามความเข้าใจของตัวเองเป็นหลักน่ะครับ ถูกหรือผิดหลักอย่างไร รบกวนอาจารย์ชี้แนะอีกครั้งนึงน่ะครับ :D

Code: Select all

a(4, lng) = r.Offset(0, -2) And r.Offset(0, -1)
ในชีท FORM คอลัมน์ที่ 4 (a(4, lng)) จะดึงข้อมูลมาแสดงข้อมูลในชีท "2703" โดยเลือกคอลัมน์ที่ถัดจากคอลัมน์ "Location" ไปทางซ้าย 2 คอลัมน์(r.Offset(0, -2)) หรือลำดับที่ 2 ก็ได้ ส่วน And r.Offset(0, -1) คือต้องการให้แสดงข้อมูลถัดจากคอลัมน์ "Location" ไปทางซ้าย 1 คอลัมน์ โดยให้ข้อมูล 2 ส่วนนี้แสดงในเซลล์เดียวกันครับ

เบื้องต้นอธิบายได้แค่นี้ ไม่รู้จะถูกต้องตามที่ต้องการไหม และไม่รู้ถูกต้องตามหลักการที่อาจารย์ท่านได้ถามไหม :D

Re: รบกวนดู เรื่องการแสดงข้อมูลจากฐานข้อมูลตามเงื่อนไขด้วย V

Posted: Fri Nov 25, 2011 4:36 pm
by snoopy1150
ขอบคุณ คุณ Bank9597 ครับ

Code นี้ใช้ได้เลยครับ แต่ข้อมูลในช่อง " Plant\Location " ของ "From" ก็ยัง show ข้อมูลเพี้ยนอยู่อ่ะครับ

Re: รบกวนดู เรื่องการแสดงข้อมูลจากฐานข้อมูลตามเงื่อนไขด้วย V

Posted: Fri Nov 25, 2011 4:49 pm
by snasui
bank9597 wrote: :mrgreen: นั่นไง ผมคงจะโดนเชือดคอโชว์ซะเเล้ว :lol: :lol:
อธิบายตามความเข้าใจของตัวเองเป็นหลักน่ะครับ ถูกหรือผิดหลักอย่างไร รบกวนอาจารย์ชี้แนะอีกครั้งนึงน่ะครับ :D

Code: Select all

a(4, lng) = r.Offset(0, -2) And r.Offset(0, -1)
ในชีท FORM คอลัมน์ที่ 4 (a(4, lng)) จะดึงข้อมูลมาแสดงข้อมูลในชีท "2703" โดยเลือกคอลัมน์ที่ถัดจากคอลัมน์ "Location" ไปทางซ้าย 2 คอลัมน์(r.Offset(0, -2)) หรือลำดับที่ 2 ก็ได้ ส่วน And r.Offset(0, -1) คือต้องการให้แสดงข้อมูลถัดจากคอลัมน์ "Location" ไปทางซ้าย 1 คอลัมน์ โดยให้ข้อมูล 2 ส่วนนี้แสดงในเซลล์เดียวกันครับ

เบื้องต้นอธิบายได้แค่นี้ ไม่รู้จะถูกต้องตามที่ต้องการไหม และไม่รู้ถูกต้องตามหลักการที่อาจารย์ท่านได้ถามไหม :D
ที่อธิบายมาไม่ถูกครับ ที่ดึงข้อมูลมาเก็บไว้ ไม่ได้เก็บไว้ในชีท Form แต่เก็บไว้ใน Array ที่ชือ a โดยเก็บไว้ที่บรรทัดที่ 4 และคอลัมน์ที่ได้จากค่าของ lng

จาก a(4, lng) = r.Offset(0, -2) เป็นการกำหนดค่าให้กับ Array a กรณีต้องการเชื่อมค่าเข้าด้วยกันก่อนที่จะ Assign ค่าให้ใช้ & หรือ + ดังนั้น ควรจะได้เป็น

a(4, lng) = r.Offset(0, -2) & r.Offset(0, -1) หรือ
a(4, lng) = r.Offset(0, -2) + r.Offset(0, -1)

แต่กรณีที่ไม่ได้เป็น String จะใช้เครื่องหมาย + ไม่ได้ครับ

Re: รบกวนดู เรื่องการแสดงข้อมูลจากฐานข้อมูลตามเงื่อนไขด้วย V

Posted: Fri Nov 25, 2011 4:58 pm
by bank9597
ที่อธิบายมาไม่ถูกครับ ที่ดึงข้อมูลมาเก็บไว้ ไม่ได้เก็บไว้ในชีท Form แต่เก็บไว้ใน Array ที่ชือ a โดยเก็บไว้ที่บรรทัดที่ 4 และคอลัมน์ที่ได้จากค่าของ lng

จาก a(4, lng) = r.Offset(0, -2) เป็นการกำหนดค่าให้กับ Array a กรณีต้องการเชื่อมค่าเข้าด้วยกันก่อนที่จะ Assign ค่าให้ใช้ & หรือ +
:D :D โดนเชือดจริงๆด้วย :D :D
ขอบคุณอาจารย์ครับ :D

ที่อธิบายไปนั้น เพราะยังไม่เข้ารูปแบบที่ต้องการ ไม่สามารถบอกได้ชัดเจนว่าต้องระบุโค๊ดอย่างไร

แต่พอเข้าดูใหม่เลยรู้ว่า โค๊ดที่ถูกต้อง น่าจะเป็นด้านล่างครับ :ard:

Code: Select all

Option Explicit




Option Base 1
Sub ShowEmp()
    Dim a() As Variant, lng As Long
    Dim r As Range, rAll As Range
    Dim rt As Range, rl As Long
    Application.EnableEvents = False
    Application.ScreenUpdating = False
    rl = Rows.Count
    With Worksheets("2703")
      Set rAll = .Range("F2", .Range("F" & rl).End(xlUp))
    End With
    For Each r In rAll
        If r = Worksheets("From").Range("A2") Then
            lng = lng + 1
            ReDim Preserve a(5, lng)
            a(1, lng) = lng
            a(2, lng) = r.Offset(0, -4)
            a(3, lng) = r.Offset(0, -3)
            a(4, lng) = r.Offset(0, -1)
            a(5, lng) = r.Offset(0, 0)
        End If
    Next r
    If lng > 0 Then
        With Worksheets("From")
        Set rt = .Range("B4", .Range("F" & lng - 1 + 4))
            If .Range("B4") <> "" Then
              .Range("B4", .Range("B" & rl).End(xlUp).Offset(0, 4)).ClearContents
            End If
        .Range("B4:F4").Copy
        rt.PasteSpecial xlPasteFormats
        rt = Application.Transpose(a)
        .Range(.Range("B3").End(xlDown).Offset(1, 0), .Range("F" & rl)).ClearContents
      End With
    Else
      MsgBox "Data not found."
    End If
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub
ไม่ได้ดูในคอลัมน์ E ของขีทฟอร์มที่กำหนดรูปแบบไว้ ส่วนชื่อ Location ต้องทำให้ถูกต้องก่อนครับ ตัวไหนเป็นรหัสเดียวกัน ก็ต้องตรวจเช็คให้ละเอียดครับ :D

Re: รบกวนดู เรื่องการแสดงข้อมูลจากฐานข้อมูลตามเงื่อนไขด้วย V

Posted: Fri Nov 25, 2011 5:11 pm
by snoopy1150
ขอบคุณท่านทั้ง 2 ครับ ที่ทำให้ผมได้รู้เกี่ยวกับ Code ได้เยอะเลย และผมก็ได้สิ่งที่ต้องการครับ

ขอบคุณครับ