Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
12
返回列表 发新帖
楼主: zhxj1983

像这种列不连续一起的,怎么实现vlookup查找返回数值的功能

[复制链接]
发表于 2019-6-28 14:26 | 显示全部楼层
本帖最后由 hfwufanhf2006 于 2019-6-28 14:28 编辑
zhxj1983 发表于 2019-6-28 13:58
其实是这样的。出库表和入库表,引用的只是产品进销存表的产品的信息而已,就是用入库表(出库表)A列的 ...

代码要放在“出库”这个表里,这涉及工作表前缀是否可以简写的问题:

Sub 计算出库()
Application.ScreenUpdating = False
Dim d As Object
Set d = CreateObject("scripting.dictionary")
Dim arr(6)
For i = 2 To Worksheets("6月份产品进销存").Range("a100000").End(3).Row
    s = Trim(Worksheets("6月份产品进销存").Cells(i, 1))
    arr(1) = Worksheets("6月份产品进销存").Cells(i, 2)
    arr(2) = Worksheets("6月份产品进销存").Cells(i, 3)
    arr(3) = Worksheets("6月份产品进销存").Cells(i, 4)
    arr(4) = Worksheets("6月份产品进销存").Cells(i, "g")
    arr(5) = Worksheets("6月份产品进销存").Cells(i, "h")
    arr(6) = Worksheets("6月份产品进销存").Cells(i, "i")
    d(s) = arr
Next i
Dim arr1
For i = 2 To [a10000].End(3).Row
    s = Trim(Cells(i, 1))
    If d.exists(s) Then
       arr1 = d(s)
       Cells(i, 2) = arr1(1)
       Cells(i, 3) = arr1(2)
       Cells(i, 4) = arr1(3)
       Cells(i, "e") = arr1(4)
       Cells(i, "f") = arr1(5)
       Cells(i, "g") = arr1(6)
    End If
Next i
Application.ScreenUpdating = True
End Sub

说明:
1、主要就是两段循环,第一段读取内容到字典,你原来的代码也是先读到字典的,差别只是我用的是数组存放,原来的代码是字符串拼接;
    字段的内容与数组的对应关系:
    arr(1) = Worksheets("6月份产品进销存").Cells(i, 2)    '第2列是b列,记录在arr(1)中
    arr(2) = Worksheets("6月份产品进销存").Cells(i, 3)
    arr(3) = Worksheets("6月份产品进销存").Cells(i, 4)    '第4列是d列,记录在arr(3)中
    arr(4) = Worksheets("6月份产品进销存").Cells(i, "g")  '直接用字母标识列号,g就是g列,与数字 7(第7列) 等同
    arr(5) = Worksheets("6月份产品进销存").Cells(i, "h")
    arr(6) = Worksheets("6月份产品进销存").Cells(i, "i")

2、写入字典数据。
     先判断  If d.exists(s) Then ,如果字典存在表示查到了,然后写入;
       Cells(i, 2) = arr1(1)   '第2列就是b列,对应数组arr1(1)
       Cells(i, 3) = arr1(2)   '第3列就是c列,对应数组arr1(2)
       Cells(i, 4) = arr1(3)
       Cells(i, "e") = arr1(4)  '这里直接用字母标识列号,“e“就是e列,与数字5等同,对应数组arr1(4),读取时它是“g"列
       Cells(i, "f") = arr1(5)
       Cells(i, "g") = arr1(6)

3、如果你要更改列的对应关系或者是增加列数据的读取数量:
    1)更改列对应关系
         按照上面解释的原则,只需要相应变换单元格的列编号顺序即可;
    2)增加列数的读取数量
         需要增加数组定义上限
            dim arr(6),定义了6个列,你首先要增加这个数组上限;
         然后在读取和写入的部分增加对应的行代码
           在读取代码  arr(6) = Worksheets("6月份产品进销存").Cells(i, "i") 的后面增加新的读取行,比如
              arr(7) = Worksheets("6月份产品进销存").Cells(i, 字母列号或列数字编号)


              ....
         写入的部分也是类似的增加,比如:
             Cells(i, 字母列号或列数字编号) = arr1(7)
             .....
      3)注意,定义的数组有两个,一个是 arr ,记录读取的内容,另一个是 arr1,读取字典的内容到数组,然后在写入对应列。这两个数组不同






回复

使用道具 举报

 楼主| 发表于 2019-6-28 14:50 | 显示全部楼层
hfwufanhf2006 发表于 2019-6-28 14:26
代码要放在“出库”这个表里,这涉及工作表前缀是否可以简写的问题:

Sub 计算出库()

对的,这样没有错,正确。这样写很清楚,我知道哪些是对应哪个表的哪列
回复

使用道具 举报

 楼主| 发表于 2019-6-28 14:56 | 显示全部楼层
hfwufanhf2006 发表于 2019-6-28 14:26
代码要放在“出库”这个表里,这涉及工作表前缀是否可以简写的问题:

Sub 计算出库()

还要麻烦老师,替我看看我刚才说的那个汇总的问题。就是6月份产品进销存表里面的入库数量,还有出库数量,还有期末结存
回复

使用道具 举报

发表于 2019-6-28 15:03 | 显示全部楼层
zhxj1983 发表于 2019-6-28 14:56
还要麻烦老师,替我看看我刚才说的那个汇总的问题。就是6月份产品进销存表里面的入库数量,还有出库数量 ...

我之前忘了这一条,等会我给你加上。
回复

使用道具 举报

发表于 2019-6-28 16:55 | 显示全部楼层
zhxj1983 发表于 2019-6-28 14:56
还要麻烦老师,替我看看我刚才说的那个汇总的问题。就是6月份产品进销存表里面的入库数量,还有出库数量 ...

代码我早就写完了, 之前有段时间连不上论坛。代码要放在“进销存”表单里,你在表里面有个按钮,你把它与代码关联


Application.ScreenUpdating = False
Dim zd1 As Object
Dim zd2 As Object
Set zd1 = CreateObject("scripting.dictionary")
Set zd2 = CreateObject("scripting.dictionary")
For i = 2 To Worksheets("6月份入库").Range("a100000").End(3).Row
    s = Trim(Worksheets("6月份入库").Cells(i, 1))
    If zd1.exists(s) Then
       zd1(s) = zd1(s) + Worksheets("6月份入库").Cells(i, "j")
    Else
       zd1(s) = Worksheets("6月份入库").Cells(i, "j")
    End If
Next i
For i = 2 To Worksheets("6月份出库").Range("a100000").End(3).Row
    s = Trim(Worksheets("6月份出库").Cells(i, 1))
    If zd2.exists(s) Then
       zd2(s) = zd2(s) + Worksheets("6月份出库").Cells(i, "h")
    Else
       zd2(s) = Worksheets("6月份出库").Cells(i, "h")
    End If
Next i

For i = 2 To Range("a100000").End(3).Row
    s = Trim(Cells(i, 1))
    If zd1.exists(s) Then
       Cells(i, "k") = zd1(s)
    Else
       Cells(i, "k") = 0
    End If
    If zd2.exists(s) Then
       Cells(i, "l") = zd2(s)
    Else
       Cells(i, "l") = 0
    End If
    Cells(i, "m") = Cells(i, "j") + Cells(i, "k") - Cells(i, "l")
Next i
Application.ScreenUpdating = True


因为我要下班的原因,我只能简单写几点:
1、前半部分有两个循环是读取"出库"和"入库"数据到字典,字典也有两个zd1、zd2;
2、第三个循环是根据查询写入数据,在循环的后面有:

    Cells(i, "m") = Cells(i, "j") + Cells(i, "k") - Cells(i, "l")

     就是计算库存余额的
3、关于数据,我本来很有自信的,但我发现汇总出来的结果与你原来用函数统计的不太一样,你需要仔细核对并查找原因,我才好再修改。比如:
     第二行  薄垫120*1902cm棕874#18,你的结果是 105、110,我汇总出来却只有 59、87,我用系统筛选特别针对这个项目检查了“入库”数据(出库我没检查),总共有18个行次,总数确实是59,所以你的汇总数105就很蹊跷了,你再找下原因;
    我只检查了这一个记录,其他都没来得及看,要靠你了;


回复

使用道具 举报

 楼主| 发表于 2019-6-29 10:02 | 显示全部楼层
hfwufanhf2006 发表于 2019-6-28 16:55
代码我早就写完了, 之前有段时间连不上论坛。代码要放在“进销存”表单里,你在表里面有个按钮,你把它 ...

你这条公式是对的啊,我前面那个汇总,我在用的表格是用的sumif公式的,因为要上传附件,就被我直接复制粘贴数值了,另外又被我删了入库的一些记录,所以肯定是不对的啦。还有,像在进销存表这里,加多一个删除这个A列编码一样的行。保证进销存表这个A列编码不要重复。
回复

使用道具 举报

 楼主| 发表于 2019-8-4 22:50 | 显示全部楼层
hfwufanhf2006 发表于 2019-6-28 16:55
代码我早就写完了, 之前有段时间连不上论坛。代码要放在“进销存”表单里,你在表里面有个按钮,你把它 ...

麻烦老师帮我看一下这个附件,像这样不同列的信息,如果相同的汇总要怎么弄,黄色区域的就是要自动生成的

工作簿1.rar

8.83 KB, 下载次数: 2

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-16 13:26 , Processed in 0.277828 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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