ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 如何通过VBA输入数组公式,其中数组公式中,引用的区域为变量名。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-6-26 13:58 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
工作上遇见的问题,需要求出某个型号的单价,用以下数组公式
=MIN(IF(($A$1028:$A$1643=A1028)*($B$1028:$B$1643=B1028),$C$1028:$C$1643))
其中A列为日期,选择当天的(不是每天增加,所以日期会多个),B列中为型号,筛选同一型号,返回C列对应的拍下价格,现需要求单价,所以尝试找同一天,同一型号,最低的价格,热销型号应该最起码有拍下一件的C列价格,求它最小值,但想这个区域$A$1028:$A$1643是用Dim 定义出的range区域,但不知道如何还原成VBA的数组公式,用宏录制没法达到,尝试过以下的的写法,但还是报错。请高手指引一下。
  j = Range("I" & Rows.Count).End(xlUp).Row
  k = Range("A" & Rows.Count).End(xlUp).Row
  Set rng1 = Range(Cells(k + 1, 1), Cells(j, 1))
  Set rng2 = rng1.Offset(0, 1)
  Set rng3 = rng1.Offset(0, 2)
    Cells(k + 1, 8).FormulaArray = _
      "=MIN(IF(("&rng1.address&"="&rng1(1).address)*("&rng2.address&"=RC[-8]),"&rng3.address&"))"




QQ截图20120626135614.png

sample.rar

108.64 KB, 下载次数: 48

TA的精华主题

TA的得分主题

发表于 2012-6-26 14:14 | 显示全部楼层
既然用了VBA,为何还是用公式?

TA的精华主题

TA的得分主题

发表于 2012-6-26 14:31 | 显示全部楼层
  1. Sub yy()
  2. Dim Arr, i&, x$, r%, Arr1(), aa, j&, mn
  3. Dim d, k, t, rng As Range
  4. Set d = CreateObject("Scripting.Dictionary")
  5. Sheet1.Activate
  6. Arr = [a1].CurrentRegion
  7. For i = 2 To UBound(Arr)
  8.     x = Arr(i, 1) & "|" & Arr(i, 2)
  9.     d(x) = d(x) & i & ","
  10. Next
  11. k = d.keys
  12. t = d.items
  13. For i = 0 To UBound(k)
  14.     r = 0
  15.     t(i) = Left(t(i), Len(t(i)) - 1)
  16.     If InStr(t(i), ",") Then
  17.         aa = Split(t(i), ",")
  18.         For j = 0 To UBound(aa)
  19.             r = r + 1
  20.             ReDim Preserve Arr1(1 To r)
  21.             Arr1(r) = Arr(aa(j), 3)
  22.             If rng Is Nothing Then Set rng = Cells(aa(j), 9) Else Set rng = Union(rng, Cells(aa(j), 9))
  23.         Next
  24.     Else
  25.         Cells(t(i), 9) = Cells(t(i), 3).Value
  26.     End If
  27.     mn = Application.Min(Arr1)
  28.     If Not rng Is Nothing Then rng = mn
  29.     Set rng = Nothing
  30. Next
  31. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-6-26 14:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请见附件。

sample0626.rar

111.17 KB, 下载次数: 169

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-6-26 15:53 | 显示全部楼层
多谢版主关照,太多字典、数组还不太明白,下载后慢慢消化,非常感谢{:soso_e152:}

TA的精华主题

TA的得分主题

发表于 2012-6-26 21:41 | 显示全部楼层
minren118 发表于 2012-6-26 16:29
经过测试,用版主那段代码比用数组公式速度差好多啊,因为我的数据已经累积了4万多条,不知道是不是数据量大 ...

只是增加行数,不改变表格,代码照样用。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-6-26 16:29 | 显示全部楼层
经过测试,用版主那段代码比用数组公式速度差好多啊,因为我的数据已经累积了4万多条,不知道是不是数据量大,用版主的方法速度上快不起来?因为我用公式,如果确定了可以把区域转化为变量用的代码,区域就是后来添加的行数,不用调用之前的数据。请版主再次伸出援助之手{:soso_e183:}

TA的精华主题

TA的得分主题

发表于 2012-6-26 21:34 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
同意蓝版意见。数据量大时用VBA一定快过数组公式。
将原数据复制30次,总数据超过5W,经测试,计算全部单价,时间不超过1秒。
附件下载见帖子:
http://club.excelhome.net/forum. ... =881612&pid=6046050

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-6-27 12:00 | 显示全部楼层
谢谢各位热心帮助,我再测试一下看看

TA的精华主题

TA的得分主题

发表于 2014-4-28 20:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
蓝桥玄霜 发表于 2012-6-26 14:33
请见附件。

蓝桥玄霜 老师:能帮这个优化吗?Sub Macro3()
'
Range("P3").Select '
   Selection.FormulaArray = _
     "=IF(AND(RC[-5]:RC[-3]="""",RC[-2]:RC[-1]<RC[-7]/3),RC[-7]/3,IF(AND(RC[-5]=0,RC[-3]<RC[-7]/3,RC[-1]<RC[-7]/3),RC[-7]/3,IF(AND(RC[-4]:RC[-1]=""""),RC[-5]+RC[-7]/5,IF(AND(RC[-3]:RC[-1]<=RC[-5]),-RC[-4]+RC[-7]/3,IF(AND(RC[-3]:RC[-1]<=RC[-5]*1.5),-RC[-4]+RC[-7]/3,"""")))))"
   
    ActiveWindow.SmallScroll Down:=-15
    Range("P3").Select
    Selection.AutoFill Destination:=Range("P3:P238")
    Range("P3:P238").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
         
   
   
End Sub

这是写录的宏,请问老师那儿有不对
提示 FormulaArray属性不对


公式是这个{=IF(AND(K3:M3="",N3:O3<I3/3),I3/3,IF(AND(K3=0,M3<I3/3,O3<I3/3),I3/3,IF(AND(L3:O3=""),K3+I3/5,IF(AND(M3:O3<=K3),-L3+I3/3,IF(AND(M3:O3<=K3*1.5),-L3+I3/3,"")))))}
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 12:32 , Processed in 0.045170 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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