ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] iif函数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-3-6 22:26 | 显示全部楼层 |阅读模式
t1 = IIf(i < 27, "", Mid(txt, Fix(i / 26), 1))    报错误

写下面的能通过

        If i < 27 Then
            t1 = ""
        Else
            t1 = Mid(txt, Fix(i / 26), 1)
        End If



t1 = IIf(i < 27, "", Mid(txt, Fix(i / 26), 1))   错在哪里,谢谢


TA的精华主题

TA的得分主题

发表于 2024-3-6 23:40 | 显示全部楼层
IIf 函数在 VB (Visual Basic) 或 VBA (Visual Basic for Applications) 中是立即计算其所有参数。这就是说,不论条件成立与否,其实它会先执行所有的参数再根据条件决定返回那一个。  在你的表达式:  t1 = IIf(i < 27, "", Mid(txt, Fix(i / 26), 1))   这代表如果 i < 27 ,返回字符串 "",否则返回 Mid(txt, Fix(i / 26), 1)。但是,IIf 会先计算 Mid(txt, Fix(i / 26), 1) ,然后再判断 i 是不是小于 27。如果 i 小于 27,并且同时 txt 字符串长度小于 Fix(i / 26), 这将导致 Mid 函数出现运算错误。  而使用 If...Then...Else 结构时,程序会先判断 i 是否 小于 27。如果 i < 27,程序就直接将 t1 赋值为空字符串,不会再执行 Mid(txt, Fix(i / 26), 1) 这一条。这样就避开了 Mid 函数可能出现的运算错误。因此不会出错。这一特性叫做条件表达式的短路计算(Short-Circuit Evaluation)。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-3-6 23:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
IIf 函数在 VB (Visual Basic) 或 VBA (Visual Basic for Applications) 中是立即计算其所有参数。这就是说,不论条件成立与否,其实它会先执行所有的参数再根据条件决定返回那一个。

在你的表达式:

t1 = IIf(i < 27, "", Mid(txt, Fix(i / 26), 1))

这代表如果 i < 27 ,返回字符串 "",否则返回 Mid(txt, Fix(i / 26), 1)。但是,IIf 会先计算 Mid(txt, Fix(i / 26), 1) ,然后再判断 i 是不是小于 27。如果 i 小于 27,并且同时 txt 字符串长度小于 Fix(i / 26), 这将导致 Mid 函数出现运算错误。

而使用 If...Then...Else 结构时,程序会先判断 i 是否 小于 27。如果 i < 27,程序就直接将 t1 赋值为空字符串,不会再执行 Mid(txt, Fix(i / 26), 1) 这一条。这样就避开了 Mid 函数可能出现的运算错误。因此不会出错。这一特性叫做条件表达式的短路计算(Short-Circuit Evaluation)。

TA的精华主题

TA的得分主题

发表于 2024-3-7 07:23 | 显示全部楼层
我验证没有问题,可能是你的数据格式有问题,可以用F8一步一步测试。

TA的精华主题

TA的得分主题

发表于 2024-3-7 07:52 | 显示全部楼层
①If 条件式Then 表达式1 Else 表达式2
②IIf(条件式,表达式1,表达式2)

上面的①和②,用法相似,但细节上稍有不同。
①是分步进行的,若条件式符合,则计算表达式1(不计算表达式2),否则计算表达式2(不计算表达式1)。
而②则是一次性先将条件式、表达式1、表达式2全部都计算出来,然后再来判断结果。

因此,参照楼主给出的实例,
假如一开始时i的值为0,
那么当执行IIf时,会先将表达式2中的“Mid(txt, Fix(i / 26), 1))”计算出来,当遇到“Mid(txt, 0, 1)”时,出错。
而改为分步执行的If……Then……时,则因为跳过了“Mid(txt, Fix(i / 26), 1))”的计算而顺利执行。

TA的精华主题

TA的得分主题

发表于 2024-3-7 09:19 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-3-7 14:14 | 显示全部楼层
j=Mid(txt, Fix(i / 26), 1)
t1 = IIf(i < 27, "", j)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 10:25 , Processed in 0.042514 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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