ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 修改代码,使新代码的计算结果都比原来的小“1”

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-1-10 20:26 | 显示全部楼层 |阅读模式
20190110200841.png

上面截图里,C:D列是A列数据用自定义函数ZFCJS普通和区域数组公式得出的计算结果,现在需要:


全部保留自定义函数ZFCJS的计算功能和显示格式,只是让显示的结果比实际计算结果小“1”,如C5:D5,原来显示“9”,现在就像E列那样显示“8”。
代码如下:
Function ZFCJS(rgSource As Range) As Variant
    Dim arrSource As Variant, arrResult As Variant
    Dim lngRow As Long
    Dim strTemp As String, strChar As String
    Dim intLen As Integer
    Dim objDic As Object
   
    If rgSource.Count = 1 Then
        ReDim arrSource(1 To 1, 1 To 1)
        arrSource(1, 1) = rgSource
    Else
        arrSource = rgSource
    End If
   
    arrResult = arrSource
    Set objDic = CreateObject("Scripting.Dictionary")
   
    For lngRow = LBound(arrSource) To UBound(arrSource)
        strTemp = arrSource(lngRow, 1)
        strTemp = Trim(strTemp)
        objDic.RemoveAll
        For intLen = 1 To Len(strTemp)
            strChar = Mid(strTemp, intLen, 1)
            If Trim(strChar) <> "" Then objDic(strChar) = ""
        Next
        arrResult(lngRow, 1) = IIf(objDic.Count = 0, "", objDic.Count)
    Next
    Set objDic = Nothing
    ZFCJS = arrResult
End Function


我想应该是在上面的代码里,用各行不重复数据的总个数减去“1”就行了!唉,只能恨自己技术太菜,把上面的代码都揉搓烂了也没有得到想要的结果,只得恳请大神们帮忙了!


怎样让计算结果比原来少“1”.zip (430.56 KB, 下载次数: 5)

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-10 21:58 | 显示全部楼层
恳请老师们指点一下,需要修改您解决代码,才能实现小“1”的结果?

TA的精华主题

TA的得分主题

发表于 2019-1-10 22:03 | 显示全部楼层
ZFCJS = arrResult-1
没有看太懂,这样可行不?

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-10 22:15 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
liulang0808 发表于 2019-1-10 22:03
ZFCJS = arrResult-1
没有看太懂,这样可行不?

不行啊!改成
ZFCJS = arrResult-1后,全部显示#VALUE!错误!

TA的精华主题

TA的得分主题

发表于 2019-1-10 22:23 | 显示全部楼层
WYS67 发表于 2019-1-10 22:15
不行啊!改成
ZFCJS = arrResult-1后,全部显示#VALUE!错误!

    Set objDic = Nothing
    For lngRow = LBound(arrSource) To UBound(arrSource)
        arrResult(lngRow, 1) = arrResult(lngRow, 1) - 1
    Next

    ZFCJS = arrResult
增加红色这段呢?

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-10 22:49 | 显示全部楼层
liulang0808 发表于 2019-1-10 22:23
Set objDic = Nothing
    For lngRow = LBound(arrSource) To UBound(arrSource)
        arrResu ...

版主老师:我再试试看。感谢老师!

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-10 22:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
liulang0808 发表于 2019-1-10 22:23
Set objDic = Nothing
    For lngRow = LBound(arrSource) To UBound(arrSource)
        arrResu ...

20190110225613.png
老师:还是不行,遇到数据区域里出现空格时,就会全部显示#VALUE!错误!

TA的精华主题

TA的得分主题

发表于 2019-1-11 07:04 | 显示全部楼层
WYS67 发表于 2019-1-10 22:56
老师:还是不行,遇到数据区域里出现空格时,就会全部显示#VALUE!错误!

rgSource 对这个参数增加判断,是否为空,然后决定返回值。
意见供参考。。。。。。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-1-11 07:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
liulang0808 发表于 2019-1-11 07:04
rgSource 对这个参数增加判断,是否为空,然后决定返回值。
意见供参考。。。。。。

老师:应该在哪两句之间增加判断?

点评

之前没有整体看代码,这次修改在10楼,供参考。。。  发表于 2019-1-11 08:03

TA的精华主题

TA的得分主题

发表于 2019-1-11 08:02 | 显示全部楼层
WYS67 发表于 2019-1-11 07:54
老师:应该在哪两句之间增加判断?

  1. Function ZFCJS(rgSource As Range) As Variant
  2.     Dim arrSource As Variant, arrResult As Variant
  3.     Dim lngRow As Long
  4.     Dim strTemp As String, strChar As String
  5.     Dim intLen As Integer
  6.     Dim objDic As Object
  7.    
  8.     If rgSource.Count = 1 Then
  9.         ReDim arrSource(1 To 1, 1 To 1)
  10.         If Len(rgSource) = 0 Then
  11.             ZFCJS = ""
  12.             Exit Function
  13.         Else
  14.             arrSource(1, 1) = rgSource
  15.         End If
  16.     Else
  17.         arrSource = rgSource
  18.     End If
  19.    
  20.     arrResult = arrSource
  21.     Set objDic = CreateObject("Scripting.Dictionary")
  22.    
  23.     For lngRow = LBound(arrSource) To UBound(arrSource)
  24.         strTemp = arrSource(lngRow, 1)
  25.         strTemp = Trim(strTemp)
  26.         objDic.RemoveAll
  27.         For intLen = 1 To Len(strTemp)
  28.             strChar = Mid(strTemp, intLen, 1)
  29.             If Trim(strChar) <> "" Then objDic(strChar) = ""
  30.         Next
  31.         arrResult(lngRow, 1) = IIf(objDic.Count = 0, "", objDic.Count - 1)
  32.     Next
  33.     Set objDic = Nothing
  34.     ZFCJS = arrResult
  35. End Function
复制代码

评分

1

查看全部评分

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

本版积分规则

关闭

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

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

GMT+8, 2024-4-26 12:19 , Processed in 0.041201 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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