:D snasui.com ยินดีต้อนรับ :D
ยินดีต้อนรับสู่กระดานถามตอบ Excel and VBA และอื่น ๆ ที่เป็นมิตรกับทุกท่าน มีไฟล์แนบมหาศาล ช่วยให้ท่านค้นหาและติดตามศึกษาได้โดยง่าย :thup: สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ :arrow: ระบุ Version ของ Excel
:!: โปรดทราบ :!:
  1. กรุณาอ่านกฎการใช้บอร์ด (Forum rules) ในตำแหน่งด้านบนของแต่ละบอร์ด
  2. การสมัครสมาชิก การ Login การกู้คืนรหัสผ่าน
    1. สมัครสมาชิกดูขั้นตอนได้ที่ :arrow: สมัครสมาชิก
    2. Login เข้าระบบโดยคลิกปุ่ม Login ตรงมุมขวาบนของหน้านี้ :roll:
    3. การ Login ผ่าน Facebook ดูวิธีที่ :arrow: Login ผ่าน Facebook
    4. ลืมรหัสผ่านสามารถรับรหัสใหม่ได้ที่ :arrow: Reset รหัสผ่าน
  3. มีปัญหาการใช้งาน แจ้งผู้ดูแลระบบได้ที่ :arrow: ติดต่อผู้ดูแลระบบ
  4. กำหนดการตั้งค่าส่วนตัว เช่นตั้งค่าภาษาเป็นไทยหรืออังกฤษดูได้ที่ :arrow: ตั้งค่าส่วนตัว
  5. การตั้งและตอบกระทู้ดูได้ที่ :arrow: วิธีการตั้งและตอบกระทู้
  6. การจัดรูปแบบตัวอักษรด้วย bbcode ในช่องแสดงความคิดเห็นดูได้ที่ :arrow: จัดรูปแบบตัวอักษร
  7. กำหนดขนาดตัวอักษรใน Browser ดูได้ที่ :arrow: กำหนดขนาดตัวอักษรใน Browser

รบกวนสอบถามการเขียน code ใน combobox

ฟอรัมถาม-ตอบปัญหาการใช้งาน Macro และ VBA
Forum rules
  1. ไม่อนุญาตให้ใช้ภาษาแชทในการถามและตอบปัญหา ไม่ใช้คำว่า "คับ" หรือ "อ่ะครับ" แทนคำว่า "ครับ" ไม่ใช้คำว่า "เด๋ว" แทนคำว่า "เดี๋ยว" เป็นต้น เนื่องจากเมื่อแปลเป็นภาษาต่างประเทศแล้วจะให้ความหมายผิดไปจากที่ควรจะเป็น
  2. ห้ามถามโดยระบุชื่อผู้ตอบและต้องตั้งชื่อกระทู้ให้สื่อถึงปัญหาที่จะถาม ไม่ตั้งชื่อว่า ช่วยด้วยครับ, มีปัญหามาปรึกษาครับ เป็นต้น
  3. กรุณาอธิบายปัญหาและระบุคำตอบที่ต้องการมาในกระทู้ด้วยเสมอถึงแม้จะอธิบายไว้ในไฟล์แนบแล้วก็ตาม ทั้งนี้เพื่ออำนวยความสะดวกแก่เพื่อนสมาชิกในการค้นหาข้อมูล
  4. กรุณาแนบไฟล์ตัวอย่างพร้อมแสดงคำตอบที่ถูกต้องมาในไฟล์ด้วยเพื่อให้ง่ายต่อการทำความเข้าใจและสะดวกต่อการตอบคำถาม (ขนาดไฟล์ไม่เกิน 500Kb ขนาดภาพไม่เกิน 800*600 Pixel) ไม่แนบเป็น Link มาจากแหล่งอื่นที่อาจจะถูกลบทิ้งไปโดยต้นทางในภายหลัง นอกจากนี้ไม่ควรแนบไฟล์ที่มีข้อมูลสำคัญอันก่อให้เกิดความเสียหายกับตนเองและผู้อื่น
  5. กรณีเป็นคำถามเกี่ยวกับ Programming เช่น VBA, VB.Net, C#, SQL ฯลฯ ต้องลองเขียนมาเองก่อนเสมอ ถามเฉพาะที่ติดปัญหา ระบุ Module, Procedure ที่ติดปัญหาให้ชัดเจน กรุณาโพสต์ Code ให้แสดงเป็น Code คือเปิดด้วย [code] และปิดด้วย [/code] ตัวอย่างเช่น [code]dim r as range[/code] เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)
  6. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
natthaporn
Member
Member
Posts: 187
Joined: Sun Jul 15, 2012 10:54 pm

รบกวนสอบถามการเขียน code ใน combobox

#1

Post 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 บ้างคะ รบกวนท่านผู้รู้แนะนำด้วยคะ ขอบคุณ
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: รบกวนสอบถามการเขียน code ใน combobox

#2

Post by snasui »

:D จาก Code Range.("B5:F20").Value ="=Formula1" ควรจะเป็น Range("B5:F20").Value ="=Formula1" จะไม่ใส่จุดเข้าไปด้วยระหว่างคำว่า Range กับ ช่วงข้อมูลครับ
natthaporn
Member
Member
Posts: 187
Joined: Sun Jul 15, 2012 10:54 pm

Re: รบกวนสอบถามการเขียน code ใน combobox

#3

Post 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
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: รบกวนสอบถามการเขียน code ใน combobox

#4

Post by snasui »

:D ควรแนบไฟล์ตัวอย่างมาด้วยและชี้ให้เห็นว่าสร้างสูตรเดียวกันหลายชีทเป็นอย่างไร จะได้เข้าใจตรงกันครับ
natthaporn
Member
Member
Posts: 187
Joined: Sun Jul 15, 2012 10:54 pm

Re: รบกวนสอบถามการเขียน code ใน combobox

#5

Post 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 ต่างกันออกไปคะ
Attachments
Code VBA-Combobox.xlsm
(26.22 KiB) Downloaded 44 times
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: รบกวนสอบถามการเขียน code ใน combobox

#6

Post by snasui »

:D ไฟล์ตัวอย่างก็คือตัวอย่าง ข้อมูลไม่ควรเท่าข้อมูลจริง แต่จะต้องเป็นตัวแทนข้อมูลจริงได้ เดิมมี Code อะไรก็ควรมี Code นั้น ช่วยแนบ Code ทีจำเป็นมาให้ครบถ้วนด้วยครับ
natthaporn
Member
Member
Posts: 187
Joined: Sun Jul 15, 2012 10:54 pm

Re: รบกวนสอบถามการเขียน code ใน combobox

#7

Post by natthaporn »

ต้องขอโทษด้วยคะ ดิฉันได้แนบ file มาให้ใหม่แล้วคะ และดิฉันมีอีก 1 ประเด็นที่จะสอบถามอาจารย์คือ ตรง filter เลือกข้อมูล list ที่ออกมาไม่ครบตามที่เลือกไว้คะ

ขอบคุณคะ
Attachments
Code VBA-Combobox.xlsm
(30.64 KiB) Downloaded 37 times
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: รบกวนสอบถามการเขียน code ใน combobox

#8

Post by snasui »

:D ลองนำ 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 เงื่อนไขเป็นของแต่ละชีท
natthaporn
Member
Member
Posts: 187
Joined: Sun Jul 15, 2012 10:54 pm

Re: รบกวนสอบถามการเขียน code ใน combobox

#9

Post 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 เข้ามาช่วยแทนคะ

ขอบคุณคะ
Attachments
Code VBA-Combobox3.xlsm
(35.01 KiB) Downloaded 29 times
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: รบกวนสอบถามการเขียน code ใน combobox

#10

Post by snasui »

:D จากไฟล์ที่แนบมาช่วยอธิบายว่า เซลล์ C7 ในชีท Report มีค่าเป็น 5 มีหลักการได้มาของข้อมูลอย่างไรครับ
natthaporn
Member
Member
Posts: 187
Joined: Sun Jul 15, 2012 10:54 pm

Re: รบกวนสอบถามการเขียน code ใน combobox

#11

Post 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 คะ

ขอบคุณคะ
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: รบกวนสอบถามการเขียน code ใน combobox

#12

Post by snasui »

:D การทำเช่นนั้นสามารถใช้สูตรมาช่วยได้ครับ

โดยกำหนดค่าให้กับ 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 ไปยังเซลล์ที่เกี่ยวข้อง ดูตัวอย่างตามไฟล์แนบครับ
Attachments
Code VBA-Combobox3.xlsm
(35.62 KiB) Downloaded 36 times
natthaporn
Member
Member
Posts: 187
Joined: Sun Jul 15, 2012 10:54 pm

Re: รบกวนสอบถามการเขียน code ใน combobox

#13

Post by natthaporn »

ได้ผลลัพธ์ตามที่ต้องการแล้วคะ ดิฉันจะลองนำไปปรับใฃ้กับ file จริงดูว่า process ของการทำงานเร็วกว่าเดิมหรือไม่ อย่างไรก็ตามจะแจ้งผลกับอาจารย์อีกครั้งหนึ่งคะ
ขอบขอบคุณมากคะ
natthaporn
Member
Member
Posts: 187
Joined: Sun Jul 15, 2012 10:54 pm

Re: รบกวนสอบถามการเขียน code ใน combobox

#14

Post 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 มาใช้ดึงข้อมูลแทนการใช้สูตรจะเร็วกว่าหรือเปล่าคะ ดิฉันขอคำแนะนำจากอาจารย์ด้วยคะ
ขอบคุณคะ
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: รบกวนสอบถามการเขียน code ใน combobox

#15

Post by snasui »

natthaporn wrote:ถ้านำ code vba มาใช้ดึงข้อมูลแทนการใช้สูตรจะเร็วกว่าหรือเปล่าคะ ดิฉันขอคำแนะนำจากอาจารย์ด้วยคะ
:D หากข้อมูลไม่เป็น Database ตามที่ถามมานี้โอกาสที่จะใช้ VBA แล้วเร็วเท่า Sumifs ยากมาก ไม่ต้องพูดถึงเร็วกว่าครับ

ข้อมูลที่จะนำมาทำรายงานควรจะเป็น Database คือเรียงลงไปด้านล่างเรื่อย ๆ ไม่ใช่เก็บเป็นชีท ๆ เมื่อเป็น Database เราสามารถใช้ PivotTable เข้ามาช่วยในการสรุปข้อมูลได้ในมิติต่าง ๆ ตามต้องการ

หากต้องการที่จะให้สูตรทำงานเร็วขึ้น ให้ใช้ VBA ช่วยในการเขียนสูตรโดยตัด Indirect ออกไปแล้วใช้ A1 เป็นตัวแปรในการให้ชื่อชีทในสูตรแทน เนื่องจาก Indirect เป็น Volatile Function ซึ่งถูกกระทบให้เปลี่ยนแปลงได้โดยง่าย แม้แค่เปลี่ยนความกว้างเซลล์ก็เกิดการคำนวณทุกครั้ง
natthaporn
Member
Member
Posts: 187
Joined: Sun Jul 15, 2012 10:54 pm

Re: รบกวนสอบถามการเขียน code ใน combobox

#16

Post by natthaporn »

ดิฉันขอขอบคุณอาจารย์มากคะ ที่ให้ความรู้เพิ่่มเติม ถ้าดิฉันทดลองใช้วิธีที่อาจารย์แนะนำคือ ใช้ VBA ช่วยในการเขียนสูตรโดยตัด Indirect ออกไปแล้วใช้ A1 เป็นตัวแปรในการให้ชื่อชีทในสูตรแทน อาจารย์พอจะช่วยแนะนำการเขียน code สำหรับวิธีการนี้ได้ไหมคะ อยากได้เป็นความรู้เพิ่มเติมจริงคะ ดิฉันจะได้นำไปประยุกต์ใช้กับ file อื่น ๆ เพราะดิฉันมี file ที่ต้องดึงข้อมูลแบบนี้เป็นร้อย file เลยคะ

ขอบคุณคะ
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: รบกวนสอบถามการเขียน code ใน combobox

#17

Post by snasui »

:D สำหรับ VBA แล้วต้องพยายามเขียนมาเอง ติดแล้วค่อยถามกันครับ

เพื่อความคุ้นเคยลองบันทึก Macro สำหรับการเขียนสูตร แล้วดูว่าได้ Code มาเป็นเช่นไร จากนั้นค่อยปรับใช้ครับ
natthaporn
Member
Member
Posts: 187
Joined: Sun Jul 15, 2012 10:54 pm

Re: รบกวนสอบถามการเขียน code ใน combobox

#18

Post 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
รบกวนอาจารย์แนะนำด้วยคะ
Attachments
Code VBA-Combobox6.xlsm
(35.19 KiB) Downloaded 51 times
yodpao.b
Gold
Gold
Posts: 1608
Joined: Tue Jul 19, 2011 2:47 pm
Excel Ver: 2013,excel standard

Re: รบกวนสอบถามการเขียน code ใน combobox

#19

Post by yodpao.b »

:oops: ทั้งอ่านทั้งทำตามแล้วยัง งง อยู่เลย ยอม
:?: อาจารย์ครับขอถามอะไรหน่อย
รูป
รูป
untitled11.GIF (22.34 KiB) Viewed 508 times
จากรูปด้านบน
ผมสงสัยว่า Combobox ที่วงไว้ทำไมเมื่อดลิ๊กแล้ว จึงมีข้อความขึ้น
ทั้งทั้งทีไม่เห็นมี Code เลย
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: รบกวนสอบถามการเขียน code ใน combobox

#20

Post by snasui »

natthaporn wrote:รบกวนอาจารย์แนะนำด้วยคะ
:D ดูตัวอย่างการปรับ 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
Post Reply