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

อ่านแล้วไม่เข้าใจครับ
ในชีท 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

ค่อย ๆ ถามตอบกันไปครับ
ก่อนที่จะตอบเรื่องเปลี่ยน Code ผมยังไม่ทราบว่าคุณต้องการจะทำอะไร ช่วยลำดับสิ่งที่คุณต้องการมาก่อนเป็นอันดับแรก เช่นเอาค่าใดมาวางใน Object ใด ด้วยเงื่อนไขใด ฯลฯ
Re: ต้องการให้ข้อมูลเปลี่ยนแปลงตาม Combobox
Posted: Fri Sep 12, 2014 12:04 am
by snasui

ตัวอย่างการปรับ 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

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