首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >宏,用于分析和计算与不同单元格中的数据有关的字符串。

宏,用于分析和计算与不同单元格中的数据有关的字符串。
EN

Stack Overflow用户
提问于 2019-07-31 14:20:33
回答 1查看 87关注 0票数 1

我有一个列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"

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-01 10:11:03

欢迎来到这里。谢谢并祝贺你提出了一个好问题。可能还有其他解析方法将条件字符串转换为可行的公式,我选择了一种简单的解析方法,并以某种方式在VBA本身中使用该公式。解决方案需要参考"Microsoft的可扩展性“…要添加(在VBA窗口中,-> Tools-> Reference ->,然后添加)。

假设B列的条件是一致的,且所有运算符之间都有一个空间。但是,可以对代码进行修改,使条件语法几乎不发生变化。工作表名称、行及栏详细资料可按实际需要修改。

经测试的代码:

代码语言:javascript
复制
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 Sub
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57293004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档