excel VBA进行间比法设计

news2024/9/21 3:22:19

在品比试验大家多使用间比法试验设计,这里通过excel VBA实现间比法设计,代码如下:

Sub 生成试验设计()

Dim ws As Worksheet
Dim rng As Range, rng2 As Range, rng3 As Range
Dim cell As Range, lastcell As Range
Dim rd As String, sn As String, pl As String   'rd为是否随机排列品种顺序,sn即sheetname的简称,pl即排在sheet表中的方向的简称
Dim ck As String, var_num As Integer, pl2 As String, method As String    ' method即对照设置方法,var_num即对照间品种数量,pl2即品种在每排的排列方式
Dim row_num As Integer    '每排行数
Dim i As Integer, j As Integer, r As Integer, s As Integer, m As Integer, n As Integer, lastRow As Integer
Dim t_num As Integer, c_num As Integer, ck_num As Integer   't_num为加上对照后总的品种数,c_num为总列数
Dim arr As Variant, arr2 As Variant, rngValues As Variant, tmp As Variant
Dim arr5 As Variant, arr6 As Variant
Dim col_min As Integer, col_max As Integer, row_min As Integer, row_max As Integer

Application.ScreenUpdating = False       '刷新屏幕关闭
Application.DisplayAlerts = False        '警告提示框关闭



'获取初始设置
sn = Range("A2").Value    '新建工作表的名称
rd = Range("A5").Value   '是否随机排列品种顺序
pl = Range("A8").Value    '试验设计是横向排列还是纵向排列
row_num = Range("A11").Value    '每排行数
pl2 = Range("A14").Value    '品种在排之间的排列方式
method = Range("A17").Value  '对照的设置方法
var_num = Range("A20").Value  '对照间品种的间隔数
ck = Range("A23").Value    '设置对照名称,默认为“CK”



'获取品种名称
lastRow = Range("C10000").End(xlUp).Row    '获取品种名称列的最后一行的行号
Set rng = Range("C2:C" & lastRow)


' 将范围内的值存储在数组中
rngValues = rng.Value
ReDim arr(UBound(rngValues)) As Variant
arr = rngValues

' 随机排列数组中的元素
If rd = "是" Then
    Randomize ' 初始化随机数生成器
    For m = LBound(arr) To UBound(arr) - 1
        n = Int((UBound(arr) - m + 1) * Rnd + m)
        ' 交换元素
        tmp = arr(m, 1)
        arr(m, 1) = arr(n, 1)
        arr(n, 1) = tmp
    Next m
End If

If method = "逢X法" Then
    '确定包含对照的总品种数量
    t_num = lastRow - 1 + Int((lastRow - 1) / (var_num))

        
    '设置排区号的数组
    ReDim arr2(1 To t_num, 1 To 4) As Variant
    
    '确定排数,并将含有对照的品种名称列入新的数组中
    If t_num Mod row_num Then
        c_num = Int(t_num / row_num) + 1
        '将含有对照的品种信息列入新数组中
        r = 1
        s = 1
        For i = 1 To c_num - 1
            For j = 1 To row_num
                arr2(r, 1) = i
                arr2(r, 2) = j
                arr2(r, 3) = r
                If r Mod (var_num + 1) = 1 Then
                    arr2(r, 4) = ck
                    r = r + 1
                Else
                    arr2(r, 4) = arr(s, 1)
                    r = r + 1
                    s = s + 1
                End If
            Next
        Next
        
        For j = 1 To (t_num Mod row_num)
            arr2(r, 1) = c_num
            arr2(r, 2) = j
            arr2(r, 3) = r
            If r Mod (var_num + 1) = 1 Then
                arr2(r, 4) = ck
                r = r + 1
            Else
                arr2(r, 4) = arr(s, 1)
                r = r + 1
                s = s + 1
            End If
        Next
        
    Else
        c_num = Int(t_num / row_num)
        '将含有对照的品种信息列入新数组中
        r = 1
        s = 1
        For i = 1 To c_num
            For j = 1 To row_num
                arr2(r, 1) = i
                arr2(r, 2) = j
                arr2(r, 3) = r
                If r Mod 10 = 1 Then
                    arr2(r, 4) = ck
                    r = r + 1
                Else
                    arr2(r, 4) = arr(s, 1)
                    r = r + 1
                    s = s + 1
                End If
            Next
        Next
        
    End If

Else
    
    '常规法设置对照
    '确定单排ck数量
    If (row_num - 1) Mod (var_num + 1) Then
        ck_num = 1 + Int((row_num - 1) / (var_num + 1)) + 1
    Else
        ck_num = 1 + Int((row_num - 1) / (var_num + 1))
    End If
    '确定总排数和含对照的总品种数量
    c_num = Int((lastRow - 1) / (row_num - ck_num))
    If (lastRow - 1) Mod (row_num - ck_num) Then
        c_num = c_num + 1
        t_num = (lastRow - 1) + (c_num - 1) * ck_num
        If (lastRow - 1 - (c_num - 1) * (row_num - ck_num)) Mod var_num Then
            t_num = t_num + 1 + Int((lastRow - 1 - (c_num - 1) * (row_num - ck_num)) / var_num) + 1
        Else
            t_num = t_num + 1 + Int((lastRow - 1 - (c_num - 1) * (row_num - ck_num)) / var_num)
        End If
    Else
        c_num = c_num
        t_num = (lastRow - 1) + c_num * ck_num
    End If
        
    '设置排区号的数组
    ReDim arr2(1 To t_num, 1 To 4) As Variant
    
    '确定排数,并将含有对照的品种名称列入新的数组中
    If t_num Mod row_num Then
        c_num = Int(t_num / row_num) + 1
        '将含有对照的品种信息列入新数组中
        r = 1
        s = 1
        For i = 1 To c_num - 1
            For j = 1 To row_num
                arr2(r, 1) = i
                arr2(r, 2) = j
                arr2(r, 3) = r
                If j Mod (var_num + 1) = 1 Then
                    arr2(r, 4) = ck
                    r = r + 1
                ElseIf j = row_num Then
                    arr2(r, 4) = ck
                    r = r + 1
                Else
                    arr2(r, 4) = arr(s, 1)
                    r = r + 1
                    s = s + 1
                End If
            Next
        Next
        
        For j = 1 To (t_num Mod row_num)
                arr2(r, 1) = c_num
                arr2(r, 2) = j
                arr2(r, 3) = r
                If j Mod (var_num + 1) = 1 Then
                    arr2(r, 4) = ck
                    r = r + 1
                ElseIf j = (t_num Mod row_num) Then
                    arr2(r, 4) = ck
                    r = r + 1
                Else
                    arr2(r, 4) = arr(s, 1)
                    r = r + 1
                    s = s + 1
                End If
        Next
        
    Else
        c_num = Int(t_num / row_num)
        '将含有对照的品种信息列入新数组中
        r = 1
        s = 1
        For i = 1 To c_num
            For j = 1 To row_num
                arr2(r, 1) = i
                arr2(r, 2) = j
                arr2(r, 3) = r
                If j Mod (var_num + 1) = 1 Then
                    arr2(r, 4) = ck
                    r = r + 1
                ElseIf j = row_num Then
                    arr2(r, 4) = ck
                    r = r + 1
                Else
                    arr2(r, 4) = arr(s, 1)
                    r = r + 1
                    s = s + 1
                End If
            Next
        Next
        
    End If
    
    
End If

'对数组进行之字排列
If pl2 = "之字" Then
    arr2 = zhizi(arr2, t_num, row_num, c_num)
End If

' 新建一个工作表,用于生成带有排区号的整列数据
Set ws = ThisWorkbook.Sheets.Add
If sn <> "" Then
    ws.Name = sn      ' 将新工作表的名称设置为"新工作表"
End If

'工作表内数据录入
ws.Cells(1, 1).Value = "排号"
ws.Cells(1, 2).Value = "行号"
ws.Cells(1, 3).Value = "序号"
ws.Cells(1, 4).Value = "品种名称"

For i = 2 To t_num + 1
    For j = 1 To 4
        ws.Cells(i, j).Value = arr2(i - 1, j)
    Next
Next

'设置格式
Set rng2 = Range(ws.Cells(1, 1), ws.Cells(i - 1, j - 1))
'对单元格进行居中设置,添加边框
Call biankuang(ws, rng2)


Set rng = ws.Range("A1").CurrentRegion
col_max = WorksheetFunction.Max(ws.Range("A2:A" & (rng.Rows.Count)))
col_min = WorksheetFunction.Min(ws.Range("A2:A" & (rng.Rows.Count)))
row_max = WorksheetFunction.Max(ws.Range("B2:B" & (rng.Rows.Count)))
row_min = WorksheetFunction.Min(ws.Range("B2:B" & (rng.Rows.Count)))


'将行排号和品种名称放入数组,用于xlookup查询
ReDim arr5(1 To rng.Rows.Count - 1)
ReDim arr6(1 To rng.Rows.Count - 1)
For i = 2 To rng.Rows.Count
    arr5(i - 1) = CStr(rng(i, 1)) & " " & CStr(rng(i, 2))
    arr6(i - 1) = rng(i, 4)
Next

If pl = "纵向" Then
    '输入列号
    j = 1
    For i = col_min To col_max
        ws.Cells(1, j + 7).Value = i
        j = j + 1
    Next
    '输入行号
    j = 1
    For i = row_min To row_max
        ws.Cells(j + 1, 7).Value = i
        j = j + 1
    Next
                
    '将品种名称放入对应行排号的单元格中
    For i = 8 To col_max - col_min + 8
        For j = 2 To row_max - row_min + 2
            ws.Cells(j, i).Value = WorksheetFunction.XLookup(CStr(ws.Cells(1, i)) & " " & CStr(ws.Cells(j, 7)), arr5, arr6, "空", 0, 1)
        Next
    Next

Else
    '输入行号
    j = 1
    For i = row_min To row_max
        ws.Cells(1, j + 7).Value = i
        j = j + 1
    Next
    '输入列号
    j = 1
    For i = col_min To col_max
        ws.Cells(j + 1, 7).Value = i
        j = j + 1
    Next
                
    '将品种名称放入对应行排号的单元格中
    For i = 8 To row_max - row_min + 8
        For j = 2 To col_max - col_min + 2
            ws.Cells(j, i).Value = WorksheetFunction.XLookup(CStr(ws.Cells(j, 7)) & " " & CStr(ws.Cells(1, i)), arr5, arr6, "空", 0, 1)
        Next
    Next
    
End If





Application.ScreenUpdating = True       '刷新屏幕开启
Application.DisplayAlerts = True        '警告提示框开启

End Sub


Sub biankuang(ws As Worksheet, rng As Range)
    '边框和居中设置子程序
    '对单元格进行居中设置
    ws.Cells(1, 1).CurrentRegion().HorizontalAlignment = xlCenter
    ws.Cells(1, 1).VerticalAlignment = xlCenter
    '对田间种植区域添加边框
    With rng.Borders
        .LineStyle = xlContinuous
        .Weight = xlThin
        .Color = RGB(0, 0, 0) ' 黑色
    End With
End Sub

Function zhizi(arr As Variant, t_num As Integer, row_num As Integer, c_num As Integer)
    'zhizi即“之字”,之字排列函数
    Dim arr3 As Variant
    Dim i_z As Integer, j_z As Integer
    
    ReDim arr3(1 To t_num, 1 To 4) As Variant
    For i_z = 1 To t_num
        If arr(i_z, 1) Mod 2 Then
            arr3(i_z, 1) = arr(i_z, 1)
            arr3(i_z, 2) = arr(i_z, 2)
            arr3(i_z, 3) = arr(i_z, 3)
            arr3(i_z, 4) = arr(i_z, 4)
        Else
            arr3(i_z, 1) = arr(i_z, 1)
            arr3(i_z, 2) = arr(row_num - arr(i_z, 2) + 1, 2)
            arr3(i_z, 3) = arr(i_z, 3)
            arr3(i_z, 4) = arr(i_z, 4)
        End If
    Next
    zhizi = arr3
End Function

设置界面如下:

参数说明:

1、是否随机排列:是对上图右侧品种顺序是否进行随机排列,如果选择将将随机排列,如果选择否,将按照给定的顺序排列

2、表格中的排列方向:若选择横向,则以行为排;若选择纵向,则以列为排

3、每排的行数:这里的行数是指田间的小区数。

4、排列方式:分为顺序排列和“之字”型配列。

5、对照设置:逢X法,即在1的位置放置对照,后面每间隔固定长度设置一个对照;常规法,即在一排的首尾设置对照,并且在一排内间隔固定长度设置一个对照

6、对照间隔数:即两个对照品种之间间隔的小区数量。

7、对照名称:默认为CK,也可以设置为具体的名称。

图1:不随机排列,排列方向横向,每排11行,之字排列,常规法设置对照

图2:不随机排列,排列方向横向,每排10行,之字排列,逢X法设置对照

图3:不随机排列,纵向,每排15行,之字排列,逢X法

图4:随机,纵向,顺序排列,每排11行,常规法设置对照,对照间隔为4行

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

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

相关文章

SpringBootWeb增删改查入门案例

前言 为了快速入门一个SpringBootWeb项目&#xff0c;这里就将基础的增删改查的案例进行总结&#xff0c;作为对SpringBootMybatis的基础用法的一个巩固。 准备工作 需求说明 对员工表进行增删改查操作环境搭建 准备数据表 -- 员工管理(带约束) create table emp (id int …

论文阅读 | 基于流模型和可逆噪声层的鲁棒水印框架(AAAI 2023)

Flow-based Robust Watermarking with Invertible Noise Layer for Black-box DistortionsAAAI, 2023&#xff0c;新加坡国立大学&中国科学技术大学本论文提出一种基于流的鲁棒数字水印框架&#xff0c;该框架采用了可逆噪声层来抵御黑盒失真。 一、问题 基于深度神经网络…

spring boot admin集成,springboot2.x集成监控

服务端&#xff1a; 1. 新建monitor服务 pom依赖 <!-- 注意这些只是pom的核心东西&#xff0c;不是完整的pom.xml内容&#xff0c;不能直接使用&#xff0c;仅供参考使用 --><packaging>jar</packaging><dependencies><dependency><groupId&g…

STM32 芯片启动过程

目录 一、前言二、STM32 的启动模式三、STM32 启动文件分析1、栈 Stack2、堆 Heap3、中断向量表 Vectors3.1 中断响应流程 4、复位程序 Reset_Handler5、中断服务函数6、用户堆栈初始化 四、STM32 启动流程分析1、初始化 SP、PC 及中断向量表2、设置系统时钟3、初始化堆栈并进入…

【Linux】POSIX信号量与、基于环形队列实现的生产者消费者模型

目录 一、POSIX信号量概述 信号量的基本概念 信号量在临界区的作用 与互斥锁的比较 信号量的原理 信号量的优势 二、信号量的操作 1、初始化信号量&#xff1a;sem_init 2、信号量申请&#xff08;P操作&#xff09;&#xff1a;sem_wait 3、信号量的释放&#xff08…

树——数据结构

这次我来给大家讲解一下数据结构中的树 1. 树的概念 树是一种非线性的数据结构&#xff0c;它是由n(n>0&#xff09;个有限结点组成一个具有层次关系的集合。 叫做树的原因&#xff1a;看起来像一棵倒挂的树&#xff0c;根朝上&#xff0c;叶朝下。 特殊结点&#xff1a…

Vim编辑器常用命令

目录 一、命令模式快捷键 二、编辑/输入模式快捷键 三、编辑模式切换到命令模式 四、搜索命令 一、命令模式快捷键 二、编辑/输入模式快捷键 三、编辑模式切换到命令模式 四、搜索命令

深圳铨顺宏科技展邀您体验前沿人工智能技术

我们诚挚地邀请您参加即将举行的展会&#xff0c;探索RFID技术在资产与人员管理中的广泛应用。这些展会将为您提供一个深入了解前沿技术和创新解决方案的机会。 东莞台湾名品博览会&#xff08;东莞台博会&#xff09;展会时间&#xff1a;9月5日至8日。此次展会展示了来自台湾…

路由器全局配置DHCP实验简述

一、路由器配置 reset saved-configuration Warning: The action will delete the saved configuration in the device. The configuration will be erased to reconfigure. Continue? [Y/N]:y Warning: Now clearing the configuration in the device. Info: Succeeded in c…

如何配置 Apache 反向代理服务器 ?

将 Apache 配置为反向代理意味着将 Apache 设置为侦听和引导 web 流量到后端服务器或服务。这有助于管理和平衡服务器上的负载&#xff0c;提高安全性&#xff0c;并使您的 web 服务更高效。您还可以将其设置为监听标准 HTTP 和 HTTPS 端口上的请求&#xff0c;并将其重定向到运…

基于Leaflet和天地图的直箭头标绘实战-源码分析

目录 前言 一、Leaflet的特种标绘库 1、特种标绘对象的定义 2、Plot基类定义 3、直线箭头的设计与实现 二、在天地图中进行对象绘制 1、引入天地图资源 2、标绘对象的调用时序 3、实际调用过程 三、总结 前言 在博客中介绍过geoman标绘的具体实现&#xff0c;使用Leaf…

Linux驱动开发 ——架构体系

只读存储器&#xff08;ROM&#xff09; 1.作用 这是一种非易失性存储器&#xff0c;用于永久存储数据和程序。与随机存取存储器&#xff08;RAM&#xff09;不同&#xff0c;ROM中的数据在断电后不会丢失&#xff0c;通常用于存储固件和系统启动程序。它的内容在制造时或通过…

教师薪酬管理系统的设计与实现

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;老师信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

【专题】2024中国生物医药出海现状与趋势蓝皮书报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37719 出海已成为中国医药产业实现提速扩容的重要途径。目前&#xff0c;中国医药产业发展态势良好&#xff0c;创新能力不断增强&#xff0c;然而也面临着医保政策改革和带量集采带来的压力。政府积极出台多项政策支持医药企业出海…

人工智能 | 基于ChatGPT开发人工智能服务平台

简介 ChatGPT 在刚问世的时候&#xff0c;其产品形态就是一个问答机器人。而基于ChatGPT的能力还可以对其做一些二次开发和拓展。比如模拟面试功能、或者智能机器人功能。 模拟面试功能包括个性化问题生成、实时反馈、多轮面试模拟、面试报告。 智能机器人功能提供24/7客服支…

字节跳动冯佳时:大语言模型在计算机视觉领域的应用、问题和我们的解法

演讲嘉宾&#xff5c;冯佳时 编辑 &#xff5c;蔡芳芳 近年来&#xff0c;大语言模型 (LLMs) 在文本理解与生成领域取得了显著进展。然而&#xff0c;LLMs 在理解和生成自然信号&#xff08;例如图像&#xff0c;视频&#xff09;等&#xff0c;还处在比较早期的探索阶段。为…

muduo - 概要简述

作者&#xff1a;陈硕 编程语言&#xff1a;C 架构模式&#xff1a;Reactor 代码链接&#xff1a;GitHub - chenshuo/muduo: Event-driven network library for multi-threaded Linux server in C11 设计自述&#xff1a;https://www.cnblogs.com/Solstice/archive/2010/08…

MybatisPlus:多条件 or()的使用

default List<ErpProductDO> selectByOE(String oe1, String oe2){return selectList(new LambdaUpdateWrapper<ErpProductDO>().eq(ErpProductDO::getOe,oe1).or().eq(ErpProductDO::getOe,oe2)); } 对应SQL为&#xff1a;

《探索云原生与相关技术》

在当今的科技领域中&#xff0c;云原生&#xff08;Cloud Native&#xff09;已经成为了一个热门的话题。它代表着一种构建和运行应用程序的全新方式。 云原生的概念 云原生是一套技术体系和方法论&#xff0c;旨在充分利用云计算的优势来构建更具弹性、可扩展性和高效性的应…

LeetCode 2332.坐上公交的最晚时间 (双指针 + 贪心)

给你一个下标从 0 开始长度为 n 的整数数组 buses &#xff0c;其中 buses[i] 表示第 i 辆公交车的出发时间。同时给你一个下标从 0 开始长度为 m 的整数数组 passengers &#xff0c;其中 passengers[j] 表示第 j 位乘客的到达时间。所有公交车出发的时间互不相同&#xff0c;…