我有一个列A中的“数据代码”、B列中的“条件”和“C列”中的数字值的列表。我需要一个VBA代码来验证B列中关于A列中数据代码的条件,如果条件为真,那么使用与列C相同的值更新列D,或者将D列中的值改为零,然后重复这个过程,直到第A列中的最后一个数据单元格遇到VBA RegEx,但我不知道如何使用它来解决这个问题?
任何帮助都是非常感谢的!
示例:-单元格"A1" = "AAA BBB DDD EEE GGG HHH A11 B11 C11 1A1 1AB AA0"中的数据代码
细胞"B1" = "( AAA + BBB + ( CCC | DDD ) + ( EEE + ! FFF ) ) | ( GGG + HHH + DDD + EEE + FFF )"中的条件
细胞"C1" = "5"值
宏将更新单元格"D1" = "5" --因为条件为真--“A1”有AAA, BBB, DDD, EEE and "NOT FFF"
信元"A2" = "AAA BBB DDD EEE GGG HHH A11 B11 C11 1A1 1AB AA0"条件中的数据码在信元"B1" = "( AAA + BBB + ( CCC | DDD ) + ( ! EEE + ! FFF ) ) | ( GGG + HHH + DDD + EEE + FFF )"值中的信元"C2" = "3"宏应更新单元格"D2" = "0",因为该条件是假的-“A1”有"EEE"而没有"FFF"
发布于 2019-08-01 10:11:03
欢迎来到这里。谢谢并祝贺你提出了一个好问题。可能还有其他解析方法将条件字符串转换为可行的公式,我选择了一种简单的解析方法,并以某种方式在VBA本身中使用该公式。解决方案需要参考"Microsoft的可扩展性“…要添加(在VBA窗口中,-> Tools-> Reference ->,然后添加)。
假设B列的条件是一致的,且所有运算符之间都有一个空间。但是,可以对代码进行修改,使条件语法几乎不发生变化。工作表名称、行及栏详细资料可按实际需要修改。
经测试的代码:
Option Explicit
Sub test3()
Dim TestStr As String
Dim CondStr As String, xFormula As String, iFormula As String
Dim Arr As Variant, VBstr As String
Dim i As Integer, Srw As Long, Lrw As Long, Rw As Long
Dim Ws As Worksheet, Wb As Workbook, Rslt As Boolean, vbc As VBComponent
Set Ws = ThisWorkbook.ActiveSheet
Set Wb = Workbooks.Add
Set vbc = Wb.VBProject.VBComponents.Add(vbext_ct_StdModule)
Srw = 1
Lrw = Ws.Cells(Rows.Count, 1).End(xlUp).Row
For Rw = Srw To Lrw
'TestStr = "AAA BBB DDD EEE GGG HHH A11 B11 C11 1A1 1AB AA0"
'TestStr = "AAA BBB EEE GGG HHH A11 B11 C11 1A1 1AB AA0"
TestStr = Ws.Cells(Rw, 1).Value
'CondStr = "( AAA + BBB + ( CCC | DDD ) + ( EEE + ! FFF ) ) | ( GGG + HHH + DDD + EEE + FFF )"
CondStr = Ws.Cells(Rw, 2).Value
Arr = Split(CondStr, " ")
VBstr = ""
For i = LBound(Arr) To UBound(Arr)
xFormula = Trim(Arr(i))
Select Case xFormula
Case ""
iFormula = ""
Case "(", ")"
iFormula = Arr(i)
Case "+"
iFormula = " And "
Case "|"
iFormula = " OR "
Case "!"
iFormula = " Not "
Case Else
iFormula = (InStr(1, TestStr, xFormula) > 0)
End Select
VBstr = VBstr & iFormula
Next i
VBstr = "X = " & VBstr
Debug.Print Rw & VBstr
Dim StrLine As Long, LineCnt As Long
With vbc.CodeModule
On Error Resume Next
StrLine = .ProcBodyLine("VersatileCode", vbext_pk_Proc)
LineCnt = .ProcCountLines("VersatileCode", vbext_pk_Proc)
.DeleteLines StrLine, LineCnt
On Error GoTo 0
.InsertLines StrLine + 1, "Sub VersatileCode()"
.InsertLines StrLine + 2, VBstr
.InsertLines StrLine + 3, "ThisWorkbook.Sheets(1).cells(1,1).value = X"
.InsertLines StrLine + 4, "End Sub"
End With
DoEvents
Application.Run Wb.Name & "!VersatileCode"
DoEvents
Rslt = Wb.Sheets(1).Cells(1, 1).Value
Debug.Print Rslt
If Rslt = True Then
Ws.Cells(Rw, 4).Value = Ws.Cells(Rw, 3).Value
Else
Ws.Cells(Rw, 4).Value = 0
End If
Next Rw
Wb.Close False
End Subhttps://stackoverflow.com/questions/57293004
复制相似问题