Page 1 of 1

VBA IF OR หลาย Condition

Posted: Thu May 20, 2021 3:11 pm
by a6block5
สวัสดีครับทุกท่าน ผมกำลังฝึกเขียน VBA แต่พยายามเขียนแล้วมันยากกว่า Excel ธรรมดาเยอะมาก อยากขอคำชี้แนะจากพี่ๆทุกท่านในนี้หน่อยครับ

สูตรปกติใน excel

ค่า steelWt แสดงใน column L

Excel:

Code: Select all

IF(OR(D9="Pfizer",D9="Modena",D9="Sputnik-v",D9="Aztrazenegra"),PI()*7850*(E9/1000+2*G9/1000)*G9/1000*F9/1000*J9," #N/A") 


ปัญหาคือ ผมต้องการเขียน VBA , IF OR เหมือน excel ปกติ แต่ผมเขียนแล้วมันขึ้น Error ครับ ไม่แน่ใจจะเขียนยังไงให้มันเช็ค column D ว่าเป็นอะไร จากนั้นก็คำนวณให้ครับ

VBA:

Code: Select all

 Sub SteelWt_Calc()



    If Range("d8") = "Pfizer" or "Modena" or "Sputnik-v or "Sinovac" Then
    
    Range("l8").Value = WorksheetFunction.Pi * (Range("e8").Value / 1000 + 2 * Range("g8").Value / 1000) * (Range("g8").Value / 1000) * 7850 * (Range("f8").Value / 1000) * Range("j8").Value
    
    Else
    Range("l8").Value = WorksheetFunction.Pi * 1
    
      
    End If
End Sub 

Re: VBA IF OR หลาย Condition

Posted: Thu May 20, 2021 3:25 pm
by puriwutpokin
ปรับส่วนนี้ครับ

Code: Select all

If Range("d8") = "Pfizer" Or Range("d8") = "Modena" Or Range("d8") = "Sputnik-v" Or Range("d8") = "Sinovac" Then

Re: VBA IF OR หลาย Condition

Posted: Thu May 20, 2021 3:34 pm
by a6block5
puriwutpokin wrote: Thu May 20, 2021 3:25 pm ปรับส่วนนี้ครับ

Code: Select all

If Range("d8") = "Pfizer" Or Range("d8") = "Modena" Or Range("d8") = "Sputnik-v" Or Range("d8") = "Sinovac" Then
=====================================================================================================
ขอบคุณที่ชี้แนะครับ แต่มันขึ้นแค่แถวเดียว คือ ผมอยากให้เราใส่ค่า Column D เรียงลงมาเรื่อยๆ แล้วให้มันเช็คว่าเป็นประเภทไหน จากนั้นก็คำนวณตามประเภทที่เรากรอกใน coulumn D เหมือนเรากรอก excel แล้วกดลากสูตรลงมาทีเดียว แล้วมันคำนวนให้หนะครับ

คือผมเขียนให้มัน รันค่าเป็น range ไม่เป็นครับ

Code: Select all

 
Sub SteelWt_Calc()

    If Range("d8:d") = "Pfizer" Or Range("d8") = "Modena" Or Range("d8") = "Sputnik-v" Or Range("d8") = "Sinovac" Then
    
    Range("l8:l").Value = WorksheetFunction.Pi * (Range("e8").Value / 1000 + 2 * Range("g8").Value / 1000) * (Range("g8").Value / 1000) * 7850 * (Range("f8").Value / 1000) * Range("j8").Value
    
    Else
    Range("l8:l").Value = WorksheetFunction.Pi * 1
      
    End If
End Sub

Re: VBA IF OR หลาย Condition

Posted: Thu May 20, 2021 3:54 pm
by puriwutpokin
ปรับตามนี้ครับ

Code: Select all

Sub SteelWt_Calc()
Dim i As Integer
For i = 8 To 14
Select Case Cells(i, 4).Value
    Case "Pfizer", "Modena", "Sputnik-v", "Sinovac"
        Cells(i, 12).Value = WorksheetFunction.Pi * (Cells(i, 5).Value / 1000 + 2 * Cells(i, 7).Value / 1000) * _
        (Cells(i, 7).Value / 1000) * 7850 * (Cells(i, 6).Value / 1000) * Cells(i, 10).Value
    Case Else
       Cells(i, 12).Value = WorksheetFunction.Pi * 1
End Select
   Next i
End Sub

Re: VBA IF OR หลาย Condition

Posted: Thu May 20, 2021 5:07 pm
by Bo_ry

Code: Select all

Sub SteelWt_Calc()
With Range("D8", Cells(Rows.Count, 4).End(xlUp))
    .Offset(, 8).Formula = "=PI()*IF(MATCH(D8,{""Pfizer"",""Modena"",""Sputnik-v"",""Aztrazenegra"",""Parcetamol"",""Sinovac""},)>4,1,7850*(E8+2*G8)*G8*F8*J8/10^9)"
    .Value2 = .Value2  'ถ้าจะเอาสูตร ก็ลบบรรทัดนี้ออก
End With
End Sub

Re: VBA IF OR หลาย Condition

Posted: Fri May 21, 2021 2:04 pm
by a6block5
ขอบคุณทั้ง 2 ท่านมากๆครับ ทั้งคุณ puriwutpokin และคุณ Bo_ry สูตรใช้งานได้ดีและให้ความรู้อันเป็นประโยชน์มากเครับ แต่ของคุณ Bo_ry จะตรงกับความต้องการของผมเลยครับ คือ สูตรรันตามแถวที่เราเพิ่มเรื่อยๆ ยังไงก็ของคุณทั้งสองท่านมากๆนะครับที่ช่วยชี้แนะ


มีคำถามเพิ่มเติมครับ ก่อนหน้านี้ผมลองเขียนสูตรตามที่ท่านผู้รู้ในนี้ชี้แนะไปบ้างแล้ว แต่ยังทำไม่ได้ อยากจะขอคำชี้แนะเพิ่มเติม ครับ ตาม sheet excel rev.2 ที่แนบมา

1) Column L : SteelWt_Calc ตาม Code ที่คุณ Bo_ry แนะนำ ถ้าผมต้องการเขียน if or เพิ่มเติม ไปอีก 5-7 เงื่อนไข แล้วใช้สูตรคำนวนเปลี่ยนไปต่างไป ผมสามารถเพิ่มชนิดและเงื่อนไข ภายใต้ " " ได้เลยใช่มั้ยครับ เช่น ถ้านอกเหนือจากชนิดวัคซีนที่มี เป็น ชนิดใหม่ คือ A1, A2, A2 ให้คำนวณเป็น Column E x Column F (Size x Length)

Code: Select all

 
    .Offset(, 8).Formula = "=PI()*IF(MATCH(D8,{""Pfizer"",""Modena"",""Sputnik-v"",""Aztrazenegra"",""Paracetamol"",""Sinovac""},)>4,1,7850*(E8+2*G8)*G8*F8*J8/10^9)"
    .Value2 = .Value2  '???????????? ????????????????
 


2) Code ด้านบนผมไม่เข้าใจตรง หลังวงเล็บ ที่เขียนว่า >4, 1 หมายถึงอะไรครับ ช่วยกรุณาอธิบายเพิ่มเติมจะได้มั้ยครับ

3) .Vaue2 = .Value2 หมายถึงอะไรครับ ส่วนนี้ยัง งง นิดๆครับผม

4) ผมต้องการ Vlookup ค่าใน Column I : MatCode (สีเหลือง) ได้จากการ concat "D" & "K" ไป sheet Unicost เพื่อให้แสดงค่าใน Column L, Column M (สีชมพู) แต่ผมไม่ต้องการให้มี Matcode ใน column I มันเปลืองเนื้อที่ แต่อยากให้ Vlookup มัน lookup ค่า D&K แล้วแสดงผลใน M:N เลย ต้องเขียนสูตรยังไงครับ ตอนนี้ผมทำได้แค่ เขียนสูตรให้มัน concat แล้ว vlookup อีกที

5) คอลัมน์ M:N ทำไม Vlookup แล้วจำนวนแถวมันเกินครับ ที่แสดงเป็น #N/A

ุ6) Column L ถ้าต้องการให้แสดงค่าคำนวณเป็นตัวเลข แต่ซ่อนสูตรคำนวณไม่ให้โชว์ ทำได้มั้ยครับ

7) ถ้าให้มันคำนวนเองเลย โดยที่ไม่ต้องมากด F8 หรือ Button ต้องทำยังไงครับ

VBA IF OR หลาย Condition

Posted: Mon May 24, 2021 2:15 pm
by a6block5
จากกระทู้นี้ https://snasui.com/viewtopic.php?f=3&t=18322

ผมลองทำตามคุณ Puriwatpokin และ คุณ Bo_ry แนะนำ แต่สะดุดและติดตรงสูตรของคุณ Bo_ry

Code: Select all

 Sub SteelWt_Calc()
With Range("D8", Cells(Rows.Count, 4).End(xlUp))
    .Offset(, 8).Formula = "=PI()*IF(MATCH(D8,{""Pfizer"",""Modena"",""Sputnik-v"",""Aztrazenegra"",""Paracetamol"",""Sinovac"",""Aspirin""},)>1,(g8*2),7850*(E8+2*G8)*G8*F8*J8/10^9)"
    .Value2 = .Value2  '???????????? ????????????????
End With
End Sub
ถ้าผมต้องการ If OR หลายเงื่อนไข ตามที่คุณ Bo_ry แนะนำ
1. If D = Pfizer , Pi * 7850*(E8+2*G8)*G8*F8*J8/10^9
2. If D = Modena, Sputnik-v, Aztrazenegra, Paracetamol, Sinivac, Pi * (G8 * 2)

3. If D = Aspirin, Pi() * 10

ผมอยากสร้างเงื่อนไขเพิ่มเติม คล้ายๆ IF OR 2 กรณีแรกผมพอเข้าใจแล้ว แล้วถ้าอยากเพิ่มเงื่อนไข 3, 4 , 5... เหมือน IF OR ผมต้องเพิ่ม คำสั่งยังไงใน VBA ครับ ขอคำชี้แนะพี่ๆทุกท่านด้วยครับ

Re: VBA IF OR หลาย Condition

Posted: Mon May 24, 2021 2:54 pm
by Bo_ry
สำหรับคลิก
Module

Code: Select all

Sub SteelWt_Calc()
With Range("D8", Cells(Rows.Count, 4).End(xlUp))
    .Offset(, 8).Formula = "=PI()*J8*CHOOSE(MATCH(MATCH(D8,{""Pfizer"",""Modena"",""Sputnik-v"",""Aztrazenegra"",""Paracetamol"",""Sinovac"",""Aspirin""},),{0,2,7}),7850*(E8+2*G8)*G8*F8/10^9,G8*2,10)"
    .Offset(, 8).Value2 = .Offset(, 8).Value2
End With
End Sub
สำหรับใส่ค่าที่ Column J
ที่ SHeet Tracking

Code: Select all

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 10 Then
    Target(1, 3).FormulaR1C1 = "=PI()*RC10*CHOOSE(MATCH(MATCH(RC4,{""Pfizer"",""Modena"",""Sputnik-v"",""Aztrazenegra"",""Paracetamol"",""Sinovac"",""Aspirin""},),{0,2,7}),7850*(RC5+2*RC7)*RC7*RC6/10^9,RC7*2,10)"
End If
End Sub
Column P, Q ,R, S ทำสูตรแยกแต่ละส่วนออกมาแล้ว ลองทำความเข้าใจดูนะ

Re: VBA IF OR หลาย Condition

Posted: Mon May 24, 2021 4:39 pm
by a6block5
ขอบคุณคุณ Bo_ry มากครับ สุดยอดไปเลยครับ ผมไล่แกะสูตรทำความเข้าใจแล้ว ถึงบางอ้อเลย ขอบคุณมากๆอีกครั้งครับ

มีคำถามเพิ่มเติม อยากให้ช่วยแนะนำอีกนิดครับ

ผม Concat ข้อมูล D & K เพื่อให้แสดงใน Column I (MatCode) เพื่อ Vlookup หาค่า UnitCost (M,N,O) โดย link ไปที่ Sheet UnitCost

ถ้าผมต้องการให้มัน Concat D&K แล้ว Vlookup หาค่า UnitCost เลย โดยที่ผมไม่ต้องสร้าง Column I (Concat D&K) ผมควรเขียน Code ยังไงดีครับ

Re: VBA IF OR หลาย Condition

Posted: Wed May 26, 2021 7:12 pm
by Bo_ry
แก้ K แล้วเติม M N O

Code: Select all

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 10 Then
    Target(1, 3).FormulaR1C1 = "=PI()*RC10*CHOOSE(MATCH(MATCH(RC4,{""Pfizer"",""Modena"",""Sputnik-v"",""Aztrazenegra"",""Paracetamol"",""Sinovac"",""Aspirin""},),{0,2,7}),7850*(RC5+2*RC7)*RC7*RC6/10^9,RC7*2,10)"
ElseIf Target.Column = 11 Then
    Dim c&
    For c = 0 To 2
        Range("M" & Target.Row).Offset(, c) = Application.SumIfs([UnitCost!E4:E999].Offset(, c), [UnitCost!B4:B999], Range("D" & Target.Row), [UnitCost!C4:C999], Range("K" & Target.Row))
    Next
End If
End Sub