Excel VBA IF ElseIf

我一直在得到一个“不匹配的types错误”,或者一些其他的经验错误,如“不阻止if”。 但是,当我修复一个,另一个popup备份。 不知道在这个代码中的问题。 这非常简单,获取单元格值,然后根据值进行分类。

Private Sub CommandButton2_Click() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = ActiveWorkbook.Sheets("Completed Questionnaire") Set sh2 = ActiveWorkbook.Sheets("Classifier") If sh1.Range("C10") = "Yes" Or sh1.Range("C11") = "Yes" Then If sh1.Range("C19:C20") = "Yes" Or sh1.Range("C17") = "Yes" Then sh2.Unprotect Password:="xxx" sh2.Range("D4") = "PS1" sh2.Protect Password:="xxx" End If ElseIf sh1.Range("C10") = "Yes" Or sh1.Range("C11") = "Yes" And _ sh1.Range("C14") = "Yes" Or _ sh1.Range("C15") = "Yes" Or _ sh1.Range("C16") = "Yes" Or _ sh1.Range("C18") = "Yes" Then sh2.Unprotect Password:="xxx" sh2.Range("D4") = "PS2" sh2.Protect Password:="xxx" ElseIf sh1.Range("C12") = "Yes" And sh1.Range("C21") = "Yes" Then If sh1.Range("C10:C11") = "No" Then sh2.Unprotect Password:="xxx" sh2.Range("D4") = "PS3" sh2.Protect Password:="xxx" End If ElseIf sh1.Range("C13") = "Vendor Only" And sh1.Range("C10:C11") = "Yes" Then _ If ("C14") = "Yes" Or _ sh1.Range("C15") = "Yes" Or _ sh1.Range("C16") = "Yes" Or _ sh1.Range("C17") = "Yes" Or _ sh1.Range("C18") = "Yes" Or _ sh1.Range("C19") = "Yes" Or _ sh1.Range("C20") = "Yes" Then _ sh2.Unprotect Password:="xxx" sh2.Range("D4") = "Payment Process" sh2.Protect Password:="xxx" End If ElseIf sh1.Range("C10:C21") = "No" Then sh2.Unprotect Password:="xxx" sh2.Range("D4") = "Non-Payment" sh2.Protect Password:="xxx" Else: sh2.Unprotect Password:="xxx" sh2.Range("D4") = "Needs Review" sh2.Protect Password:="xxx" End If Sheets("Classifier").Select End Sub 

尝试这个:

 Private Sub CommandButton2_Click() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = ActiveWorkbook.Sheets("Completed Questionnaire") Set sh2 = ActiveWorkbook.Sheets("Classifier") If sh1.Range("C10") = "Yes" Or sh1.Range("C11") = "Yes" Then If sh1.Range("C19:C20") = "Yes" Or sh1.Range("C17") = "Yes" Then sh2.Unprotect Password:="xxx" sh2.Range("D4") = "PS1" sh2.Protect Password:="xxx" End If ElseIf sh1.Range("C10") = "Yes" Or sh1.Range("C11") = "Yes" And _ sh1.Range("C14") = "Yes" Or _ sh1.Range("C15") = "Yes" Or _ sh1.Range("C16") = "Yes" Or _ sh1.Range("C18") = "Yes" Then sh2.Unprotect Password:="xxx" sh2.Range("D4") = "PS2" sh2.Protect Password:="xxx" ElseIf sh1.Range("C12") = "Yes" And sh1.Range("C21") = "Yes" Then If sh1.Range("C10:C11") = "No" Then sh2.Unprotect Password:="xxx" sh2.Range("D4") = "PS3" sh2.Protect Password:="xxx" End If ElseIf sh1.Range("C13") = "Vendor Only" And sh1.Range("C10:C11") = "Yes" Then If ("C14") = "Yes" Or _ sh1.Range("C15") = "Yes" Or _ sh1.Range("C16") = "Yes" Or _ sh1.Range("C17") = "Yes" Or _ sh1.Range("C18") = "Yes" Or _ sh1.Range("C19") = "Yes" Or _ sh1.Range("C20") = "Yes" Then sh2.Unprotect Password:="xxx" sh2.Range("D4") = "Payment Process" sh2.Protect Password:="xxx" End If ElseIf sh1.Range("C10:C21") = "No" Then sh2.Unprotect Password:="xxx" sh2.Range("D4") = "Non-Payment" sh2.Protect Password:="xxx" Else sh2.Unprotect Password:="xxx" sh2.Range("D4") = "Needs Review" sh2.Protect Password:="xxx" End If Sheets("Classifier").Select End Sub 

我修复了一些错误的换行符,并将其混合在一起。 请注意,有更好的方法来做你的各种Or语句。 但是,首先,所有这些细胞可以Yes ,或者一次只能有一个,因为您想取消保护和保护?

编辑:我我用COUNTIF()把它清理了一下。 看看这是否工作:

 Private Sub CommandButton2_Click() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = ActiveWorkbook.Sheets("Completed Questionnaire") Set sh2 = ActiveWorkbook.Sheets("Classifier") If WorksheetFunction.CountIf(sh1.Range("C10:C11", "C14"), "Yes") > 0 Then If WorksheetFunction.CountIf(sh1.Range("C19:C20", "C17"), "Yes") > 0 Then sh2.Unprotect Password:="xxx" sh2.Range("D4") = "PS1" sh2.Protect Password:="xxx" End If ElseIf WorksheetFunction.CountIf(sh1.Range("C10:C11"), "Yes") > 0 And _ WorksheetFunction.CountIf(sh1.Range("C14:C16", "C18"), "Yes") > 0 Then sh2.Unprotect Password:="xxx" sh2.Range("D4") = "PS2" sh2.Protect Password:="xxx" ElseIf WorksheetFunction.CountIf(sh1.Range("C12, C21"), "Yes") > 0 Then If WorksheetFunction.CountIf(sh1.Range("C10:C11"), "No") > 0 Then sh2.Unprotect Password:="xxx" sh2.Range("D4") = "PS3" sh2.Protect Password:="xxx" End If ElseIf sh1.Range("C13") = "Vendor Only" And WorksheetFunction.CountIf(sh1.Range("C10:C11"), "Yes") > 0 Then If WorksheetFunction.CountIf(sh1.Range("C14:C20"), "Yes") > 0 Then sh2.Unprotect Password:="xxx" sh2.Range("D4") = "Payment Process" sh2.Protect Password:="xxx" End If ElseIf WorksheetFunction.CountIf(sh1.Range("C10:C21"), "No") > 0 Then sh2.Unprotect Password:="xxx" sh2.Range("D4") = "Non-Payment" sh2.Protect Password:="xxx" Else sh2.Unprotect Password:="xxx" sh2.Range("D4") = "Needs Review" sh2.Protect Password:="xxx" End If Sheets("Classifier").Select End Sub 

一次比较多个单元格

将多个单元格值与其他值进行比较失败,例如:
sh1.Range("C19:C20") = "Yes"
你想在这里做什么? testingC19和C20是否=“是”?
然后(上帝禁止我的代码我写)使用2比较:
sh1.Range("C19") = "Yes" AND sh1.Range("C20") = "Yes"

语法错误

在第四个主IF中有一个语法错误:
ElseIf sh1.Range("C13") = "Vendor Only" And sh1.Range("C10:C11") = "Yes" Then _
应该:
ElseIf sh1.Range("C13") = "Vendor Only" And sh1.Range("C10:C11") = "Yes" Then

并应用我们上面学到的东西,应该是:
ElseIf sh1.Range("C13") = "Vendor Only" And sh1.Range("C19") = "Yes" AND sh1.Range("C20") = "Yes" Then