Page 1 of 1

ต้องการให้ข้อมูลเปลี่ยนแปลงตาม Combobox

Posted: Wed Sep 10, 2014 10:10 pm
by akekorn
สวัสดีครับเพื่อนสมาชิกทุกท่าน
ผมมีปัญหาจะขอความอนุเคราะห์จากเพื่อนสมาชิก คือผมทำ ฟอร์ม ขึ้นมาโดยมีการเรียกข้อมูลของกลุ่มผ่าน combobox อย่างในตัวอย่างที่แนบมาให้
จะมี combobox 2 ตัว คือ combobox ที่แสดงจำนวนเดือน และ combobox ที่แสดง ชื่อห้อง
จากตัวอย่างที่แนบหากผมเลือกเดือน january และ ห้อง 2A ข้อมูลในชีท Jan จะโชว์รายละเอียดของห้อง 2A แต่เนื่องจากห้องมีเยอะมากหากต้องเขียนโค๊ดแบบนี้ยาวไปคงลำบากจึงอยากรบกวนว่ามีวิธีใดที่จะให้มีการวนลูปหาห้องมาใส่เพื่อเวลาเลื่อนห้องต่อไปของเดือน จะแสดงรายละเอียดเกี่ยวกับห้องนั้นได้ครับ

ขอบคุณในความอนุเคราะห์ล่วงหน้าครับ

เอกกร

Re: ต้องการให้ข้อมูลเปลี่ยนแปลงตาม Combobox

Posted: Wed Sep 10, 2014 10:42 pm
by snasui
:D อ่านแล้วไม่เข้าใจครับ

ในชีท Menu เป็นการเรียก Form ขึ้นมาแล้วให้ทำงานกับชีทเมนู โดยที่ข้อมูลอยู่ในชีทอื่น ๆ ย่อมไม่ได้คำตอบตามต้องการ

จากตัวอย่าง Code

Code: Select all

If cbomonth.Value = "January" Then
    Range("a6").Select
หากต้องการจะให้ทำงานถูกต้องจะต้องกำกับหรือระบุชีทให้กับ Range("a6") ด้วย

ช่วยอธิบายมาลำดับขั้นตอนของงานนี้มาด้วยจะได้เข้าถึงปัญหาโดยไว ควรจะแจ้งมาว่า Code ที่เป็นปัญหาอยู่ใน Procedure ใด ติดปัญหาที่บรรทัดใด ฯลฯ

Re: ต้องการให้ข้อมูลเปลี่ยนแปลงตาม Combobox

Posted: Thu Sep 11, 2014 10:06 pm
by akekorn
ครับคือว่าที่ผมอยากขอความรู้ในการดัดแปลงโค๊ดตัวนี้คือ

Code: Select all

Private Sub cboroom_Change()
myroom = cboroom.Text
If cboroom.Value = "2A" Then  'อ้างถึงชื่อห้อง
    Sheets("Jan").Select
    Range("b6").Select
    Do While True
    If myroom = ActiveCell.Value Then
   
        TextBox1.Text = ActiveCell.Offset(0, i + 1).Value
        TextBox6.Text = ActiveCell.Offset(0, i + 2).Value
        TextBox2.Text = ActiveCell.Offset(0, i + 3).Value
        TextBox7.Text = ActiveCell.Offset(0, i + 4).Value
        TextBox4.Text = ActiveCell.Offset(0, i + 5).Value
        TextBox8.Text = ActiveCell.Offset(0, i + 6).Value
        TextBox9.Text = ActiveCell.Offset(0, i + 7).Value
        TextBox10.Text = ActiveCell.Offset(0, i + 8).Value
        TextBox12.Text = ActiveCell.Offset(0, i + 9).Value
        TextBox11.Text = ActiveCell.Offset(0, i + 10).Value
        TextBox13.Text = ActiveCell.Offset(0, i + 11).Value
        Exit Do
    End If
    ActiveCell.Offset(1, 0).Select
   Loop
End If
End Sub
จะสังเกตว่าผมจะต้องแทนค่าห้องเข้าไปเนื่องจากมีถึง 42 ห้องหากเขียนโปรแกรมแบบนั้จะทำให้ต้องเขียนโปรแกรมยาวทำทีละห้องจนครบ
ผมจึงอยากขอความรุ้จะมีวิธีไหนไหมครับที่จะเขียนโปรแกรมให้สั้นลงได้ครับผม
ขอบคุณครับ

เอกกร

Re: ต้องการให้ข้อมูลเปลี่ยนแปลงตาม Combobox

Posted: Thu Sep 11, 2014 10:08 pm
by akekorn
ขอรบกวนอีกข้อครับ คือต้องเดือนด้วยครับเนื่องจากมี 42 ห้องต่อเดือน ควรใส่ตัวแปรอย่างไรดีครับ

Re: ต้องการให้ข้อมูลเปลี่ยนแปลงตาม Combobox

Posted: Thu Sep 11, 2014 10:23 pm
by akekorn
โค๊ดของเดือนจะยาวมากครับ

Code: Select all

Private Sub cboroom_Change()
myroom = cboroom.Text
If cbomonth.Value = "January" And cboroom.Value = "2A" Then
    Sheets("Jan").Select
    Range("b6").Select
    Do While True
    If myroom = ActiveCell.Value Then
   
        TextBox1.Text = ActiveCell.Offset(0, i + 1).Value
        TextBox6.Text = ActiveCell.Offset(0, i + 2).Value
        TextBox2.Text = ActiveCell.Offset(0, i + 3).Value
        TextBox7.Text = ActiveCell.Offset(0, i + 4).Value
        TextBox4.Text = ActiveCell.Offset(0, i + 5).Value
        TextBox8.Text = ActiveCell.Offset(0, i + 6).Value
        TextBox9.Text = ActiveCell.Offset(0, i + 7).Value
        TextBox10.Text = ActiveCell.Offset(0, i + 8).Value
        TextBox12.Text = ActiveCell.Offset(0, i + 9).Value
        TextBox11.Text = ActiveCell.Offset(0, i + 10).Value
        TextBox13.Text = ActiveCell.Offset(0, i + 11).Value
        Exit Do
    End If
    ActiveCell.Offset(1, 0).Select
   Loop
ElseIf cbomonth.Value = "January" And cboroom.Value = "2B" Then
    Sheets("Jan").Select
    Range("b6").Select
    Do While True
    If myroom = ActiveCell.Value Then
   
        TextBox1.Text = ActiveCell.Offset(0, i + 1).Value
        TextBox6.Text = ActiveCell.Offset(0, i + 2).Value
        TextBox2.Text = ActiveCell.Offset(0, i + 3).Value
        TextBox7.Text = ActiveCell.Offset(0, i + 4).Value
        TextBox4.Text = ActiveCell.Offset(0, i + 5).Value
        TextBox8.Text = ActiveCell.Offset(0, i + 6).Value
        TextBox9.Text = ActiveCell.Offset(0, i + 7).Value
        TextBox10.Text = ActiveCell.Offset(0, i + 8).Value
        TextBox12.Text = ActiveCell.Offset(0, i + 9).Value
        TextBox11.Text = ActiveCell.Offset(0, i + 10).Value
        TextBox13.Text = ActiveCell.Offset(0, i + 11).Value
        Exit Do
    End If
    ActiveCell.Offset(1, 0).Select
   Loop
   ElseIf cbomonth.Value = "January" And cboroom.Value = "2C" Then
    Sheets("Jan").Select
    Range("b6").Select
    Do While True
    If myroom = ActiveCell.Value Then
   
        TextBox1.Text = ActiveCell.Offset(0, i + 1).Value
        TextBox6.Text = ActiveCell.Offset(0, i + 2).Value
        TextBox2.Text = ActiveCell.Offset(0, i + 3).Value
        TextBox7.Text = ActiveCell.Offset(0, i + 4).Value
        TextBox4.Text = ActiveCell.Offset(0, i + 5).Value
        TextBox8.Text = ActiveCell.Offset(0, i + 6).Value
        TextBox9.Text = ActiveCell.Offset(0, i + 7).Value
        TextBox10.Text = ActiveCell.Offset(0, i + 8).Value
        TextBox12.Text = ActiveCell.Offset(0, i + 9).Value
        TextBox11.Text = ActiveCell.Offset(0, i + 10).Value
        TextBox13.Text = ActiveCell.Offset(0, i + 11).Value
        Exit Do
    End If
    ActiveCell.Offset(1, 0).Select
   Loop
   
End If
End Sub

Re: ต้องการให้ข้อมูลเปลี่ยนแปลงตาม Combobox

Posted: Thu Sep 11, 2014 11:10 pm
by snasui
:D ค่อย ๆ ถามตอบกันไปครับ

ก่อนที่จะตอบเรื่องเปลี่ยน Code ผมยังไม่ทราบว่าคุณต้องการจะทำอะไร ช่วยลำดับสิ่งที่คุณต้องการมาก่อนเป็นอันดับแรก เช่นเอาค่าใดมาวางใน Object ใด ด้วยเงื่อนไขใด ฯลฯ

Re: ต้องการให้ข้อมูลเปลี่ยนแปลงตาม Combobox

Posted: Fri Sep 12, 2014 12:04 am
by snasui
:D ตัวอย่างการปรับ Code กรณีเปลี่ยนห้อง

Code: Select all

Private Sub cboroom_Change()
    myroom = cboroom.Text
    'If cboroom.Value = "2A" Then
    On Error Resume Next
    Sheets(Left(cbomonth.Text, 3)).Select
    If Err > 0 Then Exit Sub
    Range("b6").Select
    Do While ActiveCell <> ""
        If myroom = ActiveCell.Value Then
            TextBox1.Text = ActiveCell.Offset(0, 1).Value
            TextBox6.Text = ActiveCell.Offset(0, 2).Value
            TextBox2.Text = ActiveCell.Offset(0, 3).Value
            TextBox7.Text = ActiveCell.Offset(0, 4).Value
            TextBox4.Text = ActiveCell.Offset(0, 5).Value
            TextBox8.Text = ActiveCell.Offset(0, 6).Value
            TextBox9.Text = ActiveCell.Offset(0, 7).Value
            TextBox10.Text = ActiveCell.Offset(0, 8).Value
            TextBox12.Text = ActiveCell.Offset(0, 9).Value
            TextBox11.Text = ActiveCell.Offset(0, 10).Value
            TextBox13.Text = ActiveCell.Offset(0, 11).Value
            Exit Do
        End If
        ActiveCell.Offset(1, 0).Select
    Loop
    'End If
End Sub

Re: ต้องการให้ข้อมูลเปลี่ยนแปลงตาม Combobox

Posted: Sun Sep 14, 2014 7:32 pm
by akekorn
ขอบคณมากครับหากมีปัญหาเพิ่มเติมจะรบกวนอีกครับผม

Re: ต้องการให้ข้อมูลเปลี่ยนแปลงตาม Combobox

Posted: Tue Sep 16, 2014 12:06 am
by bank9597
:D อีกวิธีที่อยากเสนอแนะครับ

ลองสร้างชีท temp ขึ้นมา แล้วใส่สูตรเพื่อดึกค่าที่ต้องการมาวางก่อน จากนั้นค่อยดึงขึ้นโชว์บน Userform ครับ

ตัวอย่างโค๊ด

Code: Select all

Private Sub cbomonth_AfterUpdate()
            Dim shTemp As Worksheet
            Set shTemp = Worksheets("shTemp")
            shTemp.Range("B1") = Null
            shTemp.Range("A1") = Me.cbomonth
End Sub

Code: Select all

Private Sub cboroom_Change()
            Dim shTemp As Worksheet
            Set shTemp = Worksheets("shTemp")
            
            If IsNull(Me.cbomonth) Then
                    MsgBox "Please Input Month", vbCritical
            Else
                    shTemp.Range("B1") = Me.cboroom
                    Me.TextBox1 = shTemp.Range("A3")
                    Me.TextBox6 = shTemp.Range("B3")
                    Me.TextBox2 = shTemp.Range("C3")
                    Me.TextBox7 = shTemp.Range("D3")
                    Me.TextBox4 = shTemp.Range("E3")
                    Me.TextBox8 = shTemp.Range("F3")
                    Me.TextBox9 = shTemp.Range("G3")
                    Me.TextBox10 = shTemp.Range("H3")
                    Me.TextBox12 = shTemp.Range("I3")
                    Me.TextBox11 = shTemp.Range("J3")
                    Me.TextBox13 = shTemp.Range("K3")

            End If
End Sub
ด้วยวิธีการนี้จะทำให้เขียนโค๊ดได้ง่ายขึ้น แต่จะเขียนสูตรยากแทน :mrgreen:
กรณีมีความามารถด้านการใช้สูตรอยู่แล้ว ก็จะพอช่วยได้ ในกรณีที่ไม่เก่ง VBA ครับ