ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] VBA解近似值代码

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-3-24 10:50 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 sky_forest 于 2019-3-24 11:01 编辑

有4个变量a,b,c,d,从A1中选取,不可重复,有i=a/b*c/d,有常数j,k,如|i-j|<k,则输出a,b,c,d,i,i-j的值 VBA近似值.PNG

VBA近似值.zip

7.03 KB, 下载次数: 14

TA的精华主题

TA的得分主题

发表于 2019-3-24 11:49 | 显示全部楼层
306876970.345664039-5.96119E-06
307871790.345666991-3.00876E-06
307971780.345666991-3.00876E-06
309776680.345664039-5.96119E-06
406857970.345664039-5.96119E-06
409757680.345664039-5.96119E-06
4494961300.345662848-7.15221E-06
4413096940.345662848-7.15221E-06
4894881300.345662848-7.15221E-06
4813088940.345662848-7.15221E-06
576840970.345664039-5.96119E-06
579740680.345664039-5.96119E-06
717830790.345666991-3.00876E-06
717930780.345666991-3.00876E-06
766830970.345664039-5.96119E-06
769730680.345664039-5.96119E-06
8894481300.345662848-7.15221E-06
8813048940.345662848-7.15221E-06
9694441300.345662848-7.15221E-06
9613044940.345662848-7.15221E-06

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-25 08:28 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-3-25 08:47 | 显示全部楼层
这个实际就是根据A列,罗列出所有的a\b\c\d四个值而已,至于计算比较什么的,固定的,剔除不符合条件就可以得到结果了。找找如何罗列数据的帖子抄一下代码即可

TA的精华主题

TA的得分主题

发表于 2019-3-25 10:37 | 显示全部楼层
是的,41选4的排列。需计算2430480次。
a、c级b、d位置可对换。所以也可以认为是分组组合问题。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-25 13:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
yjh_27 发表于 2019-3-25 10:37
是的,41选4的排列。需计算2430480次。
a、c级b、d位置可对换。所以也可以认为是分组组合问题。

数学原理我知道,但没学过编程,不会写代码,能把代码发给我吗

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-25 13:26 | 显示全部楼层
microyip 发表于 2019-3-25 08:47
这个实际就是根据A列,罗列出所有的a\b\c\d四个值而已,至于计算比较什么的,固定的,剔除不符合条件就可以 ...

隔行如隔山,“即可”让我很无奈

TA的精华主题

TA的得分主题

发表于 2019-3-25 14:10 | 显示全部楼层
简易化处理,结果做了去重,如果不去重,可以直接用二维数组装载并显示
  1. Option Explicit

  2. Sub Test()
  3.     Dim Sh As Worksheet, lngRows As Long
  4.     Dim arrData As Variant, objDic As Object, objDicResult As Object
  5.     Dim dblConstant As Double '常数
  6.     Dim dblAccuracy As Double '精度
  7.     Dim dblDeviation As Double '误差
  8.     Dim dblI As Double, strKey As String
  9.     Dim lngA As Long, lngB As Long, lngC As Long, lngD As Long
  10.     Dim dblA As Double, dblB As Double, dblC As Double, dblD As Double
  11.    
  12.     Set objDic = CreateObject("Scripting.Dictionary")
  13.     Set objDicResult = CreateObject("Scripting.Dictionary")
  14.     Set Sh = Sheets("Sheet1")
  15.     lngRows = Sh.Range("A" & Rows.Count).End(xlUp).Row
  16.     arrData = Sh.Range("A1:A" & lngRows)
  17.    
  18.     dblConstant = Sh.Range("C2").Value
  19.     dblAccuracy = Sh.Range("D2").Value
  20.    
  21.     For lngA = 1 To lngRows
  22.         objDic.RemoveAll
  23.         dblA = arrData(lngA, 1)
  24.         objDic(dblA) = ""
  25.         For lngB = 1 To lngRows
  26.             dblB = arrData(lngB, 1)
  27.             If objDic.Exists(dblB) = False Then
  28.                 objDic(dblB) = ""
  29.                 For lngC = 1 To lngRows
  30.                     dblC = arrData(lngC, 1)
  31.                     If objDic.Exists(dblC) = False Then
  32.                         objDic(dblC) = ""
  33.                         For lngD = 1 To lngRows
  34.                             dblD = arrData(lngD, 1)
  35.                             If objDic.Exists(dblD) = False Then
  36.                                 objDic(dblD) = ""
  37.                                 dblI = dblA / dblB * dblC / dblD
  38.                                 dblDeviation = dblI - dblConstant
  39.                                 If Abs(dblDeviation) < dblAccuracy Then
  40.                                     strKey = dblA & "," & dblB & "," & dblC & "," & dblD & "," & dblI & "," & dblDeviation
  41.                                     objDicResult(strKey) = ""
  42.                                 End If
  43.                                 objDic.Remove dblD
  44.                             End If
  45.                         Next
  46.                         objDic.Remove dblC
  47.                     End If
  48.                 Next
  49.                 objDic.Remove dblB
  50.             End If
  51.         Next
  52.     Next
  53.    
  54.     arrData = Application.WorksheetFunction.Transpose(objDicResult.keys)
  55.     lngRows = UBound(arrData)
  56.    
  57.     Sh.Range("F2:F" & Rows.Count).Clear
  58.     Sh.Range("F2").Resize(lngRows, 1) = arrData
  59.     Sh.Range("F2").Resize(lngRows, 1).TextToColumns Destination:=Range("F2"), DataType:=xlDelimited, Comma:=True
  60.    
  61.     MsgBox "OK"
  62. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2019-3-25 14:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
那么你是来这里要结果?还是来学习的呢?

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-25 16:48 | 显示全部楼层
lsdongjh 发表于 2019-3-25 14:10
简易化处理,结果做了去重,如果不去重,可以直接用二维数组装载并显示

非常感谢,我自己真心写不出来,要完全看懂估计都得费很多时间学习,真心感谢!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-27 08:45 , Processed in 0.047620 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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