ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: muou8

[求助] 与非或逻辑组合匹配

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-1-18 18:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
muou8 发表于 2019-1-18 14:25
老师 ,如果是  A&B/C   意思就是   选AB同时存在   或者  C存在的情况了

这个逻辑关系用代码来判断,总觉得有点绕,回头想想吧,ABCD可能是什么格式内容,4项还是可能更多项?

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-19 20:52 | 显示全部楼层
香川群子 发表于 2019-1-18 17:37
他们都是解决了你一楼举例的特定问题。

无法得到一个通用的算法。

老师 您的理解是对的,现在就是缺一个自动翻译逻辑一个算法。

TA的精华主题

TA的得分主题

发表于 2019-1-19 22:37 | 显示全部楼层
'&->与、|->或、!->非 ,其它逻辑可自由添加,自己找规律,,,
Option Explicit

Sub test()
  Dim arr, brr, i, j, k, calc, mark, t, s
  Set calc = CreateObject("MSScriptControl.ScriptControl")
  calc.Language = "vbscript"
  arr = [e2:i7]: brr = [a3:b9]
  mark = Split("&, and ,|, or ,!, not", ",")
  For i = 2 To UBound(arr, 1)
    For j = 1 To UBound(brr, 1)
      t = brr(j, 2)
      For k = 0 To UBound(mark) Step 2
        t = Replace(t, mark(k), mark(k + 1))
      Next
      For k = 2 To UBound(arr, 2)
        If arr(i, k) = "X" Then
          t = Replace(t, arr(1, k), True)
        Else
          t = Replace(t, arr(1, k), False)
        End If
      Next
      If calc.Eval(t) Then s = s & "," & brr(j, 1)
    Next
    If Len(s) Then Debug.Print "{" & Mid(s, 2) & "}"
    s = vbNullString
  Next
End Sub


第一张表
序号组合
1A
2A/B
3-A/B
4A&B&C
5-(A&B&C)
6(A&B) | D
7A&B&C&D



评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-21 09:13 | 显示全部楼层
一把小刀闯天下 发表于 2019-1-19 22:37
'&->与、|->或、!->非 ,其它逻辑可自由添加,自己找规律,,,
Option Explicit

谢谢老师,中间还有点小问题,我自己调试下,方法是正确的,谢谢!

TA的精华主题

TA的得分主题

发表于 2019-1-21 11:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我的OFFICE是64位,所以感觉代码很长,主要是要处理一下64位环境下ScriptControl 的调用问题
  1. Option Explicit

  2. Dim sh As Worksheet
  3. Dim arrRule As Variant
  4. Dim arrSource As Variant

  5. Sub Test()
  6.     Dim oSC As Object
  7.     Dim lngRow As Long, lngRow2 As Long
  8.     Dim strTemp As String, strResult As String, arrResult As Variant

  9.     InicData
  10.     ReDim arrResult(LBound(arrSource) To UBound(arrSource), 1 To 2)

  11.     Set oSC = CreateObjectx86("MSScriptControl.ScriptControl")
  12.     oSC.Language = "VBScript"
  13.    
  14.     For lngRow = LBound(arrSource) To UBound(arrSource)
  15.         strResult = ""
  16.         For lngRow2 = LBound(arrRule) To UBound(arrRule)
  17.             arrResult(lngRow, 1) = arrSource(lngRow, 1)
  18.             strTemp = arrRule(lngRow2, 2)
  19.             strTemp = Replace(strTemp, "@A@", arrSource(lngRow, 2))
  20.             strTemp = Replace(strTemp, "@B@", arrSource(lngRow, 3))
  21.             strTemp = Replace(strTemp, "@C@", arrSource(lngRow, 4))
  22.             strTemp = Replace(strTemp, "@D@", arrSource(lngRow, 5))
  23.             If oSC.Eval(strTemp) = True Then strResult = strResult & "," & arrRule(lngRow2, 1)
  24.         Next
  25.         arrResult(lngRow, 2) = Mid(strResult, 2)
  26.     Next
  27.    
  28.     CreateObjectx86 , True
  29.    
  30.     sh.Range("B30").Resize(UBound(arrResult), 2) = arrResult
  31. End Sub

  32. Sub InicData()
  33.     Dim strVal As String
  34.     Dim lngRow As Long, lngCol As Long
  35.    
  36.     Set sh = Sheets("数据")
  37.     arrRule = sh.Range("A3:B9")
  38.     arrSource = sh.Range("E3:I7")
  39.    
  40.     For lngRow = LBound(arrRule) To UBound(arrRule)
  41.         strVal = arrRule(lngRow, 2)
  42.         strVal = UCase(Trim(strVal))
  43.         strVal = Replace(strVal, "A", "@A@")
  44.         strVal = Replace(strVal, "B", "@B@")
  45.         strVal = Replace(strVal, "C", "@C@")
  46.         strVal = Replace(strVal, "D", "@D@")
  47.         strVal = Replace(strVal, "/", " Or ")
  48.         strVal = Replace(strVal, "&", " And ")
  49.         strVal = Replace(strVal, "|", " Or ")
  50.         strVal = Replace(strVal, "-", " Not ")
  51.         arrRule(lngRow, 2) = strVal
  52.     Next
  53.    
  54.     For lngRow = LBound(arrSource) To UBound(arrSource)
  55.         For lngCol = LBound(arrSource, 2) + 1 To UBound(arrSource, 2)
  56.             strVal = arrSource(lngRow, lngCol)
  57.             strVal = UCase(Trim(strVal))
  58.             If strVal = "X" Then
  59.                 strVal = "True"
  60.             Else
  61.                 strVal = "False"
  62.             End If
  63.             arrSource(lngRow, lngCol) = strVal
  64.         Next
  65.     Next
  66.    
  67.     sh.Range("K2").Resize(UBound(arrRule), UBound(arrRule, 2)) = arrRule
  68.     sh.Range("N2").Resize(UBound(arrSource), UBound(arrSource, 2)) = arrSource
  69.    
  70. End Sub

  71. Function CreateObjectx86(Optional sProgID, Optional bClose = False)
  72.     Static oWnd As Object
  73.     Dim bRunning As Boolean
  74.     #If Win64 Then
  75.         bRunning = InStr(TypeName(oWnd), "HTMLWindow") > 0
  76.         If bClose Then
  77.             If bRunning Then oWnd.Close
  78.             Exit Function
  79.         End If
  80.         If Not bRunning Then
  81.             Set oWnd = CreateWindow()
  82.             oWnd.execScript "Function CreateObjectx86(sProgID): Set CreateObjectx86 = CreateObject(sProgID): End Function", "VBScript"
  83.         End If
  84.         Set CreateObjectx86 = oWnd.CreateObjectx86(sProgID)
  85.     #Else
  86.         Set CreateObjectx86 = CreateObject("MSScriptControl.ScriptControl")
  87.     #End If
  88. End Function

  89. Function CreateWindow()
  90.     Dim sSignature, oShellWnd, oProc
  91.     On Error Resume Next
  92.     sSignature = Left(CreateObject("Scriptlet.TypeLib").GUID, 38)
  93.     CreateObject("WScript.Shell").Run "%systemroot%\syswow64\mshta.exe about:""about:<head><script>moveTo(-32000,-32000);document.title='x86Host'</script><hta:application showintaskbar=no /><object id='shell' classid='clsid:8856F961-340A-11D0-A96B-00C04FD705A2'><param name=RegisterAsBrowser value=1></object><script>shell.putproperty('" & sSignature & "',document.parentWindow);</script></head>""", 0, False
  94.     Do
  95.         For Each oShellWnd In CreateObject("Shell.Application").Windows
  96.             Set CreateWindow = oShellWnd.GetProperty(sSignature)
  97.             If Err.Number = 0 Then Exit Function
  98.             Err.Clear
  99.         Next
  100.     Loop
  101. End Function


复制代码

TA的精华主题

TA的得分主题

发表于 2019-1-21 11:59 | 显示全部楼层
详见代码,主要是用ScriptControl处理,我的是64位,所以代码感觉很长,如果你是32位,非常简单的
  1. Option Explicit

  2. Dim sh As Worksheet
  3. Dim arrRule As Variant
  4. Dim arrSource As Variant

  5. Sub Test()
  6.     Dim objScript As Object
  7.     Dim lngRow As Long, lngRow2 As Long
  8.     Dim strTemp As String, strResult As String, arrResult As Variant

  9.     InicData
  10.     ReDim arrResult(LBound(arrSource) To UBound(arrSource), 1 To 2)

  11.     Set objScript = CreateObjectx86("MSScriptControl.ScriptControl")
  12.     objScript.Language = "VBScript"
  13.    
  14.     For lngRow = LBound(arrSource) To UBound(arrSource)
  15.         strResult = ""
  16.         For lngRow2 = LBound(arrRule) To UBound(arrRule)
  17.             arrResult(lngRow, 1) = arrSource(lngRow, 1)
  18.             strTemp = arrRule(lngRow2, 2)
  19.             strTemp = Replace(strTemp, "@A@", arrSource(lngRow, 2))
  20.             strTemp = Replace(strTemp, "@B@", arrSource(lngRow, 3))
  21.             strTemp = Replace(strTemp, "@C@", arrSource(lngRow, 4))
  22.             strTemp = Replace(strTemp, "@D@", arrSource(lngRow, 5))
  23.             If objScript.Eval(strTemp) = True Then strResult = strResult & "," & arrRule(lngRow2, 1)
  24.         Next
  25.         arrResult(lngRow, 2) = Mid(strResult, 2)
  26.     Next
  27.    
  28.     CreateObjectx86 , True
  29.    
  30.     sh.Range("B30").Resize(UBound(arrResult), 2) = arrResult
  31. End Sub

  32. Sub InicData()
  33.     Dim strVal As String
  34.     Dim lngRow As Long, lngCol As Long
  35.    
  36.     Set sh = Sheets("数据")
  37.     arrRule = sh.Range("A3:B9")
  38.     arrSource = sh.Range("E3:I7")
  39.    
  40.     For lngRow = LBound(arrRule) To UBound(arrRule)
  41.         strVal = arrRule(lngRow, 2)
  42.         strVal = UCase(Trim(strVal))
  43.         strVal = Replace(strVal, "A", "@A@")
  44.         strVal = Replace(strVal, "B", "@B@")
  45.         strVal = Replace(strVal, "C", "@C@")
  46.         strVal = Replace(strVal, "D", "@D@")
  47.         strVal = Replace(strVal, "/", " Or ")
  48.         strVal = Replace(strVal, "&", " And ")
  49.         strVal = Replace(strVal, "|", " Or ")
  50.         strVal = Replace(strVal, "-", " Not ")
  51.         arrRule(lngRow, 2) = strVal
  52.     Next
  53.    
  54.     For lngRow = LBound(arrSource) To UBound(arrSource)
  55.         For lngCol = LBound(arrSource, 2) + 1 To UBound(arrSource, 2)
  56.             strVal = arrSource(lngRow, lngCol)
  57.             strVal = UCase(Trim(strVal))
  58.             If strVal = "X" Then
  59.                 strVal = "True"
  60.             Else
  61.                 strVal = "False"
  62.             End If
  63.             arrSource(lngRow, lngCol) = strVal
  64.         Next
  65.     Next
  66.    
  67. End Sub

  68. Function CreateObjectx86(Optional sProgID, Optional bClose = False)
  69.     Static oWnd As Object
  70.     Dim bRunning As Boolean
  71.     #If Win64 Then
  72.         bRunning = InStr(TypeName(oWnd), "HTMLWindow") > 0
  73.         If bClose Then
  74.             If bRunning Then oWnd.Close
  75.             Exit Function
  76.         End If
  77.         If Not bRunning Then
  78.             Set oWnd = CreateWindow()
  79.             oWnd.execScript "Function CreateObjectx86(sProgID): Set CreateObjectx86 = CreateObject(sProgID): End Function", "VBScript"
  80.         End If
  81.         Set CreateObjectx86 = oWnd.CreateObjectx86(sProgID)
  82.     #Else
  83.         Set CreateObjectx86 = CreateObject("MSScriptControl.ScriptControl")
  84.     #End If
  85. End Function

  86. Function CreateWindow()
  87.     Dim sSignature, oShellWnd, oProc
  88.     On Error Resume Next
  89.     sSignature = Left(CreateObject("Scriptlet.TypeLib").GUID, 38)
  90.     CreateObject("WScript.Shell").Run "%systemroot%\syswow64\mshta.exe about:""about:<head><script>moveTo(-32000,-32000);document.title='x86Host'</script><hta:application showintaskbar=no /><object id='shell' classid='clsid:8856F961-340A-11D0-A96B-00C04FD705A2'><param name=RegisterAsBrowser value=1></object><script>shell.putproperty('" & sSignature & "',document.parentWindow);</script></head>""", 0, False
  91.     Do
  92.         For Each oShellWnd In CreateObject("Shell.Application").Windows
  93.             Set CreateWindow = oShellWnd.GetProperty(sSignature)
  94.             If Err.Number = 0 Then Exit Function
  95.             Err.Clear
  96.         Next
  97.     Loop
  98. End Function


复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-1-21 12:16 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
muou8 发表于 2019-1-21 09:13
谢谢老师,中间还有点小问题,我自己调试下,方法是正确的,谢谢!

33楼的贴图是错误的,复制的时候搞错了

你按第一行说明进行修改即可,或者你用文字说明逻辑我来给你写表达式,,,

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-21 20:55 | 显示全部楼层
一把小刀闯天下 发表于 2019-1-21 12:16
33楼的贴图是错误的,复制的时候搞错了

你按第一行说明进行修改即可,或者你用文字说明逻辑我来给你写 ...

谢谢老师,不用了,我结合了36楼老师的方法,防止在64位上无法运行,谢谢老师。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-19 12:47 , Processed in 0.040472 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表