Excel·VBA二维数组组合函数的应用实例

news2024/12/27 12:14:26

看到一个问题《关于#穷举#的问题,如何解决?(语言-开发语言)》,对同一个数据存在“是/否”2种状态,判断其是否参与计算,并输出一系列数据的“是/否”状态的结果
在这里插入图片描述

目录

    • 方法1:二维数组组合函数
      • 结果
    • 方法2:二进制数
      • 结果

方法1:二维数组组合函数

之前的文章《Excel·VBA二维数组组合函数、组合求和》,可以对A-B列每行选择一种状态,返回所有状态的组合,对“原值”依次累加C-D列数值,判断是否符合F2:F3所需结果。以下代码调用了combin_arr2d函数,如需使用代码需复制

Sub 穷举开关状态1()
    Dim arr, c, d, v, v1, v2, brr, b, sum1, sum2, write_col&, i&
    arr = [a2:b9]: v = [f1]: v1 = [f2]: v2 = [f3]
    write_col = 8  '输出结果写入起始列号
    c = [c2].Resize(8, 1): c = WorksheetFunction.Transpose(c)  '单列转一维数组
    d = [d2].Resize(8, 1): d = WorksheetFunction.Transpose(d): tm = Timer
    brr = combin_arr2d(arr)  '调用函数返回组合,一维嵌套数组
    For Each b In brr
        sum1 = v: sum2 = v
        For i = 1 To UBound(b)
            If b(i) = "是" Then
                If Len(c(i)) Then sum1 = Application.Evaluate(sum1 & CStr(c(i)))
                If Len(d(i)) Then sum2 = Application.Evaluate(sum2 & CStr(d(i)))
            End If
        Next
        If Abs(Round(sum1 - v1, 6)) < (0.1 ^ 6) And Abs(Round(sum2 - v2, 6)) < (0.1 ^ 6) Then
            Cells(2, write_col).Resize(UBound(b), 1) = WorksheetFunction.Transpose(b)
            write_col = write_col + 1
        End If
    Next
    Debug.Print "累计用时:" & Format(Timer - tm, "0.00")  '耗时
End Sub

注意:从上到下运算累计计算结果,并非将计算式叠加后一次性计算结果

结果

在这里插入图片描述

方法2:二进制数

开关只有“是/否”2种状态,那么也可以用0和1表示,这与二进制数一样,之前的文章《python从数组中找出所有和为M的组合》,采用过这种方法查找组合求和的结果,那么本问题也可尝试
n个元素的全组合总数=2 ^ n,故8个元素的全组合数为256个,即0-255转化为二进制数(例如255的二进制数为“11111111”,表示8个元素全部选择)

Sub 穷举开关状态2()
    Dim c, d, v, v1, v2, s$, s1$, sum1, sum2, write_col&, i&, x&
    v = [f1]: v1 = [f2]: v2 = [f3]: Dim res(1 To 8)
    write_col = 8  '输出结果写入起始列号
    c = [c2].Resize(8, 1): c = WorksheetFunction.Transpose(c)  '单列转一维数组
    d = [d2].Resize(8, 1): d = WorksheetFunction.Transpose(d): tm = Timer
    For x = 1 To 2 ^ 8 - 1  '注意-512 < x < 511
        s = CStr(WorksheetFunction.Dec2Bin(x)): s = Format(s, "00000000")
        sum1 = v: sum2 = v
        For i = 1 To Len(s)
            s1 = Mid(s, i, 1): res(i) = IIf(s1 = "1", "是", "否")
            If s1 = "1" Then
                If Len(c(i)) Then sum1 = Application.Evaluate(sum1 & CStr(c(i)))
                If Len(d(i)) Then sum2 = Application.Evaluate(sum2 & CStr(d(i)))
            End If
        Next
        If Abs(Round(sum1 - v1, 6)) < (0.1 ^ 6) And Abs(Round(sum2 - v2, 6)) < (0.1 ^ 6) Then
            Cells(2, write_col).Resize(UBound(res), 1) = WorksheetFunction.Transpose(res)
            write_col = write_col + 1
        End If
    Next
End Sub

此种方法不足之处:十进制转二进制Dec2Bin函数,取值范围太小,超过511就不适用;元素个数变化时需要修改第3、5-8行的代码,较为麻烦

结果

在这里插入图片描述
同样的原始数据,输出结果相同,但顺序不同

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

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

相关文章

树上钟同步

#include<cstdio> #include<cstring> #include<vector> using namespace std;const int N 2505; int ori[N], f[N]; vector<int> edge[N]; // 邻接表的简单实现形式void dfs(int u, int fa) {for (int v : edge[u]) {if (v fa) continue;dfs(v, u);f…

网络协议从入门到底层原理学习(一)—— 简介及基本概念

文章目录 网络协议从入门到底层原理学习&#xff08;一&#xff09;—— 简介及基本概念一、简介1、网络协议的定义2、网络协议组成要素3、广泛的网络协议类型网络通信协议网络安全协议网络管理协议 4、网络协议模型对比图 二、基本概念1、网络互连模型2、计算机之间的通信基础…

Prompt Tuning训练过程

目录 0. 入门 0.1. NLP发展的四个阶段&#xff1a; Prompt工程如此强大&#xff0c;我们还需要模型训练吗&#xff1f; - 知乎 Prompt learning系列之prompt engineering(二) 离散型prompt自动构建 Prompt learning系列之训练策略篇 - 知乎 ptuning v2 的 chatglm垂直领域训练记…

【zookeeper】zookeeper日常运维

本文将分享一些zookeeper在日常使用中一些维护经验。 zookeeper清理快照 脚本或者命令清理 zookeeper长时间运行&#xff0c;快照逐渐增多可能造成服务器磁盘被占满的情况&#xff0c;但我们不能贸然用rm命令删除快照文件&#xff0c;如果直接删完会导致丢失好多数据&#x…

【Yellowbrick】特征可视化分析

Yellowbrick特征可视化分析 ⭐Yellowbrick⭐特征分析可视化⭐Rank1D⭐Rank2D ⭐Yellowbrick Yellowbrick是一个用于可视化机器学习模型和评估性能的Python库。它提供了一系列高级可视化工具&#xff0c;帮助数据科学家和机器学习从业者更好地理解、调试和优化他们的模型。 它在…

【【STM32-29正点原子版本串口发送传输实验】

STM32-29正点原子版本串口发送传输实验 通过串口接收或发送一个字符 例程目的 开发板上我们接入的是实现异步通信的UART接口 USB转串口原理图 我们一步步分析 PA9是串口1 的发送引脚 PA10是串口1 的接受引脚 。因为我们现在只是用到异步收发器功能&#xff0c;所以我们现…

应用可视化流程设计,实现提质增效流程化办公!

如果想要实现提高办公效率的目的&#xff0c;显然采用传统的办公方式是无法实现的。如今&#xff0c;在低代码技术平台深入无纸化办公的当下&#xff0c;应用可视化流程设计软件&#xff0c;可以借助其灵活、易操作、可视化、轻量级等优势特点&#xff0c;助力广大用户实现流程…

图解SQL查询之去重技巧:如何使用DISTINCT对数据进行去重

使用 SQL 的 DISTINCT 关键字&#xff0c;可以去除重复的数据记录&#xff0c;只保留不同的记录。 以下是用到的表。 例如&#xff0c;要获取所有学生所在班级的唯一班级ID。

工业4G路由器的户外组网与无人值守场景应用

工业4G路由器是专为不便电缆布线的工业或日晒雨淋网络不畅的户外环境所设计的网络设备。它能够在没有光纤宽带的情况下使用插卡的方式提供4G或无线WiFi的网络支持。具备工业级防水功能&#xff0c;能够在户外环境下进行网络部署&#xff0c;并实现无人值守运行。工业4G路由器还…

使用Xshell串口通过Ymodem协议发送文件

一. 虚拟串口 首先使用虚拟串口软件Free Virtual Serial Ports&#xff08;下载链接&#xff09;创建一对虚拟串口&#xff0c;如图COM1和COM2&#xff0c;然后COM1用Xshell连接&#xff0c;COM2用串口助手连接&#xff0c;二者连接的波特率需一致&#xff1b;Xshell创建串口连…

css中的z-index是什么

css中的z-index是什么 在 CSS 中&#xff0c;有一个属性可以显式控制 HTML 元素的堆叠顺序&#xff1a;z-index。具有较高值的​​元素就会出现在顶部&#xff1a; <style>.box {position: relative;width: 50px;height: 50px;border: 3px solid;background: silver;}.…

【HAL库】STM32F407----内部Flash的读写

【HAL库】STM32CubeMX开发----STM32F407----目录 一、STM32存储器介绍 STM32存储器分为以下两种&#xff1a; 1. 随机存储器—RAM RAM是与CPU直接交换数据的内部存储器&#xff0c;也叫主存&#xff08;内存&#xff09;。它可以随时读写&#xff0c;而且速度很快&#xff0…

记录--移动端的双击事件好不好用?

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 2023年了&#xff0c;我不允许还有人不会自己实现移动端的双击事件。 过来&#xff0c;看这里&#xff0c;不足 50 行的代码实现的双击事件。 听笔者娓娓道来。 dblclick js原生有个dblclick双击…

大文件上传demo,前端基于Uppy,后端基于koa

前言 文件上传基本上所有的管理系统之类的项目都有这么一个功能。因为使用了Element&#xff0c;可以方便的使用 其提供的Upload组件&#xff0c;对于普通上传来说基本上就够用了。但是有时候会涉及到大文件上传的需求&#xff0c;这时就会面临一些问题&#xff1a;比如文件上…

使用QPixmap显示图片

在QT中&#xff0c;经常需要我们显示图片&#xff08;作为背景&#xff0c;游戏元素&#xff0c;菜单背景&#xff0c;等待&#xff09;。 本文将用最简洁的方法介绍如何将图片素材显示在指定控件的指定位置。 一.基础知识 QPixmap 该类可以加载&#xff08;load&#xff0…

算法:合并两个有序数组---双指针[1]

1、题目&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&a…

什么是websockret连接

什么是WebSocket WebSocket&#xff0c;是一种网络传输协议&#xff0c;位于 OSI 模型的应用层。可在单个 TCP 连接上进行全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通迅 客户端和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&am…

一种结合白平衡统计信息和曝光信息的软光敏算法专利学习(专利三)

基础理论&#xff1a; 亮度计算&#xff1a; 对于白天模式而言&#xff0c;IR滤光片处于过滤红外光的状态&#xff0c;也就是说&#xff0c;摄像机的感光芯片所感受到的环境光中的红外光几乎为零&#xff1b;而对于夜晚模式而言&#xff0c;IR滤光片处于不过滤红外光的状态&am…

ABB 3BHB002916R0001 UFC721AE模拟输入卡

通道数目&#xff1a; UFC721AE 模拟输入卡通常具有多个输入通道&#xff0c;可以同时监测多个模拟信号。 输入类型&#xff1a; 这种卡片通常支持不同类型的模拟输入&#xff0c;例如电压信号、电流信号或其他传感器信号。 精度&#xff1a; UFC721AE 模拟输入卡通常具有高精…

树莓 LUMA-OLED.EXAMPLE使用

详细介绍在文件目录下的README.rst中 第一步 $ sudo usermod -a -G i2c,spi,gpio pi //好像没什么用 $ sudo apt install python3-dev python3-pip python3-numpy libfreetype6-dev libjpeg-dev build-essential //安装依赖包&#xff0c;树莓派中好像已经有了 $ sudo a…