Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3197|回复: 15

[已解决]一个关于SUMIFS转换成VBA的问题

[复制链接]
发表于 2016-11-18 10:48 | 显示全部楼层 |阅读模式
老师们,我参考一些代码,自己编写的。但结果总有点数据不对的。前面还能对得上,后面就有问题了。请教一下,如何修改?

最佳答案
2016-11-18 16:39
Sub test3()
    Dim A, B, i
    Sheets(1).Select
    A = Range("a1:f" & Range("a65536").End(xlUp).Row)
    Sheets(2).Select
    B = Range("b2:b" & Range("b65536").End(xlUp).Row)
    Set d = CreateObject("scripting.dictionary")

    For i = 2 To UBound(A)
        If A(i, 6) = "上月领料" Then d(A(i, 1)) = d(A(i, 1)) + A(i, 4)
    Next i
    For i = 1 To UBound(B)
        B(i, 1) = d(B(i, 1)) * -1
    Next i

    Range("n:n").Clear
    [n2].Resize(i - 1) = B
End Sub

只显示结果3.zip

16.73 KB, 下载次数: 8

发表于 2016-11-18 11:13 | 显示全部楼层
瞎改了下,我都不知道我在写什么
  1. Sub J列()
  2.     Range("J2:J27").Select
  3.     Selection.ClearContents
  4.     Dim numRow As Long, i As Long
  5.     numRow = Sheets("整理领料明细").Cells(Rows.Count, "B").End(xlUp).Row '获取D列最后一个不为空的行号
  6.     For j = 2 To 12
  7.         If Sheets("差异及状态判断").Cells(j, "F") = "上月领料" Then
  8.             For i = 2 To numRow   '循环到最后一个不为空的行号次数
  9.                 If Cells(i, 2) = Sheets("差异及状态判断").Cells(j, 1) Then
  10.                     Cells(i, "J") = -1 * Sheets("差异及状态判断").Cells(j, "D").Value
  11.                 End If
  12.             Next
  13.         End If
  14.     Next
  15. End Sub
复制代码
回复

使用道具 举报

发表于 2016-11-18 11:17 | 显示全部楼层
Sub test()
    Dim A, B, j, i, s
    Sheets(1).Select
    A = Range("a1:f" & Range("a65536").End(xlUp).Row)
    Sheets(2).Select
    B = Range("b2:b" & Range("b65536").End(xlUp).Row)

    For i = 1 To UBound(B)
        s = 0
        For j = 2 To UBound(A)
            If B(i, 1) = A(j, 1) And A(j, 6) = "上月领料" Then s = s + A(j, 4)
        Next j
        B(i, 1) = s * -1
    Next i
    Range("n:n").Clear
    [n2].Resize(i - 1) = B
End Sub


重新写,方便些。


回复

使用道具 举报

发表于 2016-11-18 11:54 | 显示全部楼层
由于 SUMIFS 条件求和分别在两个表,因此需要两个循环;
由于是两个条件,因此需要 AND 连接两个条件。
  1. Sub sumifs()
  2.     Dim arr, i&, j&
  3.     arr = Sheet1.UsedRange
  4.     [l:l] = "" '清空目标列
  5.     For i = 2 To [b65536].End(3).Row '循环“明细”表(目标区域)
  6.         For j = 2 To UBound(arr) '循环“判断”表(源数据)
  7.             If arr(j, 1) = Cells(i, "B") And arr(j, 6) = "上月领料" Then Cells(i, "L") = -arr(j, 4) + Cells(i, "L")
  8.         Next
  9.     Next
  10. End Sub
复制代码


只显示结果3.rar (19.41 KB, 下载次数: 16)
回复

使用道具 举报

 楼主| 发表于 2016-11-18 15:10 | 显示全部楼层
望帝春心 发表于 2016-11-18 11:13
瞎改了下,我都不知道我在写什么

终于能上来了,可能数据量太多,超过1万多行。三位老师的代码,我用作运行时都会卡死,处理进度条在0%处不断在闪。我原来的代码又不会卡,只是数据位置错了,能再帮我改一下吗?
回复

使用道具 举报

 楼主| 发表于 2016-11-18 15:11 | 显示全部楼层
爱疯 发表于 2016-11-18 11:17
Sub test()
    Dim A, B, j, i, s
    Sheets(1).Select

终于能上来了,可能数据量太多,超过1万多行。三位老师的代码,我用作运行时都会卡死,处理进度条在0%处不断在闪。我原来的代码又不会卡,只是数据位置错了,能再帮我改一下吗?
回复

使用道具 举报

 楼主| 发表于 2016-11-18 15:12 | 显示全部楼层
雨吧 发表于 2016-11-18 11:54
由于 SUMIFS 条件求和分别在两个表,因此需要两个循环;
由于是两个条件,因此需要 AND 连接两个条件。

终于能上来了,可能数据量太多,超过1万多行。三位老师的代码,我用作运行时都会卡死,处理进度条在0%处不断在闪。我原来的代码又不会卡,只是数据位置错了,能再帮我改一下吗?
回复

使用道具 举报

发表于 2016-11-18 15:21 | 显示全部楼层
那就上传“运行时都会卡死”的文档,才好找原因
回复

使用道具 举报

发表于 2016-11-18 15:21 | 显示全部楼层
13724841877 发表于 2016-11-18 15:10
终于能上来了,可能数据量太多,超过1万多行。三位老师的代码,我用作运行时都会卡死,处理进度条在0%处 ...

你原来的少了一层循环,不是错位那么简单吧,感觉你这个倒像是VLOOKUP啊
回复

使用道具 举报

发表于 2016-11-18 15:33 | 显示全部楼层
1万行数据不算多,不是老掉牙的电脑完全可以秒级处理。
为了解决问题可上传真实数据附件说明要求。
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-20 18:11 , Processed in 0.335476 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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