|
楼主 |
发表于 2019-2-13 20:26
|
显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
谢谢老师,我把你的代码改了。
我使用了9+5=9,3+6=3这两个算式能得到正确的算式。
- Option Explicit
- '6+4=4
- '答案1,0+4=4
- '答案2,8-4=4
- '火柴
- Sub hc()
- Dim i, j, k, c, x, y, z, s, p, q
- 'A列是变化前,B列变化后,C列变化类型
- '后半部分(15到28)是前半部分(1到14)的逆操作
- 'A = Range("a1").CurrentRegion
- Dim A() As String
- ReDim A(1 To 28, 1 To 3) As String
- A(1, 1) = 0: A(1, 2) = 6: A(1, 3) = "自变": A(2, 1) = 0: A(2, 2) = 8: A(2, 3) = "自变"
- A(3, 1) = 0: A(3, 2) = 9: A(3, 3) = "自变": A(4, 1) = 1: A(4, 2) = 7: A(4, 3) = "自变"
- A(5, 1) = 1: A(5, 2) = "+": A(5, 3) = "+": A(6, 1) = 3: A(6, 2) = 9: A(6, 3) = "+"
- A(7, 1) = 5: A(7, 2) = 6: A(7, 3) = "+": A(8, 1) = 5: A(8, 2) = 9: A(8, 3) = "+"
- A(9, 1) = 6: A(9, 2) = 8: A(9, 3) = "+": A(10, 1) = 6: A(10, 2) = 9: A(10, 3) = "+"
- A(11, 1) = 8: A(11, 2) = 9: A(11, 3) = "+": A(12, 1) = 11: A(12, 2) = "+": A(12, 3) = "自变"
- A(13, 1) = "-": A(13, 2) = "+": A(13, 3) = "+": A(14, 1) = "-": A(14, 2) = "+": A(14, 3) = "="
- A(15, 1) = 6: A(15, 2) = 0: A(15, 3) = "自变": A(16, 1) = 8: A(16, 2) = 0: A(16, 3) = "自变"
- A(17, 1) = 9: A(17, 2) = 0: A(17, 3) = "自变": A(18, 1) = 7: A(18, 2) = 1: A(18, 3) = "自变"
- A(19, 1) = "+": A(19, 2) = 1: A(19, 3) = "-": A(20, 1) = 9: A(20, 2) = 3: A(20, 3) = "-"
- A(21, 1) = 6: A(21, 2) = 5: A(21, 3) = "-": A(22, 1) = 9: A(22, 2) = 5: A(22, 3) = "-"
- A(23, 1) = 8: A(23, 2) = 6: A(23, 3) = "-": A(24, 1) = 9: A(24, 2) = 6: A(24, 3) = "-"
- A(25, 1) = 9: A(25, 2) = 8: A(25, 3) = "-": A(26, 1) = "+": A(26, 2) = 11: A(26, 3) = "自变"
- A(27, 1) = "+": A(27, 2) = "-": A(27, 3) = "-": A(28, 1) = "=": A(28, 2) = "-": A(28, 3) = "-"
- x = InputBox("移动一根火柴,使其成立", "问题", "6+4=4")
- s = x & vbLf & "可变成" & vbLf & vbLf
- '1. 遍历所有字符
- For i = 1 To Len(x)
- c = Mid(x, i, 1) '比如,返回"6"
- If InStr("011356789-+=", c) Then
- '2. 遍历所有结果
- For j = 1 To UBound(A)
- If c = CStr(A(j, 1)) Then
- '3. 按变化类型,选不同规则
- If A(j, 3) = "自变" Then
- '3-1 自变,指只有自身一个字符变化。比如 6变0
- y = x '备份
- Mid(y, i, Len(A(j, 2))) = A(j, 2) 'Mid(字符串, 替换位置, 替换长度) = 用于替换的子串
- If f(y) Then If InStr(s, y) = 0 Then s = s & vbLf & y
- Else
- '3-2 因变,和另一个字符同时变化
- '3-2-1 因变_字符1,总是需要变的,所以提取出来
- y = x
- Mid(y, i, Len(A(j, 2))) = A(j, 2)
- '3-2-2 因变_字符2
- p = 1 '扫过位置
- If A(j, 3) = "+" Then
- '则另一个字符必是可减,比如 8变6
- For k = 1 To UBound(A)
- If A(k, 3) = "-" Then
- q = InStr(p, y, A(k, 1)) '字符2的当前位置
- If q > 0 Then
- p = q
- ' Debug.Print y, A(k, 1), "扫完" & p, "当前" & q
- z = y
- Mid(z, q, Len(A(k, 1))) = A(k, 2)
- If f(z) Then If InStr(s, z) = 0 Then s = s & vbLf & z
- End If
- End If
- Next k
- ElseIf A(j, 3) = "-" Then
- '则另一个字符必是可加,比如 6变8
- For k = 1 To UBound(A)
- If A(k, 3) = "+" Then
- q = InStr(p, y, A(k, 1))
- If q > 0 Then
- p = q
- z = y
- Mid(z, q, Len(A(k, 1))) = A(k, 2)
- If f(z) Then If InStr(s, z) = 0 Then s = s & vbLf & z
- End If
- End If
- Next k
- End If
- End If
- End If
- Next j
- End If
- Next i
- MsgBox IIf(Len(s) = 12, "快去请如来佛祖!", s), , "答案"
- End Sub
- '判断
- Function f(s) As Boolean
- Dim arr, l, r
- If InStr(s, "=") Then
- arr = VBA.Split(s, "=")
- l = Application.Evaluate(arr(0))
- r = Application.Evaluate(arr(1))
- If VBA.IsNumeric(l) And VBA.IsNumeric(r) Then
- If l = r Then f = True
- End If
- End If
- End Function
复制代码
因为我最常用ppt的。这里有个问题,在ppt中,Application.Evaluate不能使用,我不知道怎么替换。能换掉吗? |
|