一个可以自动生成随机区组试验的excel VBA小程序

devtools/2024/9/23 21:12:25/

        在作物品种区域试验时,通常会采用随机区组试验设计,特制作了一个可以自动生成随机区组试验的小程序excel参数界面如下:

参数含义如下:

1、生成新表的名称:程序将新建表格,用于生成随机区组试验。若此处为空,则为系统默认的新建表格名称,若含有名称,则新建表以此名称命名。

2、是否含排区号:若选择“是”,则以“1-1”的形式显示第几排,第几个小区。若选择“否”,则不显示,仅在标题处显示区组名称。

3、区组内品种排列方向:若为“横向”,则表格中在同一行中排列一个区组的不同品种;如选择“纵向”,则表格中在同一列中排列一个区组的不同品种。

4、区组数量:表示需要设置的区组数量,通常为3。

以上图中默认的设置运行代码,显示结果如下:

具体实现代码如下:

Sub 生成试验设计()Dim ws As Worksheet, tg_ws As Worksheet
Dim rng As Range, rng2 As Range
Dim cell As Range, lastcell As Range
Dim pq As String, sn As String, pl As String   'pq即排区号的简称,sn即sheetname的简称,pl即排列的简称
Dim qz_num As Integer
Dim i As Integer, j As Integer, lastRow As Integer
Dim m As Integer, n As Integer
Dim arr As Variant, rngValues As Variant, tmp As VariantApplication.ScreenUpdating = False       '刷新屏幕关闭
Application.DisplayAlerts = False        '警告提示框关闭'获取初始设置
sn = Range("A2").Value    '新建工作表的名称
pq = Range("A5").Value   '是否包含排区号
pl = Range("A8").Value    '试验设计是横向排列还是纵向排列
qz_num = Range("A11").Value    '区组的数量'获取品种名称
lastRow = Range("C10000").End(xlUp).Row    '获取品种名称列的最后一行的行号
Set rng = Range("C2:C" & lastRow)' 新建一个工作表,用于生成随机区组试验设计
Set ws = ThisWorkbook.Sheets.Add
If sn <> "" Thenws.Name = sn       ' 将新工作表的名称设置为"新工作表"
End If' 将范围内的值存储在数组中
rngValues = rng.Value
ReDim arr(UBound(rngValues)) As VariantIf pq = "否" Then    '没有排区号的情况Select Case plCase "横向"'输入行标题For i = 1 To qz_numws.Cells(i, 1).Value = "区组" & iNext'将品种名称放入对应行排号的单元格中For j = 1 To qz_num    '对行号循环' 随机排列数组中的元素arr = rngValuesRandomize ' 初始化随机数生成器For m = LBound(arr) To UBound(arr) - 1n = Int((UBound(arr) - m + 1) * Rnd + m)' 交换元素tmp = arr(m, 1)arr(m, 1) = arr(n, 1)arr(n, 1) = tmpNext mFor i = 2 To lastRow    '对列号循环ws.Cells(j, i).Value = arr(i - 1, 1)NextNextSet rng2 = Range(ws.Cells(1, 1), ws.Cells(j - 1, i - 1))'对单元格进行居中设置ws.Cells(1, 1).CurrentRegion().HorizontalAlignment = xlCenterws.Cells(1, 1).VerticalAlignment = xlCenter'对田间种植区域添加边框With rng2.Borders.LineStyle = xlContinuous.Weight = xlThin.Color = RGB(0, 0, 0) ' 黑色End WithCase "纵向"'输入列标题For i = 1 To qz_numws.Cells(1, i).Value = "区组" & iNext'将品种名称放入对应行排号的单元格中For j = 1 To qz_num    '对列号循环' 随机排列数组中的元素arr = rngValuesRandomize ' 初始化随机数生成器For m = LBound(arr) To UBound(arr) - 1n = Int((UBound(arr) - m + 1) * Rnd + m)' 交换元素tmp = arr(m, 1)arr(m, 1) = arr(n, 1)arr(n, 1) = tmpNext mFor i = 2 To lastRow    '对行号循环ws.Cells(i, j).Value = arr(i - 1, 1)NextNextSet rng2 = Range(ws.Cells(1, 1), ws.Cells(i - 1, j - 1))'对单元格进行居中设置ws.Cells(1, 1).CurrentRegion().HorizontalAlignment = xlCenterws.Cells(1, 1).VerticalAlignment = xlCenter'对田间种植区域添加边框With rng2.Borders.LineStyle = xlContinuous.Weight = xlThin.Color = RGB(0, 0, 0) ' 黑色End WithCase ElseMsgBox "无此排列类型,请重新选择"End Select
Else    '有排区号的情况Select Case plCase "横向"'输入行标题For i = 1 To qz_num * 2 Step 2ws.Cells(i, 1).Value = "排区号"NextFor i = 2 To qz_num * 2 Step 2ws.Cells(i, 1).Value = "品种名称"Next'将品种名称放入对应行排号的单元格中For j = 1 To qz_num * 2  '对行号循环If j Mod 2 = 1 Then    '对行号进行判断,若为奇数则输入排区号For i = 2 To lastRow    '对列号循环ws.Cells(j, i).Value = "'" & (Int(j / 2) + 1) & "-" & (i - 1)NextElse    '对行号进行判断,若为偶数则输入品种名称' 随机排列数组中的元素arr = rngValuesRandomize ' 初始化随机数生成器For m = LBound(arr) To UBound(arr) - 1n = Int((UBound(arr) - m + 1) * Rnd + m)' 交换元素tmp = arr(m, 1)arr(m, 1) = arr(n, 1)arr(n, 1) = tmpNext mFor i = 2 To lastRow    '对列号循环ws.Cells(j, i).Value = arr(i - 1, 1)NextEnd IfNextSet rng2 = Range(ws.Cells(1, 1), ws.Cells(j - 1, i - 1))'对单元格进行居中设置ws.Cells(1, 1).CurrentRegion().HorizontalAlignment = xlCenterws.Cells(1, 1).VerticalAlignment = xlCenter'对田间种植区域添加边框With rng2.Borders.LineStyle = xlContinuous.Weight = xlThin.Color = RGB(0, 0, 0) ' 黑色End WithCase "纵向"'输入列标题For i = 1 To qz_num * 2 Step 2ws.Cells(1, i).Value = "排区号"NextFor i = 2 To qz_num * 2 Step 2ws.Cells(1, i).Value = "品种名称"Next'将品种名称放入对应行排号的单元格中For j = 1 To qz_num * 2  '对列号循环If j Mod 2 = 1 Then    '对列号进行判断,若为奇数则输入排区号For i = 2 To lastRow    '对列号循环ws.Cells(i, j).Value = "'" & (Int(j / 2) + 1) & "-" & (i - 1)NextElse    '对列号进行判断,若为偶数则输入品种名称' 随机排列数组中的元素arr = rngValuesRandomize ' 初始化随机数生成器For m = LBound(arr) To UBound(arr) - 1n = Int((UBound(arr) - m + 1) * Rnd + m)' 交换元素tmp = arr(m, 1)arr(m, 1) = arr(n, 1)arr(n, 1) = tmpNext mFor i = 2 To lastRow    '对列号循环ws.Cells(i, j).Value = arr(i - 1, 1)NextEnd IfNextSet rng2 = Range(ws.Cells(1, 1), ws.Cells(i - 1, j - 1))'对单元格进行居中设置ws.Cells(1, 1).CurrentRegion().HorizontalAlignment = xlCenterws.Cells(1, 1).VerticalAlignment = xlCenter'对田间种植区域添加边框With rng2.Borders.LineStyle = xlContinuous.Weight = xlThin.Color = RGB(0, 0, 0) ' 黑色End WithCase ElseMsgBox "无此排列类型,请重新选择"End Select
End IfApplication.ScreenUpdating = True       '刷新屏幕开启
Application.DisplayAlerts = True        '警告提示框开启End Sub


http://www.ppmy.cn/devtools/46502.html

相关文章

【plt保存图片的坑】python中为什么使用plt.savefig()保存图片为空白

检查一下&#xff0c;你是不是把plt.savefig()指令放在plt.show()之后了&#xff1f; plt.show()会创建一个新的空白图形窗口,用于显示当前的图形。 因此,在plt.show()之后调用plt.savefig(),实际上是在保存这个新创建的空白图形窗口,而不是之前绘制的图形。 所以把plt.savef…

Vue3实战笔记(61)—Vue 3 Watch进化论:解锁实时数据监听新境界

文章目录 前言基本使用总结 前言 Vue 3 中的 watch 功能相比Vue 2有了改进和扩展&#xff0c;旨在提供更灵活的数据监听方式。 基本使用 Vue 3中的watch可以用于Composition API和Options API&#xff0c;但Composition API的使用更为常见。它主要用于监听响应式数据的变化&a…

探究Spring中的Controller:单例、多例及其并发安全性

1. Spring框架的简介 Spring是一个开源的Java平台&#xff0c;用来简化企业级应用程序的开发。Spring框架提供了一整套统一的编程模型&#xff0c;使得开发人员能够更加专注于业务逻辑&#xff0c;而不必去处理复杂的技术细节。Spring包含多个模块&#xff0c;其中最常使用的就…

怎么用NodeJS脚本实现远程控制空调

怎么用NodeJS脚本实现远程控制空调呢&#xff1f; 本文描述了使用NodeJS脚本调用HTTP接口&#xff0c;实现控制空调&#xff0c;通过不同规格的通断器&#xff0c;来控制不同功率的空调的电源。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备…

Vuforia AR篇(六)— Mid Air 半空识别

目录 前言一、什么是Mid Air&#xff1f;二、使用步骤三、示例代码四、效果 前言 增强现实&#xff08;AR&#xff09;技术正在改变我们与数字世界的互动方式。Vuforia作为先进的AR开发平台&#xff0c;提供了多种工具来创造引人入胜的AR体验。其中&#xff0c;Mid Air功能以其…

ChatGPT 宕机部分用户访问报错 api key开发应用不影响

就在今日4号下午&#xff0c;有部分用户反映ChatGPT访问报错&#xff0c;不幸的是&#xff0c;ChatGPT 目前对某些用户不可用 - 该问题已被发现&#xff0c;OpenAI 团队正在努力解决它 似乎就api 开发使用key的应用不受影响 以下是对接ChatGPT api key开发的应用正常对话

Java线程安全问题

Java 线程安全问题 当我们使用多个线程访问同一资源&#xff08;可以是同一个变量、同一个文件、同一条记录等&#xff09;的时候&#xff0c;若多个线程只有读操作&#xff0c;那么不会发生线程安全问题。但是如果多个线程中对资源有读和写的操作&#xff0c;就容易出现线程安…

SOFA-RPC学习记录

文章目录 需求分析模块划分微服务模块交互模块 可拓展架构插件机制 功能分析交互模块 学习微服务模块交互模块 dubbo与nacos集成学习Nacos配置中心实战 dubbo与apollo集成学习配置中心组件与k8s的抉择参考资料 结论 本报告旨在深入学习SOFA-RPC框架&#xff0c;特别是其动态配置…