Page 1 of 2
รบกวนสอบถามการเขียน code ใน combobox
Posted: Wed May 22, 2013 11:51 am
by natthaporn
ดิฉันได้ทดลองเขียน code ใน combobox ดังนี้คะ
Code: Select all
Private Sub DIVComboBox_Change()
If DIVComboBox.Value = "JAN" Then
Range.("B5:F20").Value ="=Formula1"
End If
If DIVComboBox.Value = "Feb" Then
Range.("B5:F20").Value ="=Formula2"
End If
ดิฉันได้สร้าง combobox ขี้น และให้ ListFillRange = Jan, Feb, Mar,... โดยมีเงื่อนไขว่า
ถ้าเลือกเดือน Jan ที่ cobobox ให้ cell B5:F20 แสดงสุูตร =Formula1
ถ้าเลือกเดือน Feb ที่ cobobox ให้ cell B5:F20 แสดงสุูตร =Formula2
ซึ่งตาม code ดังกล่าวข้างต้นจะเกิด error บรรทัดที่ 2 คะ นอกจาก data validation แล้ว ดิฉันอยากจะศึกษาและทดลองใช้ cobobox บ้างคะ รบกวนท่านผู้รู้แนะนำด้วยคะ ขอบคุณ
Re: รบกวนสอบถามการเขียน code ใน combobox
Posted: Wed May 22, 2013 1:51 pm
by snasui

จาก Code
Range.("B5:F20").Value ="=Formula1" ควรจะเป็น
Range("B5:F20").Value ="=Formula1" จะ
ไม่ใส่จุดเข้าไปด้วยระหว่างคำว่า
Range กับ ช่วงข้อมูลครับ
Re: รบกวนสอบถามการเขียน code ใน combobox
Posted: Wed May 22, 2013 2:57 pm
by natthaporn
run แล้วคะ ดิฉันตาลายไปเองคะ เลยมองไม่เห็นจุดคะ ถ้าอาจารย์จะกรุณาดิฉันจะขอรบกวนอาจารย์เพิ่มเติมว่าจะย่อสูตรนี้อย่างไรคะ เพราะจริง ๆ แล้วดิฉันต้องสร้างสูตรในทำนองเดียวกัน หลาย sheet มากคะ
If DIVComboBox.Value = "Jan" Then
Range("B5:F20").Value ="=Formula1"
End If
If DIVComboBox.Value = "Feb" Then
Range("B5:F20").Value ="=Formula2"
End If
If DIVComboBox.Value = "Mar" Then
Range("B5:F20").Value ="=Formula3"
End If
If DIVComboBox.Value = "Apr" Then
Range("B5:F20").Value ="=Formula4"
End If
If DIVComboBox.Value = "May" Then
Range("B5:F20").Value ="=Formula5"
End If
If DIVComboBox.Value = "Jun" Then
Range("B5:F20").Value ="=Formula6"
End If
If DIVComboBox.Value = "Jul" Then
Range("B5:F20").Value ="=Formula7"
End If
If DIVComboBox.Value = "Aug" Then
Range("B5:F20").Value ="=Formula8"
End If
If DIVComboBox.Value = "Sep" Then
Range("B5:F20").Value ="=Formula9"
End If
If DIVComboBox.Value = "Oct" Then
Range("B5:F20").Value ="=Formula10"
End If
If DIVComboBox.Value = "Nov" Then
Range("B5:F20").Value ="=Formula11"
End If
If DIVComboBox.Value = "Dec" Then
Range("B5:F20").Value ="=Formula12"
End If
ดิฉันลองเริ่มต้น code ตามนี้ หลังจากนั้นก็ไปไม่ได้แล้วคะ
Dim i As Integer
Select Case DIVComboBox.Value
Case "Jan": i = 0
Case "Feb": i = 1
Case "Mar": i = 2
Case "Apr": i = 3
Case "May": i = 4
Case "Jun": i = 5
Case "Jul": i = 6
Case "Aug": i = 7
Case "Sep": i = 8
Case "Oct": i = 9
Case "Nov": i = 10
Case "Dec": i = 11
End Select
Re: รบกวนสอบถามการเขียน code ใน combobox
Posted: Wed May 22, 2013 3:10 pm
by snasui

ควรแนบไฟล์ตัวอย่างมาด้วยและชี้ให้เห็นว่าสร้างสูตรเดียวกันหลายชีทเป็นอย่างไร จะได้เข้าใจตรงกันครับ
Re: รบกวนสอบถามการเขียน code ใน combobox
Posted: Wed May 22, 2013 4:52 pm
by natthaporn
ขอเรียนอาจารย์ว่า file ตัวอย่างที่ดิฉันส่งมาข้อมูลของ case อาจจะต่างจากโจทย์ที่ดิฉันสมมุติไป ซึ่ง file จริงมีข้อมูลเยอะมากและดิฉันสร้าง range name ไว้เต็มไปหมด ดิฉันจึ่งส่ง file ตัวอย่างมาแทนคะ
ส่วนเงื่อนไขมีดังนี้คะ
เงื่อนไขของ sheet 1
ถ้า filter เลือก COMA ให้ Target1 = Formula1
ถ้า filter เลือก COMB ให้ Target1 = Formula2
ถ้า filter เลือก COMC ให้ Target1 = Formula3
ถ้า filter เลือก COMD ให้ Target1 = Formula4
ถ้า filter เลือก COME ให้ Target1 = Formula5
เงื่อนไขของ sheet 2
ถ้า filter เลือก COMA ให้ Target2 = Formula6
ถ้า filter เลือก COMB ให้ Target2 = Formula7
ถ้า filter เลือก COMC ให้ Target2 = Formula8
ถ้า filter เลือก COMD ให้ Target2 = Formula9
ถ้า filter เลือก COME ให้ Target2 = Formula10
หมายเหตุ ข้อมูลจริงมีหลาย sheet และมี range ของ Tartget ต่างกันออกไปคะ
Re: รบกวนสอบถามการเขียน code ใน combobox
Posted: Wed May 22, 2013 5:36 pm
by snasui

ไฟล์ตัวอย่างก็คือตัวอย่าง ข้อมูลไม่ควรเท่าข้อมูลจริง แต่จะต้องเป็นตัวแทนข้อมูลจริงได้ เดิมมี Code อะไรก็ควรมี Code นั้น ช่วยแนบ Code ทีจำเป็นมาให้ครบถ้วนด้วยครับ
Re: รบกวนสอบถามการเขียน code ใน combobox
Posted: Wed May 22, 2013 7:09 pm
by natthaporn
ต้องขอโทษด้วยคะ ดิฉันได้แนบ file มาให้ใหม่แล้วคะ และดิฉันมีอีก 1 ประเด็นที่จะสอบถามอาจารย์คือ ตรง filter เลือกข้อมูล list ที่ออกมาไม่ครบตามที่เลือกไว้คะ
ขอบคุณคะ
Re: รบกวนสอบถามการเขียน code ใน combobox
Posted: Wed May 22, 2013 8:48 pm
by snasui

ลองนำ Code นี้ไปปรับใช้ครับ
Code: Select all
Private Sub DIVCombobox_Change()
With Range("Target1")
Select Case DIVCombobox.Text
Case "COMA": .Value = "=Formula1"
Case "COMB": .Value = "=Formula2"
Case "COMC": .Value = "=Formula3"
Case "COMD": .Value = "=Formula4"
Case "COME": .Value = "=Formula5"
Case "COMF": .Value = "=Formula6"
Case "COMG": .Value = "=Formula7"
Case "COMH": .Value = "=Formula8"
Case "COMI": .Value = "=Formula9"
Case "COMJ": .Value = "=Formula10"
Case "COMK": .Value = "=Formula11"
Case "COML": .Value = "=Formula12"
Case "COMM": .Value = "=Formula13"
Case "COMN": .Value = "=Formula14"
Case "COMO": .Value = "=Formula14"
Case "COMP": .Value = "=Formula16"
Case "COMQ": .Value = "=Formula17"
Case "COMR": .Value = "=Formula18"
Case "COMS": .Value = "=Formula19"
Case "COMT": .Value = "=Formula20"
Case "COMU": .Value = "=Formula21"
End Select
End With
End Sub
ส่วนข้อมูลที่ List ไม่ครบก็แสดงว่ากำหนดให้แสดงใน Combobox ไม่ครบครับ หากไม่ใช่ช่วยให้รายละเอียดมาใหม่ว่า List ไม่ครบหมายถึง List ที่ไหน อย่างไร
ที่จริงแล้ว Code ที่เขียนไว้เดิมหากไม่มีปัญหาก็ไม่จำเป็นต้องปรับ กรณีต้องใช้หลายชีทก็สามารถ Copy ไปได้ทุกชีทแล้วค่อย Replace เงื่อนไขเป็นของแต่ละชีท
Re: รบกวนสอบถามการเขียน code ใน combobox
Posted: Wed May 22, 2013 11:06 pm
by natthaporn
ขอเรียนอาจาย์เพิ่มเติมว่าจริง ๆ ยังมี sheet ที่เป็น raw data อยู่อีกหลาย sheet ตามจำนวนข้อมูลที่อยู่ใน drop down list ของ DIVcombobox
ชึ่งแต่เดิมนั้นดิฉันใช้สูตรเพื่อดึงข้อมูลแต่เนื่องจากข้อมูลมีจำนวนหลายพัน row ทำให้ process ในการทำงานช้ามาก ยิ่งเวลาเอา file ไปวางไว้ที่
ส่วนกลางซึ่งเป็น share drive ของบริษัทยิ่งช้ามากขึ้นไปอีก
ดิฉันมีรายงานที่เป็นลักษณะนี้เป็นจำนวนมาก เลยพยายามศึกษาเรื่องการเขียน cobe VBA เข้าไปศึกษาดูกระทู้ต่าง ๆ ที่เกี่ยวกับ VBA ซึ่งก็ไม่ค่อย
เข้าใจเลยเพราะไม่ใช่โจทย์หรือข้อมูลของเราเอง ดิฉันอยากจะขอรบกวนคำแนะนำอาจารย์ตั้งนานแล้วแต่ก็ยังไม่กล้า เพราะตัวเองยังไม่มีความรู้ขั้นพื้นฐาน
ที่เพียงพอ เพราะส่วนใหญ่เรื่องที่ถามอาจารย์ก็เป็นเรื่องของการรับส่งข้อมูลแบบ paste copy value ประมาณนั้นคะ
จาก file นี้ ดิฉันต้องการดึงของมูลจาก sheet ต่างๆ ที่เลือกตาม drop down list ของ DIVcombobox และ Mcombobox มาไว้ที่ sheet "Report"
โดยมีเงื่อนไขดังนี้คะ
ที่ sheet "Report" ถ้า DIVcombobox = COMA และ Mcombobox = JAN
ให้เอาข้อมูลใน column B ใน sheet "Report" เช็คข้อมูลของ column B ใน sheet "COMA" และ
ให้เอาข้อมูลใน column A:M ใน sheet "Report" เช็คข้อมูลของ column N ใน sheet "COMA" และ
ถ้ามีจุดตัดใดที่ตรงกันให้ดึงของมูลจาก colum Z มาวางไว้ให้ตรงตามจุดตัดนั้น ๆ
หรือถ้า
ที่ sheet "Report" ถ้า DIVcombobox = COMB และ Mcombobox = JAN
ให้เอาข้อมูลใน column B ใน sheet "Report" เช็คข้อมูลของ column B ใน sheet "COMB" และ
ให้เอาข้อมูลใน column A:M ใน sheet "Report" เช็คข้อมูลของ column N ใน sheet "COMB" และ
ถ้ามีจุดตัดใดที่ตรงกันให้ดึงของมูลจาก colum Z มาวางไว้ให้ตรงตามจุดตัดนั้น ๆ
หรือถ้า
ที่ sheet "Report" ถ้า DIVcombobox = COMC และ Mcombobox = JAN
ให้เอาข้อมูลใน column B ใน sheet "Report" เช็คข้อมูลของ column B ใน sheet "COMC" และ
ให้เอาข้อมูลใน column A:M ใน sheet "Report" เช็คข้อมูลของ column N ใน sheet "COMC" และ
ถ้ามีจุดตัดใดที่ตรงกันให้ดึงของมูลจาก colum Z มาวางไว้ให้ตรงตามจุดตัดนั้น ๆ
ดิฉันขออนุญาตใส่ข้อมูลเพียงแต่ 3 sheet เท่านั้นนะคะ เพราะจริง ๆ แล้ว data มีประมาณ 20 sheet คะ 0จาก code เดิมเป็นการดึงข้อมูลโดยใช้สูตร ซึงดิฉันอยากจะขอคำแนะนำจากอาจารย์ ถ้าจะเปลี่ยนมาเป็นการดึงข้อมูลโดยใช้ code เข้ามาช่วยแทนคะ
ขอบคุณคะ
Re: รบกวนสอบถามการเขียน code ใน combobox
Posted: Thu May 23, 2013 11:55 am
by snasui

จากไฟล์ที่แนบมาช่วยอธิบายว่า เซลล์ C7 ในชีท Report มีค่าเป็น 5 มีหลักการได้มาของข้อมูลอย่างไรครับ
Re: รบกวนสอบถามการเขียน code ใน combobox
Posted: Thu May 23, 2013 3:07 pm
by natthaporn
จะเห็นได้ว่าจุดตัดที่ C7 ในชีท Report มีค่าเป็น 5 เกิดจาก B7 = ccc ตัดกับ C4 = A ซึ่งเกิดจาก
1. การเลือก DIVcombobox = COMA
2. การเลือก Mcombobox = Jan
ความหมายก็คือให้เลือกข้อมูลจาก sheet "COMA" ที่เดือน Jan ในที่นี้ก็คือ column "B,N,Z" โดยถ้า
B3:B50 มีค่า = ccc และ N3:N50 มีค่า = A ให้นำตัวเลขที่่ Z3:Z50 มารวมกัน แล้วส่งค่ากลับไปที่ sheet "Report" ที่มีจุดตัดจุดเดียวกัน ในที่นี้ก็คือ B7 ตัดกับ C4
ดิฉันไม่แน่ใจว่าอธิบายครบหรือเปล่าคะ เพราะดิฉันยังไม่ค่อยเก่งเรื่องการอธิบายที่จะสื่อถึงเรื่องการเขียน code คะ
ขอบคุณคะ
Re: รบกวนสอบถามการเขียน code ใน combobox
Posted: Thu May 23, 2013 4:53 pm
by snasui

การทำเช่นนั้นสามารถใช้สูตรมาช่วยได้ครับ
โดยกำหนดค่าให้กับ ComboBox Control ที่ B3, D3 โดยให้ Link ค่าไปที่ B1, D1 จากนั้นใช้สูตรเพื่อให้แสดงผลลัพธ์ตามค่าใน ComboBox ที่ A1, C1 ตามลำดับ
จากนั้นที่ A5 เขียนสูตร
Code: Select all
=SUMIFS(INDEX(INDIRECT("'"&$A$1&"'!Z3:AK1000"),0,MATCH($C$1,INDIRECT("'"&$A$1&"'!Z2:AK2"),0)),INDEX(INDIRECT("'"&$A$1&"'!B3:M1000"),0,MATCH($C$1,INDIRECT("'"&$A$1&"'!B2:M2"),0)),$B5,INDEX(INDIRECT("'"&$A$1&"'!N3:Y1000"),0,MATCH($C$1,INDIRECT("'"&$A$1&"'!N2:Y2"),0)),C$4)
Enter > Copy ไปยังเซลล์ที่เกี่ยวข้อง ดูตัวอย่างตามไฟล์แนบครับ
Re: รบกวนสอบถามการเขียน code ใน combobox
Posted: Thu May 23, 2013 7:00 pm
by natthaporn
ได้ผลลัพธ์ตามที่ต้องการแล้วคะ ดิฉันจะลองนำไปปรับใฃ้กับ file จริงดูว่า process ของการทำงานเร็วกว่าเดิมหรือไม่ อย่างไรก็ตามจะแจ้งผลกับอาจารย์อีกครั้งหนึ่งคะ
ขอบขอบคุณมากคะ
Re: รบกวนสอบถามการเขียน code ใน combobox
Posted: Thu May 23, 2013 11:56 pm
by natthaporn
อาจารย์คะ ดิฉันได้นำสูตรที่อาจารย์แนะนำไปใช้กับ file จริง ปรากฎว่า process ในการทำงานยังใช้เวลานานเหมือนเดิมคะ ดิฉันลองจับเวลาดูใช้เวลาประมาณ 5-6 นาที เพราะดิฉันได้เขียน code เพิ่มเข้าไปว่าเมื่อทำการเลือกเงือนไขแล้ว ให้ข้อมูลใน sheet "Report" copy paste value ไม่เช่นนั้นถ้ามีการเปลี่ยนแปลงแก้ไขข้อมูลใน sheet ที่เป็น data คือ sheet "COMA" , COMB, .... จะทำให้สูตรใน sheet "Report" วิ่งอยู่ตลอดเวลา
และอีกหนึ่งอย่างที่ดิฉํนคิดว่าทำให้ process ในการทำงานใช้เวลานานมาก เพราะ sheet "Report" มีจำนวน row ประมาณ 2500 row และ column ประมาณ 130 column
จริงแล้ว sheet "Report" เป็น sheet สำหรับคัดกรอกข้อมูลที่มาจาก sheet "COMA" , COMB, ....ซึ่งเป็น raw data ที่ download มาอีกที่หนึ่ง เพื่อที่จะเตรียมไว้เป็น data สำหรับดึงไปใช้งานอื่นต่อไปคะ
ถ้านำ code vba มาใช้ดึงข้อมูลแทนการใช้สูตรจะเร็วกว่าหรือเปล่าคะ ดิฉันขอคำแนะนำจากอาจารย์ด้วยคะ
ขอบคุณคะ
Re: รบกวนสอบถามการเขียน code ใน combobox
Posted: Fri May 24, 2013 12:25 am
by snasui
natthaporn wrote:ถ้านำ code vba มาใช้ดึงข้อมูลแทนการใช้สูตรจะเร็วกว่าหรือเปล่าคะ ดิฉันขอคำแนะนำจากอาจารย์ด้วยคะ

หากข้อมูลไม่เป็น Database ตามที่ถามมานี้โอกาสที่จะใช้ VBA แล้วเร็วเท่า Sumifs ยากมาก ไม่ต้องพูดถึงเร็วกว่าครับ
ข้อมูลที่จะนำมาทำรายงานควรจะเป็น Database คือเรียงลงไปด้านล่างเรื่อย ๆ ไม่ใช่เก็บเป็นชีท ๆ เมื่อเป็น Database เราสามารถใช้ PivotTable เข้ามาช่วยในการสรุปข้อมูลได้ในมิติต่าง ๆ ตามต้องการ
หากต้องการที่จะให้สูตรทำงานเร็วขึ้น ให้ใช้ VBA ช่วยในการเขียนสูตรโดยตัด Indirect ออกไปแล้วใช้ A1 เป็นตัวแปรในการให้ชื่อชีทในสูตรแทน เนื่องจาก Indirect เป็น Volatile Function ซึ่งถูกกระทบให้เปลี่ยนแปลงได้โดยง่าย แม้แค่เปลี่ยนความกว้างเซลล์ก็เกิดการคำนวณทุกครั้ง
Re: รบกวนสอบถามการเขียน code ใน combobox
Posted: Fri May 24, 2013 9:58 am
by natthaporn
ดิฉันขอขอบคุณอาจารย์มากคะ ที่ให้ความรู้เพิ่่มเติม ถ้าดิฉันทดลองใช้วิธีที่อาจารย์แนะนำคือ ใช้ VBA ช่วยในการเขียนสูตรโดยตัด Indirect ออกไปแล้วใช้ A1 เป็นตัวแปรในการให้ชื่อชีทในสูตรแทน อาจารย์พอจะช่วยแนะนำการเขียน code สำหรับวิธีการนี้ได้ไหมคะ อยากได้เป็นความรู้เพิ่มเติมจริงคะ ดิฉันจะได้นำไปประยุกต์ใช้กับ file อื่น ๆ เพราะดิฉันมี file ที่ต้องดึงข้อมูลแบบนี้เป็นร้อย file เลยคะ
ขอบคุณคะ
Re: รบกวนสอบถามการเขียน code ใน combobox
Posted: Fri May 24, 2013 10:28 am
by snasui

สำหรับ VBA แล้วต้องพยายามเขียนมาเอง ติดแล้วค่อยถามกันครับ
เพื่อความคุ้นเคยลองบันทึก Macro สำหรับการเขียนสูตร แล้วดูว่าได้ Code มาเป็นเช่นไร จากนั้นค่อยปรับใช้ครับ
Re: รบกวนสอบถามการเขียน code ใน combobox
Posted: Fri May 24, 2013 3:44 pm
by natthaporn
อาจารย์ดิฉันลองปรับสูตร และลองเขียน code ใหม่ (สุดความสามารถที่มีอยู่ในตอนนี้คะ) แต่ run แลัว error คะ
Code: Select all
Private Sub ComboBox2_Change()
With Range("Target1")
Select Case ComboBox2.Text
Case "COMA": .Value = "=SUMIFS(INDEX(COMA!R3C26:R23C37,0,MATCH(combobox1.value,COMA!R2C26:R2C37,0)),INDEX(COMA!R3C2:R23C13,0,MATCH(combobox1.value,COMA!R2C2:R2C13,0)),REPORT!RC2,INDEX(COMA!R3C14:R23C25,0,MATCH(combobox1.value,COMA!R2C14:R2C25,0)),REPORT!R4C)"
Case "COMB": .Value = "=SUMIFS(INDEX(COMB!R3C26:R23C37,0,MATCH(combobox1.value,COMB!R2C26:R2C37,0)),INDEX(COMB!R3C2:R23C13,0,MATCH(combobox1.value,COMB!R2C2:R2C13,0)),REPORT!RC2,INDEX(COMB!R3C14:R23C25,0,MATCH(combobox1.value,COMB!R2C14:R2C25,0)),REPORT!R4C)"
Case "COMC": .Value = "=SUMIFS(INDEX(COMC!R3C26:R23C37,0,MATCH(combobox1.value,COMC!R2C26:R2C37,0)),INDEX(COMC!R3C2:R23C13,0,MATCH(combobox1.value,COMA!R2C2:R2C13,0)),REPORT!RC2,INDEX(COMC!R3C14:R23C25,0,MATCH(combobox1.value,COMC!R2C14:R2C25,0)),REPORT!R4C)"
End Select
End With
ActiveSheet.Range("Target1").Copy
ActiveSheet.Range("C5").PasteSpecial xlPasteValues
Application.CutCopyMode = False
ActiveSheet.Range("C5").Select
End Sub
รบกวนอาจารย์แนะนำด้วยคะ
Re: รบกวนสอบถามการเขียน code ใน combobox
Posted: Fri May 24, 2013 5:26 pm
by yodpao.b

ทั้งอ่านทั้งทำตามแล้วยัง งง อยู่เลย ยอม

อาจารย์ครับขอถามอะไรหน่อย

- รูป
- untitled11.GIF (22.34 KiB) Viewed 514 times
จากรูปด้านบน
ผมสงสัยว่า Combobox ที่วงไว้ทำไมเมื่อดลิ๊กแล้ว จึงมีข้อความขึ้น
ทั้งทั้งทีไม่เห็นมี Code เลย
Re: รบกวนสอบถามการเขียน code ใน combobox
Posted: Fri May 24, 2013 6:04 pm
by snasui
natthaporn wrote:รบกวนอาจารย์แนะนำด้วยคะ

ดูตัวอย่างการปรับ Code ตามด้านล่างครับ
Code: Select all
Private Sub ComboBox2_Change()
Dim sh As String, mth As String, fml As String
Application.Calculation = xlCalculationManual
With ActiveSheet
sh = .ComboBox2
mth = .ComboBox1
fml = "=SUMIFS(INDEX('" & sh & "'!$Z$3:$AK$27,0,"
fml = fml & "MATCH(" & Chr(34) & mth & Chr(34) & ",'" & sh & "'!$Z$2:$AK$2,0)),"
fml = fml & "INDEX('" & sh & "'!$B$3:$M$27,0,"
fml = fml & "MATCH(" & Chr(34) & mth & Chr(34) & ",'" & sh & "'!$B$2:$M$2,0)),$B5,"
fml = fml & "INDEX('" & sh & "'!$N$3:$Y$27,0,"
fml = fml & "MATCH(" & Chr(34) & mth & Chr(34) & ",'" & sh & "'!$N$2:$Y$2,0)),C$4)"
.Range("C5").Formula = fml
.Range("C5").Copy
.Range("C5:M16").PasteSpecial xlPasteFormulas
Application.Calculation = xlCalculationAutomatic
.Range("C5:M16") = .Range("C5:M16").Value
End With
End Sub