ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求助判断取数的VBA,望老师们给予帮助,谢谢

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-12 11:02 | 显示全部楼层
chaohuahch 发表于 2018-7-12 09:50
一时疏忽。本处的j修改成i、原来的代码,用你的真实数据的话,会下标越界。我的问题。


因为我刚开始学习VBA,自己按照最简单的语句写的VBA,数据量大,运行速度慢,不知道老师是否有时间帮我调整一下代码,具体在附件 VBA 模块1中,如下图 TIM截图20180712103049.jpg

项目款支付申请表-VBA-示例.rar (72.38 KB, 下载次数: 0)

TA的精华主题

TA的得分主题

发表于 2018-7-12 11:23 | 显示全部楼层
zhycl 发表于 2018-7-12 11:02
因为我刚开始学习VBA,自己按照最简单的语句写的VBA,数据量大,运行速度慢,不知道老师是否有时间帮我 ...

第一:把你的cells(i,25)等这样的表达方式,全部修改成数组。
第二: Worksheets("台账汇总")重复出现多次,应该用with 与end with 取代

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-12 11:25 | 显示全部楼层
chaohuahch 发表于 2018-7-12 11:23
第一:把你的cells(i,25)等这样的表达方式,全部修改成数组。
第二: Worksheets("台账汇总")重复出现 ...

老师,能具体举个例子吗?

TA的精华主题

TA的得分主题

发表于 2018-7-12 11:36 | 显示全部楼层
zhycl 发表于 2018-7-12 11:25
老师,能具体举个例子吗?

QQ截图20180712113225.jpg

上面两行代码的结果是完全一致的。第一种,看起来就简洁的多。

用数组的话,数组其实就是一张虚拟的表格。你的代码,比如 i=5的话,你用cells从6列到27列,读取了21次表格,而用数组的话,你只提取了一次表格。这样的运算速度就提高了很多、

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-12 19:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
chaohuahch 发表于 2018-7-12 11:36
上面两行代码的结果是完全一致的。第一种,看起来就简洁的多。

用数组的话,数组其实就是一张虚拟 ...

能给详细解释一下面有备注 各句的意思吗?


Sub 项目付款明细()
Dim nRow, arr
Dim nRow1, arr1, brr, crr
Dim sh As Worksheet '-------------------------------?
Application.ScreenUpdating = False '----------------?

With Sheets("台账汇总")
  nRow = .Range("a" & Rows.Count).End(3).Row
  arr = .Range("a5:f" & nRow)
End With
  
With Sheets("项目付款明细")
  nRow1 = .Range("a" & Rows.Count).End(3).Row
  arr1 = .Range("a6:g" & nRow1)
  brr = .Range("b6:b" & nRow1)
  crr = .Range("h6:h" & nRow1)
End With
  
  For i = 1 To UBound(arr) '--------------------------那个 1 是什么意思。
     For j = 1 To UBound(arr1) '--------------------------那个 1 是什么意思。
       If arr1(j, 1) = arr(i, 1) Then '--------------------------那个 1 是什么意思。
         For k = 3 To UBound(arr1, 2) '--------------------------那个 3和2 各是什么意思。?
            arr1(j, k) = arr(i, k - 1) '--------------------------那个 -1 什么意思?
         Next k
       End If
     Next j
  Next i
Sheets("项目付款明细").Range("a6:g" & nRow1) = arr1
  
For Each sh In Worksheets '--------------------------?
  For i = 1 To UBound(brr) '--------------------------那个 1 是什么意思。
    If sh.Name = brr(i, 1) Then '--------------------------那个 1 是什么意思。
     crr(i, 1) = sh.Range("C7") '--------------------------那个 1 是什么意思。
    End If
  Next i
Next sh
Sheets("项目付款明细").Range("h6:h" & nRow1) = crr
Application.ScreenUpdating = True '--------------------------?

End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-16 15:51 | 显示全部楼层
本帖最后由 zhycl 于 2018-7-16 16:04 编辑
chaohuahch 发表于 2018-7-12 11:36
上面两行代码的结果是完全一致的。第一种,看起来就简洁的多。

用数组的话,数组其实就是一张虚拟 ...

老师,我的表AA列取数=如果(G列到Z列之和=0)则(AA=“”)否则AA=G列到Z列之和。我比照您的代码写的如下代码,也能获得结果,不知道这样是不是最简练的。请指教。谢谢但是结果:A列有331行,但运行后结果只计算到327行,不知道如何解决。

Sub 台账汇总计算()
Dim nRow1, arr1, brr, crr
Application.ScreenUpdating = False

With Sheets("台账汇总")
  nRow = .Range("a" & .Rows.Count).End(3).Row
  arr = .Range("g5:z" & nRow)
End With
  
  For i = 5 To UBound(arr)
       If Application.Sum(Range(Cells(i, 7), Cells(i, 26))) = 0 Then
         Cells(i, 27) = “”
         Else
         Cells(i, 27) = Application.Sum(Range(Cells(i, 7), Cells(i, 26)))
       End If
  Next i

Application.ScreenUpdating = True

End Sub

TA的精华主题

TA的得分主题

发表于 2018-7-17 10:24 | 显示全部楼层
zhycl 发表于 2018-7-16 15:51
老师,我的表AA列取数=如果(G列到Z列之和=0)则(AA=“”)否则AA=G列到Z列之和。我比照您的代码写的如 ...

你用了数组,但是并没有用完全。你for循环里面的 if语句里面的 cells(i,27)等语句完全可以用数组代替。你想想。这样才能提高运算速度。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-17 11:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
chaohuahch 发表于 2018-7-17 10:24
你用了数组,但是并没有用完全。你for循环里面的 if语句里面的 cells(i,27)等语句完全可以用数组代替 ...

老师,我才起步踏实的学学VBA,不过现在急需这段代码,能帮着我改改吗

TA的精华主题

TA的得分主题

发表于 2018-7-17 11:51 | 显示全部楼层
zhycl 发表于 2018-7-17 11:36
老师,我才起步踏实的学学VBA,不过现在急需这段代码,能帮着我改改吗

建议你不要有这样心态。你已经有点基础了。我也告诉你大概的方向了。你可以按照我的方向。用少量的时间,就可以解决了。而你解决的过程,就是你学习的过程。这样你的东西就是你自己的。我直接给你的东西,最终还是我的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-17 15:38 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
chaohuahch 发表于 2018-7-17 11:51
建议你不要有这样心态。你已经有点基础了。我也告诉你大概的方向了。你可以按照我的方向。用少量的时间, ...

老师,我想把J到Y列求和放到Z列,我写了如下代码,但提示错误,能给指点一下吗?
TIM截图20180717153324.jpg TIM截图20180717153342.jpg
Sub 项目付款明细()
Dim nRow, arr, i, j, brr, sm
Application.ScreenUpdating = False

With Sheets("项目付款明细")
  nRow = .Range("a" & .Rows.Count).End(3).Row
  arr = .Range("j6:y" & nRow)
  brr = .Range("z6:z" & nRow)
End With

  For i = 1 To UBound(arr)
     sm = 0
     For j = 1 To 16
       sm = arr(i, j) + sm
     Next j
     brr(i, 17) = sm
  Next i

Sheets("项目付款明细").Range("z6:z" & nRow) = brr

Application.ScreenUpdating = True

End Sub


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

本版积分规则

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

GMT+8, 2025-1-10 02:50 , Processed in 0.025721 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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