在VBA中检查两个标准

我有这个VBAmacrossearch“SV”的范围,并更新具有一定的值('PEL-SVFC')的另一个单元格。 我想扩大这个,所以它只更新该单元格,如果它本身包含另一个值(PEL-CD)之前它被更改,但我得到一个types不匹配的错误。

下面是macros,它是当前的工作版本和引起types不匹配错误的版本:

Sub Update3011() 'Update various values in the 3011 'Define some variables Dim PromoNameColumn As Range Dim PromoNameColumnAsArray As Variant Dim AccountNameColumn As Range Dim AccountNameColumnAsArray As Variant Dim i As Long 'First action: search cells in column W for text containing "SV". Of those matches, if the cell in column D of that row matches "PEL-CD", replace it with "PEL-SVFC". Set PromoNameColumn = Range("W2:W" & ThisWorkbook.Worksheets("3011").UsedRange.Rows.Count) PromoNameColumnAsArray = PromoNameColumn ' PromoNameColumnAsArray is now array Set AccountNameColumn = Range("D2:D" & ThisWorkbook.Worksheets("3011").UsedRange.Rows.Count) AccountNameColumnAsArray = AccountNameColumn ' AccountNameColumnAsArray is now array For i = LBound(PromoNameColumnAsArray, 1) To UBound(PromoNameColumnAsArray, 1) If InStr(1, PromoNameColumnAsArray(i, 1), "SV") Then 'If the range "W2:2" contains SV and the range "D2:D" contains "PEL-CD", continue AccountNameColumnAsArray(i, 1) = "PEL-SVFC" End If Next AccountNameColumn = AccountNameColumnAsArray MsgBox ("3011 updated.") End Sub 

而非工作的一个:

 Sub Update3011() 'Update various values in the 3011 'Define some variables Dim PromoNameColumn As Range Dim PromoNameColumnAsArray As Variant Dim AccountNameColumn As Range Dim AccountNameColumnAsArray As Variant Dim i As Long 'First action: search cells in column W for text containing "SV". Of those matches, if the cell in column D of that row matches "PEL-CD", replace it with "PEL-SVFC". Set PromoNameColumn = Range("W2:W" & ThisWorkbook.Worksheets("3011").UsedRange.Rows.Count) PromoNameColumnAsArray = PromoNameColumn ' PromoNameColumnAsArray is now array Set AccountNameColumn = Range("D2:D" & ThisWorkbook.Worksheets("3011").UsedRange.Rows.Count) AccountNameColumnAsArray = AccountNameColumn ' AccountNameColumnAsArray is now array For i = LBound(PromoNameColumnAsArray, 1) To UBound(PromoNameColumnAsArray, 1) If InStr(1, PromoNameColumnAsArray(i, 1), "SV") And InStr(1, AccountNameColumnAsArray(i, 1), "PEL-CD") Then 'If the range "W2:2" contains SV and the range "D2:D" contains "PEL-CD", continue AccountNameColumnAsArray(i, 1) = "PEL-SVFC" End If Next AccountNameColumn = AccountNameColumnAsArray MsgBox ("3011 updated.") End Sub 

因此,导致错误的位是if语句中的And InStr(1, AccountNameColumnAsArray(i, 1), "PEL-CD") ,是代码块之间唯一不同的东西。

如何在更新单元之前修改此代码以添加额外的逻辑检查?

你的代码应该工作。 如果列D或W中的任何单元格包含错误值,它将不会仅在一种情况下工作。 你的数据是这样吗?

如果是,则可以添加其他条件来检查这两列中的值是否不是错误值。

 For i = LBound(PromoNameColumnAsArray, 1) To UBound(PromoNameColumnAsArray, 1) If Not IsError(PromoNameColumnAsArray(i, 1)) And Not IsError(AccountNameColumnAsArray(i, 1)) Then If InStr(1, PromoNameColumnAsArray(i, 1), "SV") > 0 And InStr(1, AccountNameColumnAsArray(i, 1), "PEL-CD") > 0 Then 'If the range "W2:2" contains SV and the range "D2:D" contains "PEL-CD", continue AccountNameColumnAsArray(i, 1) = "PEL-SVFC" End If End If Next 

InStr返回find你要search的string的索引,例如

 InStr(1, "_PEL-CD_", "PEL-CD") 

会返回2。

在你的第一个代码中,你真的很幸运,它find索引为1的“SV”,幸运的是,VBA理解为1,所以当你要求VBA评估1和2为布尔值时,它将返回一个错误。

只需将第二个macros中的代码更改为

 If InStr(1, PromoNameColumnAsArray(i, 1), "SV") > 0 And InStr(1, AccountNameColumnAsArray(i, 1), "PEL-CD") < 0 Then 

会解决它。