ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] VBA编程技巧 之 浅谈数据结构 (不定期持续更新,最后更新130411)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-3-28 16:44 | 显示全部楼层
本帖已被收录到知识树中,索引项:
lee1892 发表于 2012-12-20 13:28
队列(Queue)和堆栈(Stack)

队列是指遵循先进先出原则的线性表。队列只允许在末端进行插入操作、在前 ...

我晕,定义了公共变量,不看附件还真不知道

TA的精华主题

TA的得分主题

发表于 2013-3-29 20:52 | 显示全部楼层
正好学习,看看有没有可能解决我正展BOM与逆展BOM的算法

TA的精华主题

TA的得分主题

发表于 2013-3-31 21:26 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-4-6 13:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
太好了,必须收藏!

TA的精华主题

TA的得分主题

发表于 2013-4-7 09:03 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-4-7 13:07 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-4-8 17:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 lee1892 于 2013-4-10 10:56 编辑

使用正确的数据结构的例子(三)

本贴附件: 发货明细统计 by Lee1892.rar (18.98 KB, 下载次数: 443)

示例的原贴:[求助] 发货明细统计

该例子中,有原始数据的出入库记录若干,需要根据这些记录统计计算库存结余。本来是一个非常简单的事情,只需要根据不同的品名让出入库数量对号入座就可以得出结果,相信所有人的第一反应是用个字典索引品名就可以的。

可这个例子中,有个有意思的要求,其每条出入库记录的备注栏内用形如“50*5+44+30*4”这样的字符串来表达出入库数量的包装详细信息,前述这样的一个字符串表达了:50个单位一个包装的计5包,44个单位一个包装的计1包,30个单位一个包装的计4包。该例要求计算结余的同时得出库存结余的包装详细信息,以前述的这个数量作为入库数量,则该品名入库了 50*5+44+30*4 = 414 个单位,若出库了 50*2+30*3 = 190 个单位,则结余应为:224 = 50*3+44+30

该贴中有两个回复尝试解决的,可都出现了偏差。实际上可以构建一个树形结构,每个品名下有若干种包装数量,出入库时除了品名需要对号入座外,不同的包装数量也需要对号入座。为此,我们可以设置如下的自定义数据类型:
[code=vb]
Private Type PACKAGE_DETAIL
    UnitQty As Long
    PackNum As Long
End Type

Private Type ITEM_INFO
    Name        As String
    Unit        As String
    Quantity    As Long
    Packs()     As PACKAGE_DETAIL
    dicIndex    As Object
End Type
[/code]
其中,dicIndex会被创建为字典对象,用包装的单位数量(即每包的数量)来索引Packs这个数组的元素下标,从而实现对号入座。

另外,我们还需要至少两个私有过程或函数,用来将Packs数组翻译成字符串和将字符串翻译成Packs数组,下面的代码还包括了统计计算Packs数组的总数量的函数:
[code=vb]
Private Sub StringToPacks(ByVal strDetail$, ByRef arrPacks() As PACKAGE_DETAIL)
    Dim aPackStr, i&, aDetail
    aPackStr = Split(strDetail, "+")
    ReDim arrPacks(1 To UBound(aPackStr) + 1)
    For i = 0 To UBound(aPackStr)
        aDetail = Split(aPackStr(i), "*")
        With arrPacks(i + 1)
            .UnitQty = CInt(aDetail(0))
            If UBound(aDetail) = 1 Then
                .PackNum = CInt(aDetail(1))
            Else
                .PackNum = 1
            End If
        End With
    Next
End Sub

Private Function PacksToString$(ByRef arrPacks() As PACKAGE_DETAIL)
    Dim i&, aPackStr$(), nCount&
    ReDim aPackStr(1 To UBound(arrPacks))
    nCount = 0
    For i = 1 To UBound(arrPacks)
        With arrPacks(i)
            If .PackNum > 0 Then
                nCount = nCount + 1
                aPackStr(nCount) = .UnitQty & IIf(.PackNum = 1, "", "*" & .PackNum)
            End If
        End With
    Next
    ReDim Preserve aPackStr(1 To nCount)
    PacksToString = Join(aPackStr, "+")
End Function

Private Function PacksQty&(ByRef arrPacks() As PACKAGE_DETAIL)
    Dim i&
    PacksQty = 0
    For i = 1 To UBound(arrPacks)
        With arrPacks(i)
            PacksQty = PacksQty + .PackNum * .UnitQty
        End With
    Next
End Function
[/code]

具体实现的详细代码,见此帖附件。该代码除了能实现原贴要求的功能外,还实现了一些初步的原始数据校对的工作:核对备注数据和出入数量是否相符、出库时检查是否有该品名的库存、出库时检查是否所有出库的包装数量都有足够的库存。

由于参与计算的数据被组织成有内在联系的、逻辑清晰的数据结构,所以该代码也很容易扩充其他功能,如结合上期库存结余,和当期的出入数量,计算当期结束时的库存结余等等。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-4-9 11:49 | 显示全部楼层
学学,就是我的基础太浅!要加油了

TA的精华主题

TA的得分主题

发表于 2013-4-9 20:07 | 显示全部楼层
這個貼子要大力支持,因為我也寫過涉及BOM的程序,總感覺不是甚理想。

TA的精华主题

TA的得分主题

发表于 2013-4-9 22:43 | 显示全部楼层
lee1892 发表于 2013-4-8 17:25
使用正确的数据结构的例子(三)

本贴附件:

大侠你好!87楼的附件运行出现错误如图,代码停在 .Resize(.Cells(2, 1).End(xlDown).Row, 4).ClearContents语句上,请大侠明示原因,谢谢!
错误截图.jpg

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-5-7 16:23 , Processed in 0.047085 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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