Page 1 of 3
Random name
Posted: Thu Feb 12, 2015 9:52 pm
by Ponpimon
หนูต้องการrandom ข้อมูลในหน้า ข้อมูล ไปแสดงในหน้า random โดยที่หน้า random มีดรอปดาวน์ให้เลือกด้วยว่าต้องการจะrandom ข้อมูลของอะไร แล้วคลิกปุ่มก็จะโชว์ข้อมูลที่ random ในเซลล์B3
Re: Random name
Posted: Thu Feb 12, 2015 11:51 pm
by snasui

ตัวอย่าง Code ตามด้านล่างครับ
Code: Select all
Dim rall As Range, iCount As Integer
With Sheets("ข้อมูล")
Set rall = .Range("a2", .Range("a" & .Rows.Count).End(xlUp))
iCount = rall.Count
End With
Select Case Sheets("random").Range("a3")
Case "หัวข้อ1"
Sheets("random").Range("b3").Value = Application.Index(rall, Int(Rnd * iCount) + 1)
Case "หัวข้อ2"
Sheets("random").Range("b3").Value = Application.Index(rall.Offset(0, 1), Int(Rnd * iCount) + 1)
Case "หัวข้อ3"
Sheets("random").Range("b3").Value = Application.Index(rall.Offset(0, 2), Int(Rnd * iCount) + 1)
Case "หัวข้อ4"
Sheets("random").Range("b3").Value = Application.Index(rall.Offset(0, 3), Int(Rnd * iCount) + 1)
End Select
Re: Random name
Posted: Fri Feb 13, 2015 12:54 am
by Ponpimon
อาจารย์คะ มีเงื่อนไขเพิ่มขึ้นมาค่ะ
Re: Random name
Posted: Fri Feb 13, 2015 6:58 am
by snasui

ให้เขัยนอธิบายลงมาในฟอรัมและเขียน Code ในแต่ละเงื่อนไขที่ต้องการมาด้วย ติดตรงไหนแล้วค่อยถามกันต่อครับ
Re: Random name
Posted: Fri Feb 13, 2015 6:50 pm
by Ponpimon
อาจารย์ค่ะ หนูอยากให้ค่าในเซลล์ c และ d สุ่มออกมาพร้อมกันทั้งสองค่า ตอนนี้หนูใส่โค้ดไปแล้ว ค่าออกมาแค่เซลล์ c เซลล์เดียวค่ะ เซลล์ d ไม่แสดงค่ะ
อยากให้ช่อง b เมื่อเลือกกลุ่มเรื่องแล้ว กดสุ่มแล้วทุกช่องสุ่มกรรมการสอบออกมาพร้อมกันเลยค่ะ
Re: Random name
Posted: Fri Feb 13, 2015 7:09 pm
by snasui

ตามที่อ่านในไฟล์เดิม พบว่ามีการยกเว้นด้วย ไม่ทราบว่ายังมีการยกเว้นหรือไม่ ช่วยอธิบายเพิ่มด้วยครับ
Re: Random name
Posted: Fri Feb 13, 2015 7:18 pm
by Ponpimon
หนูอยากได้แบบ ถ้ากลุ่มนี้มีอ.ปรึกษา และอ.ปรึกษาร่วมชื่ออะไร ก็จะไม่ให้มีชื่อที่ซ้ำกับอ.ปรึกษา อ.ปรึกษาร่วมมาสุ่ม เงื่อนไขมันเยอะค่ะ หนูเลยคิดไม่ออกค่ะ
Re: Random name
Posted: Fri Feb 13, 2015 7:23 pm
by snasui

ค่อย ๆ ถามตอบกันไปครับ
ช่วยยกตัวอย่างข้อมูลตามทีอธิบายมาว่าให้สุ่มอย่างไร กรณีใดสุ่มออกมาแล้วใช้ได้ กรณีใดสุ่มออกมาแล้วใช้ไม่ได้ต้องสุ่มใหม่
การเขียน Code ตามลักษณะนี้ต้องพึ่งการ Loop เข้ามาช่วย คือสุ่มแล้วหากผลลัพธ์ที่ได้ไป
ตรงกับค่าที่ไม่ต้องการก็ให้ทำการสุ่มใหม่จนกว่าจะไม่ตรงกับค่าต้องห้าม
Re: Random name
Posted: Fri Feb 13, 2015 7:29 pm
by Ponpimon
เช่น ถ้าชื่่อโครงงาน ก ไก่ มีอ.ที่ปรึกษาคือ กานต์ และอ.ที่ปรึกษาร่วมคือ กันต์ เลือกกลุ่มเรื่องเป็น mm เพราะฉะนั้นผลลัพธ์เวลาสุ่ม ก็จะต้องไม่มีกานต์ กับ กันต์แสดงออกมา มันก็จะเหลือแค่ เมย์ คนเดียวค่ะ
Re: Random name
Posted: Fri Feb 13, 2015 7:33 pm
by snasui

ลองเขียน Code ตามที่อธิบายมา โดยพิจารณาที่ผมโพสต์ไปด้านบนประกอบครับ จะได้ช่วยดูต่อไปจากนั้นครับ
Re: Random name
Posted: Fri Feb 13, 2015 7:48 pm
by Ponpimon
ตอนนี้หนูทำให้สองช่องสุ่มพร้อมกันได้แล้วค่ะ แต่สองช่องมันยังมีค่าเหมือนกันเป็นบางครั้ง ส่วนอีกเงื่อนไขที่ไม่ให้ซ้ำกับอ.ปรึกษากับอ.ปรึกษาร่วมยังไม่ค่ะ
Re: Random name
Posted: Fri Feb 13, 2015 8:13 pm
by snasui

ช่วยแสดงคำตอบที่ถูกต้องมาสักสองบรรทัด พร้อมอธิบายมาว่าเหตุใดจึงได้คำตอบนั้น
การสุ่มไม่ให้เหมือนกันต้อง Loop อย่างที่กล่าวไปแล้ว
Code ด้านล่างนี้เป็นเพียงตัวอย่างการ Loop ครับ
Code: Select all
Case "mm"
Sheets("sheet3").Range("c3").Value = Application.Index(rall, Int(Rnd * iCount) + 1)
Do While Sheets("Sheet3").Range("d3").Value = Sheets("Sheet3").Range("c3").Value
Sheets("sheet3").Range("d3").Value = Application.Index(rall, Int(Rnd * iCount) + 1)
Loop
Re: Random name
Posted: Fri Feb 13, 2015 9:09 pm
by Ponpimon
อาจารย์ค่ะ ตอนนี้หนูลองนำโค้ดไปใส่ในโปรแกรม ซึ่งโปรแกรมต้องรันข้อมูลประมาณ30กลุ่ม โค้ดเยอะมาก ค่ะ แล้วมันไม่รันด้วยค่ะ แต่ว่าในโปรแกรมตัวอย่างที่ลองทำมันรันค่ะ
Re: Random name
Posted: Fri Feb 13, 2015 9:28 pm
by snasui

Code ที่ว่าเยอะลองนับดูว่ากี่บรรทัดครับ
Re: Random name
Posted: Fri Feb 13, 2015 9:47 pm
by Ponpimon
ประมาณ70บรรทัดจะรันข้อมูลได้1 กลุ่มค่ะ
Re: Random name
Posted: Fri Feb 13, 2015 10:01 pm
by snasui

จำนวนบรรทัดรวม 30 กลุ่ม ก็ยังไม่เกินข้อจำกัดของ Excel กรณี Code มากเกินไป Excel จะฟ้องให้เห็นว่า Code ยาวเกินไปครับ
ลองกดแป้น F8 เพื่อ Run ทีละ Step ดูว่าติดขัดตรงไหนครับ
Re: Random name
Posted: Mon Mar 02, 2015 6:23 pm
by Ponpimon
อาจารย์ค่ะ ตอนนี้หนูให้อาจารย์ของหนูช่วยเขียนโค๊ดมาแล้วค่ะ แต่ว่าพอหนูเปลี่ยนข้อมูลในช่องชื่อโครงงาน เป็นกลุ่มอื่น ความเป็นจริงในช่องสุ่มจะต้องสุ่มกรรมการตามกลุ่มเรื่อง แล้วจะต้องไม่เลือกอาจารย์ที่ปรึกษากับอาจารย์ที่ปรึกษาร่วมมาสุ่มด้วย แต่มันยังเอาอาจารย์ที่ปรึกษากับที่ปรึกษาร่วมมาสุ่มค่ะ
Re: Random name
Posted: Mon Mar 02, 2015 6:36 pm
by snasui

ช่วยกลับไปอธิบายสิ่งที่ผมถามให้ชัดเจนก่อนดีกว่าครับ จะได้ลำดับได้ว่ากำลังจะทำอะไร ต้องการผลลัพธ์อย่างไร เนื่องจากที่ผ่านมายังไม่ได้ตอบในสิ่งที่ผมถามตามโพสต์นี้
snasui wrote: ช่วยแสดงคำตอบที่ถูกต้องมาสักสองบรรทัด พร้อมอธิบายมาว่าเหตุใดจึงได้คำตอบนั้น
การสุ่มไม่ให้เหมือนกันต้อง Loop อย่างที่กล่าวไปแล้ว
ที่ผมตอบไปหลังจากคำถามนั้นเป็นการตอบอย่างกว้าง ๆ เพื่อนำไปประยุกต์ใช้เท่านั้น
Re: Random name
Posted: Mon Mar 02, 2015 6:41 pm
by Ponpimon
เช่น ถ้าชื่่อโครงงาน ก ไก่ มีอ.ที่ปรึกษาคือ กานต์ และอ.ที่ปรึกษาร่วมคือ กันต์ ถ้าหนูเลือกกลุ่มเรื่องเป็น mm เพราะฉะนั้นผลลัพธ์เวลาสุ่ม ก็จะต้องไม่มีกานต์ กับ กันต์
ผลที่แสดงออกมา มันก็จะเหลือแค่ เมย์ คนเดียวค่ะ
สิ่งที่หนูต้องการเป็นแบบนี้ค่ะ อันนี้หนูยกตัวอย่างของกลุ่มแรกค่ะ
Re: Random name
Posted: Mon Mar 02, 2015 8:40 pm
by snasui

ตัวอย่าง Code ตามด้านล่างครับ
Code: Select all
Sub test()
Dim prjs As Range, prj As Range, pjl As Integer
Dim pa As Range, paCheck As Range, pck As Range
Dim cmAll As Range, cm As Range, cmr As Range, c As Range
Dim grpAll As Range, gSl() As Variant, gc As Integer
Dim gt As Range, g As Range, iCount As Integer, i As Integer
Dim ig As Integer, t As String, x As String
With Sheets("Sheet2")
Set pa = .Range("a2", .Range("a" & .Rows.Count).End(xlUp))
Set grpAll = .Range("f1", .Range("f1").End(xlToRight))
End With
With Sheets("Sheet3")
Set paCheck = .Range("a3", .Range("a" & .Rows.Count).End(xlUp))
End With
For Each pck In paCheck
pjl = Application.Match(pck, pa, 0)
Set cmAll = pa.Offset(pjl - 1, 1).Resize(1, 2)
gc = Application.Match(pck.Offset(0, 1), grpAll, 0)
Set gt = Range(grpAll.Offset(1, gc - 1), grpAll.Offset(1, gc - 1) _
.End(xlDown)).Resize(, 1)
iCount = 0
For Each g In gt
If Application.CountIf(cmAll, g) = 0 Then
ReDim Preserve gSl(iCount)
gSl(iCount) = g
iCount = iCount + 1
End If
Next g
Set cmr = pck.Offset(0, 2).Resize(1, 2)
t = ""
i = 0
For Each c In cmr
Do While i <= 1
x = gSl(Int(Rnd * (UBound(gSl) + 1)))
If InStr(t, x) = 0 Then
t = t & x
c.Offset(0, i) = x
i = i + 1
End If
Loop
Next c
Next pck
End Sub