กระทู้เก่าบอร์ด อ.Yeadram
1,021 10
URL.หัวข้อ /
URL
ต้องการ นำข้อมูลตัวเลขที่ลงไว้ใน textbox มาเก็บไว้
ต้องการ นำข้อมูลตัวเลขที่ลงไว้ใน textbox มาเก็บไว้ 3 ชุด จากมากสุด ไปหาน้อยสุด
โดยมีการเก็บค่าตัวเลข 6 อัน textbox1,textbox2,textbox3,textbox4,textbox5,textbox6
เมื่อใส่ค่าไปแล้ว ให้หาค่า ตัวเลขที่มากที่สุด จาก 6 อันมาเก็บไว้แค่ 3 อันโดยไปเก็บไว้ที
textboxmax1,textboxmax2,textboxmax3
เราต้องเขียนสูตรอย่างไรครับ
ผมได้แนบรูปตัวอย่างมาด้วยครับ
โดยมีการเก็บค่าตัวเลข 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
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
แบบนี้ครับ
ผมใช้ฟังชั่น 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 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 ครั้ง ก็จะได้เลขตามต้องการ และไม่ต้องวนลูปตามค่าระยะห่างของเลขมากน้อย มันจะเร็วกว่ามากครับ
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
ได้แล้วครับอาจารย์ตรงตามความต้องการเลยครับ ขอบคุณมากคับ
Time: 0.3311s