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
:D ตัวอย่าง 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
:D ให้เขัยนอธิบายลงมาในฟอรัมและเขียน 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
:D ตามที่อ่านในไฟล์เดิม พบว่ามีการยกเว้นด้วย ไม่ทราบว่ายังมีการยกเว้นหรือไม่ ช่วยอธิบายเพิ่มด้วยครับ

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
:D ค่อย ๆ ถามตอบกันไปครับ

ช่วยยกตัวอย่างข้อมูลตามทีอธิบายมาว่าให้สุ่มอย่างไร กรณีใดสุ่มออกมาแล้วใช้ได้ กรณีใดสุ่มออกมาแล้วใช้ไม่ได้ต้องสุ่มใหม่

การเขียน 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
:D ลองเขียน 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
:D ช่วยแสดงคำตอบที่ถูกต้องมาสักสองบรรทัด พร้อมอธิบายมาว่าเหตุใดจึงได้คำตอบนั้น

การสุ่มไม่ให้เหมือนกันต้อง 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
:D 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
:D จำนวนบรรทัดรวม 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
:D ช่วยกลับไปอธิบายสิ่งที่ผมถามให้ชัดเจนก่อนดีกว่าครับ จะได้ลำดับได้ว่ากำลังจะทำอะไร ต้องการผลลัพธ์อย่างไร เนื่องจากที่ผ่านมายังไม่ได้ตอบในสิ่งที่ผมถามตามโพสต์นี้
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
:D ตัวอย่าง 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