Excel·VBA统计多部门多商品销售量前10%的商品

news2025/1/31 11:28:19

在这里插入图片描述
如图:根据表中唯一的货品ID,有m个事业部中分别有n种货品,统计各事业部销量前10%的货品名称,生成统计表(以下为2种统计方式)

目录

    • 仅统计货品ID
      • 方法1:字典嵌套字典
        • 结果
      • 方法2:自定义函数
        • 结果
    • 筛选保留整行数据
      • 结果

仅统计货品ID

方法1:字典嵌套字典

以事业部名称为1级键,货品ID为2级键,销量为值,统计销量前10%(向上取整)
以下代码使用了二维数组排序,调用了bubble_sort_arr函数,代码详见《Excel·VBA数组冒泡排序函数》(如需使用代码需复制)

Sub 销售数据筛选1()
    Dim dict As Object, arr, res, temp, i&, j&, x&, y&, k, kk, m&, n&
    Set dict = CreateObject("scripting.dictionary"): tm = Timer
    With Worksheets("Sheet1")  '读取数据
        arr = .[a1].CurrentRegion
        For i = 2 To UBound(arr)
            If Not dict.Exists(arr(i, 6)) Then
                Set dict(arr(i, 6)) = CreateObject("scripting.dictionary")
            End If
            dict(arr(i, 6))(arr(i, 1)) = dict(arr(i, 6))(arr(i, 1)) + arr(i, 7)
        Next
    End With
    With Worksheets("Sheet2")  '写入结果
        ReDim res(1 To dict.Count, 0 To 100)
        For Each k In dict.keys
            x = x + 1: res(x, 0) = k  '事业部
            m = dict(k).Count: n = WorksheetFunction.RoundUp(m * 0.1, 0)  '前10%
            If n > UBound(res, 2) Then ReDim Preserve res(1 To UBound(res), 0 To n)
            y = 0: ReDim temp(1 To dict(k).Count, 1 To 2)
            For Each kk In dict(k).keys
                y = y + 1: temp(y, 1) = kk: temp(y, 2) = dict(k)(kk)
            Next
            y = 0: temp = bubble_sort_arr(temp, 2, "-")  '数组排序
            For j = 1 To n
                y = y + 1: res(x, y) = temp(j, 1)  '货品ID
            Next
        Next
        .[a1].Resize(UBound(res), UBound(res, 2) + 1) = res
    End With
    Debug.Print "用时:" & Format(Timer - tm, "0.00")  '耗时
End Sub

结果

部分截图
在这里插入图片描述

方法2:自定义函数

之前写过的《Excel·VBA统计表生成函数及应用实例》对数据的2个条件汇总生成一个二维横纵统计表
该函数与本问题类似,可以先对原始数据进行整理,再使用该函数生成一个二维数组,然后遍历数组、排序、写入(如需使用代码需复制)

Sub 销售数据筛选2()
    Dim arr, brr, res, i&, j&, x&, n&
    tm = Timer
    With Worksheets("Sheet1")
        arr = .[a1].CurrentRegion.Offset(1).Value
        brr = COLLECT(arr, 6, 1, 7)  '调用函数获取返回数组
    End With
    With Worksheets("Sheet3")  '写入结果
        ReDim res(1 To UBound(brr), 0 To UBound(brr, 2))
        For i = 1 To UBound(brr)
            x = 0: res(i, 0) = brr(i, 0)  '事业部
            ReDim temp(1 To UBound(brr, 2), 1 To 2)
            For j = 1 To UBound(brr, 2)
                If Len(brr(i, j)) Then x = x + 1: temp(x, 1) = brr(0, j): temp(x, 2) = brr(i, j)
            Next
            If i = UBound(brr) Then Debug.Print x, temp(x, 1), temp(1, 2)
            n = WorksheetFunction.RoundUp(x * 0.1, 0)  '前10%
            temp = bubble_sort_arr(temp, 2, "-")  '数组排序
            For j = 1 To n
                res(i, j) = temp(j, 1)  '货品ID
            Next
        Next
        .[a1].Resize(UBound(res), UBound(res, 2) + 1) = res
    End With
    Debug.Print "用时:" & Format(Timer - tm, "0.00")  '耗时
End Sub

结果

生成结果与 方法1 基本一致,除了有1个事业部仅1种商品,切销量为负数,未能生成结果;同时代码运行速度也较 方法1 慢了几倍

筛选保留整行数据

采用《Excel·VBA按列拆分工作表、工作簿》先Union行再删除的方法,将非销量前10%的整行删除

Sub 销售数据筛选3()
    Dim dict As Object, dict2 As Object, arr, temp, i&, j&, y&, m&, n&, rng As Range
    Set dict = CreateObject("scripting.dictionary"): tm = Timer
    Set dict2 = CreateObject("scripting.dictionary")
    With Worksheets("Sheet1")
        arr = .[a1].CurrentRegion
        For i = 2 To UBound(arr)
            s = arr(i, 6) & arr(i, 1)
            If Not dict.Exists(arr(i, 6)) Then
                Set dict(arr(i, 6)) = CreateObject("scripting.dictionary")
            End If
            dict(arr(i, 6))(arr(i, 1)) = dict(arr(i, 6))(arr(i, 1)) + arr(i, 7)
            dict2(s) = dict2(s) & "," & i    '行号
        Next
        For Each k In dict.keys
            m = dict(k).Count: n = WorksheetFunction.RoundUp(m * 0.1, 0)  '前10%
            y = 0: ReDim temp(1 To m, 1 To 2)
            For Each kk In dict(k).keys
                y = y + 1: temp(y, 1) = dict2(k & kk): temp(y, 2) = dict(k)(kk)
            Next
            temp = bubble_sort_arr(temp, 2, "-")  '数组排序
            For j = 1 To n
                keep = keep & "," & temp(j, 1)  '不删除行号
            Next
        Next
        .Copy after:=Worksheets(Worksheets.Count)  '复制到最后
        With ActiveSheet
            .Name = "筛选结果": crr = Split(keep, ",")
            For i = 2 To UBound(arr)
                c = Application.Match(CStr(i), crr, 0)
                If TypeName(c) = "Error" Then
                    If rng Is Nothing Then
                        Set rng = .Rows(i)
                    Else
                        Set rng = Union(rng, .Rows(i))
                    End If
                End If
            Next
            If Not rng Is Nothing Then rng.Delete
        End With
    End With
    Debug.Print "用时:" & Format(Timer - tm, "0.00")  '耗时
End Sub

结果

部分截图
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/587716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LED子系统】十、详细实现流程(番外篇)

个人主页:董哥聊技术 我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强公司! 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 文章目录…

Hive ---- 文件格式和压缩

Hive ---- 文件格式和压缩 1. Hadoop压缩概述2. Hive文件格式1. Text File2. ORC3. Parquet3. 压缩1. Hive表数据进行压缩2. 计算过程中使用压缩 1. Hadoop压缩概述 为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器,如下表所示: Hadoo…

CodeForces..李华和迷宫.[简单].[找规律]

题目描述: 题目解读: 存在矩阵迷宫nm,(r,c)表示从顶部开始的第r行和左起第c列。 如果两单元格共享一个边,则是相邻的。路径是相邻空单元格的序列。 每个单元格初始状态都为空。对于从&#x…

代码随想录额外题目——图论部分

记录一下代码随想录中额外题目的图论部分 841.钥匙和房间 有 n 个房间,房间按从 0 到 n - 1 编号。最初,除 0 号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而,你不能在没有获得钥匙的时候进入锁住的房间。 当你进入一个…

山海大模型亮相,云知声交出AGI第一份答卷

有人说,AI大模型是少数巨头才能玩得转的游戏。 截至目前,认同此观点的人不在少数。自从ChatGPT去年迅速火遍全球之后,忽如一夜春风来,AI大模型遍地开。Google、Amazon、阿里、百度等巨头们纷纷加入AI大模型的“军备竞赛”&#x…

【数据分享】1929-2022年全球站点的逐日平均气温数据(Shp\Excel\无需转发)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,其中又以气温指标最为常用!说到气温数据,最详细的气温数据是具体到气象监测站点的气温数据!本次我们为大家带来的就是具体到气象监…

大数据分析案例-基于决策树算法构建世界杯比赛预测模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

EMC VNX Unified Storage 关机顺序方法

EMC Unfied的VNX存储系统要比单纯的Block系统复杂很多,相当于是两套存储系统,不管在物理硬件上还是逻辑的软件OS上,都复杂很多很多。 客户经常遇到由于机房停电或者机房搬迁等情况,需要对存储系统做关机下电甚至物理搬迁的动作&a…

FPGA基于AXI 1G/2.5G Ethernet Subsystem实现UDP通信DMA传输 提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、详细设计方案传统UDP网络通信方案本方案详细设计说明DMA和BRAMAXIS-FIFOUDP模块设计UDP模块FIFOAXI 1G/2.5G Ethernet Subsystem:输出 4、vivado工程详解5、上板调试验证并演示注意事项 6、福利:工程代码的获取 1、…

【simple-cache】一款只用一个注解就实现缓存的框架-我们终于迎来了SpringBoot版本

上次我们讲了【simple-cache】的使用: 【simple-cache】我开发了一款只要一个注解就可以轻松实现缓存的框架 这次主要更新的内容为: 添加springboot项目框架中去除了redisconfig类,避免了redis的单机和集群问题用户可以自定义使用自己项目中…

Python之字符串(str)基础知识点

strip() 删除指定字符 当token为空时,默认删除空白符(含’\n’,‘\r’,‘\t’,’ ),当非空时,根据指定的token进行删除。 字符的删除又可分为以下几种情况: string.strip(token):删除string字符串中开头(left)、结尾处(right)的…

【操作系统】02.进程管理

多道程序系统 多道就是将多个程序同时装入内存,使之并发运行。操作系统也是基于多道产生的,提高了资源利用率和系统吞吐量。 进程 定义 进程是程序的一次执行 进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位 在引入线…

会流程图却不会UML活动图?活动图深度剖析,就怕你学不会!

1. UML活动图是啥? 也许很多人都不怎么了解活动图,但是却对流程图很熟悉,你暂且可以简单的把活动图理解为UML里的流程图,用来描述系统的行为特征。不过UML活动图对比于流程图来说也存在不少差异,本文将在第三章节讲解活…

解决 MobaXterm X11 server 打开 wsl2 linux 子系统 rviz 可视化窗口卡顿问题

1、问题 环境: MobaXtermwsl2 Ubuntu-18.04ROS1Intel 核显 一直使用 MobaXterm 这个远程软件 ssh 链接 linux 服务器,因为它集成了 X11 server,即可以显示一些 linux 下有图形化界面的程序,如 ROS 的 rviz 等。 但是 MobaXterm…

宝塔面板一键部署Z-Blog博客 - 内网穿透实现公网访问

文章目录 1.前言2.网站搭建2.1. 网页下载和安装2.2.网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道(云端设置)3.3.Cpolar稳定隧道(本地设置) 4.公网访问测试5.结语 转发自cpolar极点云的…

一步一步的实现使用 Tensorflow Hub 进行图像分割

在本文中,我们将学习如何使用 TensorFlow Hub中提供的预训练模型执行语义图像分割。TensorFlow Hub 是一个库和平台,旨在共享、发现和重用预训练的机器学习模型。TensorFlow Hub 的主要目标是简化重用现有模型的过程,从而促进协作、减少冗余工…

[比赛简介]ICR - Identifying Age-Related Conditions

比赛链接:https://www.kaggle.com/competitions/icr-identify-age-related-conditions 比赛简介 本次比赛的目标是预测一个人是否患有三种疾病中的任何一种。您被要求预测该人是否患有三种疾病中的任何一种或多种(1 类),或者三种…

第14届蓝桥杯Scratch选拔赛(STEMA) 真题集锦

一、选择题 第 1题单选题 运行以下程序 (小象仅有两个造型),小象的造型是哪个? () 答案 A 解析 本题正确答案是A,考察的知识点是角色造型,在Scratch中,切换造型有两个指令,分别是“换成xx造型“和“下一个造型”,其中前者将角色切换为指定造型,而后者则从当前造型切换…

面向小白的最全Python数据分析指南,超全的!

因工作需求经常会面试一些数据分析师,一些 coding 能力很强的小伙伴,当被问及数据分析方法论时一脸懵逼的,或者理所当然的认为就是写代码啊,在文章开头先来解释一下数据分析。 数据分析是通过明确分析目的,梳理并确定…

虎牙在全球 DNS 秒级生效上的实践

博主介绍:✌全网粉丝4W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程,博主也曾写过优秀论文,查重率极低,在这方面…