ต้องการ นำข้อมูลตัวเลขที่ลงไว้ใน textbox มาเก็บไว้
กระทู้เก่าบอร์ด อ.Yeadram

 929   10
URL.หัวข้อ / URL
ต้องการ นำข้อมูลตัวเลขที่ลงไว้ใน textbox มาเก็บไว้

ต้องการ นำข้อมูลตัวเลขที่ลงไว้ใน textbox มาเก็บไว้ 3 ชุด จากมากสุด ไปหาน้อยสุด

โดยมีการเก็บค่าตัวเลข 6 อัน textbox1,textbox2,textbox3,textbox4,textbox5,textbox6

เมื่อใส่ค่าไปแล้ว ให้หาค่า ตัวเลขที่มากที่สุด จาก 6 อันมาเก็บไว้แค่ 3 อันโดยไปเก็บไว้ที
textboxmax1,textboxmax2,textboxmax3

เราต้องเขียนสูตรอย่างไรครับ

ผมได้แนบรูปตัวอย่างมาด้วยครับ

10 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R23107
รบกวนขอความรู้ด้วยครับ ผมกดแนบไฟล์ไม่ติด
2 @R23115
ข้างล่างนี้มีโค้ดสำหรับเรียงข้อมูลทั้งวิธี Bubble Sort และ Quick Sort บอกไว้หมดแล้วครับ เอามาใช้ได้เลย

https://social.msdn.microsoft.com/Forums/th-TH/830b42cf-8c97-4aaf-b34b-d860773281f7/sorting-an-array-in-vba-without-excel-function?forum=isvvba
3 @R23120
ลองดูแล้วไม่ค่อยเข้าใจครับ

ผมใช้ฟังชั่น if ในการ ทำให้มันแสดงข้อมูลแล้ว แต่ทำได้แค่ช่องเดียว จะทำให้ข้อมูล ที่มาก รองลงมา เก็บใน txt High2 ไม่ได้คับ

ฟังชั่น if ที่ใช้ก็บ้านๆ นะครับเป็นแบบนี้

Sub appeFindHighVal()
Dim a, b, c, d, e, f As Integer
a = txtAIS4_1_1
b = txtAIS4_1_2
c = txtAIS4_1_3
d = txtAIS4_1_4
e = txtAIS4_1_5
f = txtAIS4_1_6

    If a >= b And a >= c And a >= d And a >= e And a >= f Then
       txtHigh1 = a
     End If
    If b >= a And b >= c And b >= d And b >= e And b >= f Then
       txtHigh1 = b
     End If
    If c >= a And c >= b And c >= d And c >= e And c >= f Then
       txtHigh1 = c
    End If
    If d >= a And d >= b And d >= c And d >= e And d >= f Then
      txtHigh1 = d
    End If
    If e >= a And e >= b And e >= c And e >= d And e >= f Then
     txtHigh1 = e
    End If
    If f >= a And f >= b And f >= c And f >= d And f >= e Then
      txtHigh1 = f
    End If
End Sub

แบบนี้ครับ
4 @R23122
ถ้าใช้ if ... หาตัวแรกก็มีถึง 6 เงื่อนไขแล้ว หาตัวที่สองก็ทำเหมือนหาตัวแรก แต่ต้องไม่นำค่าสูงสุดที่หาได้ในตัวแรกมาคิด ก็เท่ากับเหลือตัวทดสอบ 5 ตัว หาตัวที่สามก็ไม่เอาตัวแรกและตัวที่สองมาคิดก็มี 4 เงื่อนไข เท่ากับต้องเขียนคำสั่ง 6 x 5 x 4 = 120 คำสั่ง ซึ่งเป็นวิธีที่ไม่มีใครทำกันครับ
5 @R23123
แล้วถ้าเลขซ้ำกันเช่น
6 6 5 5 4 4
คุณจะเก็บเลขอะไรบ้างครับ
6 6 5
หรือ
6 5 4
6 @R23124
6 6 5 คับ
7 @R23125
ใช่คับคุณสันติสุข ผมลองนั่งทดลองทำเป็นวันๆ แต่ไม่สำเร็จคับผมเขียนโปรแกรมเก็บข้อมูลในหน่วยงานแบบง่ายๆ มาหลายโปรแกรม เจอโจทย์นี้ไปไม่เป็นเลยคับ
8 @R23129
สมมุติชื่อ Textbox คือ Text1...6

    Dim Item As Variant, Hi As Long, Low As Long, H3 As Long, i As Long, ii As Long
    Dim x(5) As Long
    For i = 0 To 5
        x(i) = Me("Text" & i + 1) ' ชื่อ Textbox ตามด้วยเลข เช่น me("txtAIS4_1_" & I + 1)
    Next
    Low = x(0)
    For Each Item In x
        If Hi < Item Then Hi = Item
        If Low > Item Then Low = Item
    Next

    Dim IndexArray(), index As Long
    For i = Low To Hi
        For ii = LBound(x) To UBound(x)
            If x(ii) = i Then
               ReDim Preserve IndexArray(index)
               IndexArray(index) = ii
               index = index + 1
            End If
        Next
    Next

    Me.txtHigh1 = x(IndexArray(5)) ' ชื่อ Textbox ที่รับค่า 3 ตัว
    Me.txtHigh2 = x(IndexArray(4))
    Me.txtHigh3 = x(IndexArray(3))

- ฟังก์ชั่นนี้มันใช้ อัลกอริทึม หาเลขน้อยสุด และมากสุดก่อน แล้วนำเลขระยะห่างทั้ง 2 มาวนลูปไล่หาเลขในตัวแปรอาเรย์ ซึ่งหากเลขที่คุณใช้มีระยะห่างมากๆ เช่น น้อยสุดคือ 1 มากสุดคือ 1 ล้าน ฟังก์ชั่นนี้จะหน่วงพอสมควรกว่าจะหาเลขที่ต้องการได้ แต่ถ้าเลขที่ใช้มีค่าความต่างกันไม่มากก็ไม่เป็นไรครับใช้ได้เลย

- แต่ถ้ามีอย่างที่กล่าวได้ ก็ให้ใช้แบบนี้แทนได้ครับ

    Dim Item As Variant, H1 As Long, H2 As Long, H3 As Long, i As Integer
    Dim x(5) As Long
    For i = 0 To 5
        x(i) = Me("Text" & i + 1)
    Next: i = 0
    For Each Item In x
        If H1 < Item Then H1 = Item
    Next
    For Each Item In x
        If Item = H1 Then: x(i) = 0: Exit For
        i = i + 1
    Next
    For Each Item In x
        If H2 < Item And H1 >= Item Then H2 = Item
    Next: i = 0
    For Each Item In x
        If Item = H2 Then: x(i) = 0: Exit For
        i = i + 1
    Next
    For Each Item In x
        If H3 < Item And H2 >= Item Then H3 = Item
    Next
    Me.txtHigh1 = H1
    Me.txtHigh2 = H2
    Me.txtHigh3 = H3

จะให้แนวคิด อัลกอริทึม แบบมนุษย์หน่อย คือหาค่ามากสุดก่อน ถ้าเจอก็จำไว้ แล้วตัดให้เป็น 0 แล้วหาค่าสูงสุดอีก เจอก็จำแล้วตัดอีก 3 ครั้ง ก็จะได้เลขตามต้องการ และไม่ต้องวนลูปตามค่าระยะห่างของเลขมากน้อย มันจะเร็วกว่ามากครับ
9 @R23130
ขอบคุณมากครับอ.TTT ขอไปศึกษาด้วยนะครับ สุดยอดจริงจริง
10 @R23131
ได้แล้วครับอาจารย์ตรงตามความต้องการเลยครับ ขอบคุณมากคับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2959s