ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

如何将字符串中的参数代入字符串公式中进行计算

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-3-4 19:08 | 显示全部楼层 |阅读模式
参数格式:总高:1920;总宽:690;吊脚:20;墙厚:190  等
公式格式:总高+37=2 等
如何将字符串中的参数代入字符串公式中进行计算,详见附件: 如何将参数代入字符串公式中进行计算.rar (13.92 KB, 下载次数: 26)
请老师帮忙下,谢谢!

TA的精华主题

TA的得分主题

发表于 2017-3-4 20:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
都看不懂是什么意思,关注!

TA的精华主题

TA的得分主题

发表于 2017-3-4 20:22 来自手机 | 显示全部楼层
楼主只想要单元格内的内容拆分成变量名和变量值吗?

TA的精华主题

TA的得分主题

发表于 2017-3-4 21:57 | 显示全部楼层
Sub zz()
    Dim d, ar, br
    Set d = CreateObject("Scripting.Dictionary")
    ar = [j1].CurrentRegion
    br = Range("a1:h" & [e65536].End(3).Row)
    For i = 2 To UBound(ar)
        s = Split(ar(i, 2), ";")
        ReDim aa(1 To UBound(s) + 1, 1 To 2)
        For x = 0 To UBound(s)
            aa(x + 1, 1) = Split(s(x), ":")(0): aa(x + 1, 2) = Split(s(x), ":")(1)
        Next
        d(ar(i, 1)) = aa
    Next
    On Error Resume Next
    For i = 2 To UBound(br)
        If d.exists(br(i, 1)) Then k = d(br(i, 1))
        kk = br(i, 5)
        For x = 1 To UBound(k)
            If InStr(kk, k(x, 1)) Then
                kk = Replace(kk, k(x, 1), k(x, 2))
            End If
        Next
        If InStr(kk, "=") Then
            br(i, 6) = Evaluate(Split(kk, "=")(0))
            br(i, 7) = Val(Split(kk, "=")(1))
            br(i, 8) = br(i, 6) * br(i, 7): kk = ""
        End If
    Next
    [a1].Resize(UBound(br), UBound(br, 2)) = br
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-3-4 22:05 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-4 23:02 | 显示全部楼层

非常感谢,正是这个意思,忘记说明,若无此参数时,默认为零……烦请老师帮忙再改一下
我之前只想用Split及 InStr进行纯字符串处理再转变量,结果复杂判断绕乱了,公式运算也不知如何转置,
老师的字符串处理与字典数组结合得太完美了,堪称经典!关键是思路决定出路,太利害了,值得好好研究学习了

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-4 23:24 | 显示全部楼层
本帖最后由 aman1516 于 2017-3-5 00:04 编辑

        For x = 1 To UBound(k)
            If InStr(kk, k(x, 1)) Then
                kk = Replace(kk, k(x, 1), k(x, 2))
            End If
        Next
这个是将对应的参数代入公式,但公式中有而参数中无,则要返过来判断一次了,想了个笨办法加入以下代码:
        gg = Split(Replace(Replace(Split(kk, "=")(0), "+", ","), "-", ","), ",")
        For x = 1 To UBound(k)
            ss = ss & k(x, 1)
        Next
        For g = 0 To UBound(gg)
            If Asc(gg(g)) < 0 And Not InStr(ss, gg(g)) Then
               kk = Replace(kk, gg(g), 0)
            End If
        Next
        If InStr(kk, "=") Then
           ………

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-3-5 00:16 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-3-5 11:09 | 显示全部楼层

你的“返过来判断”办法不错(If Asc(gg(g)) < 0 And Not InStr(ss, gg(g)) Then 是关键语句)。

最初还以为是把那个参数疏漏了。



TA的精华主题

TA的得分主题

发表于 2017-3-6 10:23 | 显示全部楼层
aman1516 发表于 2017-3-4 23:24
For x = 1 To UBound(k)
            If InStr(kk, k(x, 1)) Then
                kk = Replace ...

偶然翻看昨天回复帖子的附件,感觉你的返过来判断法还可简化一下:
......................
        gg = Split(Replace(Replace(Split(kk, "=")(0), "+", ","), "-", ","), ",")
        For g = 0 To UBound(gg)
            If IsNumeric(gg(g)) = False Then
               kk = Replace(kk, gg(g), 0)
            End If
        Next
...................

理由:
1、既然后面用Evaluate求值,则gg(g)必须为数字,否则以0替换,避免出错;
2、前面用数组k的元素替换完了kk里的相关内容,则 kk内必无 k的元素内容,直接以1、的方法处理即可,没必要再与数组k的元素比对。
3、Asc(gg(g)) < 0 既用了1、办法,这个条件也无必要了。

其实你的办法已足够用,以上不知对否,仅供参考。



您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

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

GMT+8, 2024-4-25 22:47 , Processed in 0.053375 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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