前言:笔者使用的office版本为 office 2021家庭或学生版
实现功能:
桥宽从TextBox2中获得,桥长从TextBox1中获得,相机数量默认为1台,但其最大相机数量为(ComboBox1 ):(桥宽/1.82)取整。图像采集小车的移动速度为TextBox3控件中的值,如果TextBox3中的值大于3m/s,则需要弹框提醒用户,最大限速为3m/s ,并进行重新输入有效数据。无人巡检大车的移动速度为TextBox4控件中的值,如果TextBox4 中的值大于0.42m/s,则需要弹框提醒用户,最大限速为0.42m/s ,并进行重新输入有效数据。
横桥向图像完整采集一次需要时间:t_h=(桥宽/(1.82* ComboBox1))*(1.82/ TextBox3 的值),结果传给Label2显示。
顺桥向图像完整采集一次需要的时间:t_s= t_h +2.74/TextBox4的值,结果传给Label3显示。
整个桥梁需要花费时间:t_z= TextBox1 /2.74*t_s/3600。并将结果传给Label1显示。
总结就是:笔者想在ppt中做一个给四个输入,经过公式计算,生成对应的输出。下面看如何实现这一功能。
还不知道怎么打开开发工具,并且允许运行宏文件的同学,请看笔者另一篇博文:excel中利用VBA实现筛选功能_excel筛选vba-优快云博客
1、打开开发工具,找到ActiveX控件,如下图所示:
选中需要的插件,在ppt页面上进行推拽,根据自己想要的方式布置好需要的控件。
2、笔者布置了4个TextBox1(文本框)、1个ComboBox1(组合框,用于做下来列表)、1个按钮和3个标签(Label)。详情见下图所示。
3、开始编写各个部分的VBA代码。
3.1)编写TextBox1,桥长对巡检时间的影响,笔者设置的触发条件为失去焦点后触发。
Private Sub TextBox1_LostFocus()
' 桥长处理
Dim bridgeLength As Double
bridgeLength = GetValidNumber(TextBox1.Value, "请输入有效的桥长数值!")
If Not IsNumeric(bridgeLength) Then Exit Sub
End Sub
3.2)编写TextBox2_LostFocus。桥宽对巡检时间的影响,并且决定最大相机数量。
Private Sub TextBox2_LostFocus()
' 当TextBox2的值改变时,更新相机数量
Dim bridgeWidth As Double
Dim maxCameraCount As Integer
Dim i As Integer
' 获取桥宽的值
bridgeWidth = GetValidNumber(TextBox2.Value, "请输入有效的桥宽数值!")
' 如果桥宽不是数字或小于等于0,显示错误消息并退出
If IsError(bridgeWidth) Or bridgeWidth <= 0 Then
MsgBox "请输入有效的桥宽数值!", vbExclamation
Exit Sub
End If
' 清除ComboBox1的所有项
ComboBox1.Clear
' 计算最大相机数量并取整
maxCameraCount = Int(bridgeWidth / 1.82)
' 如果最大相机数量为0或小于1,则添加默认值1到ComboBox1
If maxCameraCount < 1 Then
maxCameraCount = 1
End If
' 添加相机数量到ComboBox1,从1到最大相机数量
For i = 1 To maxCameraCount
ComboBox1.AddItem CStr(i)
Next i
' 设置ComboBox1的默认值(第一台相机)
ComboBox1.ListIndex = 0
End Sub
3.3)编写TextBox3,小车的移动速度对巡检时间的影响。
Private Sub TextBox3_LostFocus()
CheckSpeedLimitTextBox3
End Sub
Private Sub CheckSpeedLimitTextBox3()
Const MaxSpeed As Double = 3 ' 定义最大速度常量
Dim speed As Double
speed = GetValidNumber(TextBox3.Value, "请输入有效的图像采集小车速度数值!")
If Not IsNumeric(speed) Then Exit Sub
' 检查速度是否超过限制
If speed > MaxSpeed Then
MsgBox "图像采集小车的移动速度不能超过" & MaxSpeed & "m/s,请重新输入。", vbExclamation
TextBox3.Value = 1.5 ' 为了防止出错,默认1.5m/s
End If
End Sub
3.4)编写TextBox3,大车的移动速度对巡检时间的影响
Private Sub TextBox4_LostFocus()
CheckSpeedLimitTextBox4
End Sub
Private Sub CheckSpeedLimitTextBox4()
Dim speed As Double
speed = GetValidNumber(TextBox4.Value, "请输入有效的无人巡检大车速度数值!")
If Not IsNumeric(speed) Then Exit Sub
' 检查速度是否超过限制
If speed > 0.42 Then
MsgBox "无人巡检大车的移动速度不能超过0.42m/s,请重新输入。", vbExclamation
TextBox4.Value = 0.25 ' 为了防止出错,默认0.25m/s
End If
End Sub
3.5)编写按钮CommandButton1_Click代码块和另外零个需要用到的辅助函数,CalculateTimes用于计算时间,验证输入数据的有效性。
Private Sub CommandButton1_Click()
CalculateTimes
End Sub
' 计算时间
Private Sub CalculateTimes()
Dim bridgeWidth As Double
Dim bridgeLength As Double
Dim cameraCount As Integer
Dim speedCar As Double
Dim speedTruck As Double
Dim t_h As Double
Dim t_s As Double
Dim t_z As Double
' 获取桥长和桥宽的值
bridgeLength = CDbl(TextBox1.Value)
bridgeWidth = CDbl(TextBox2.Value)
cameraCount = CInt(ComboBox1.Value)
speedCar = CDbl(TextBox3.Value)
speedTruck = CDbl(TextBox4.Value)
' 检查速度是否有效
If speedCar = 0 Or speedTruck = 0 Then
MsgBox "速度值不能为零,请重新输入。", vbExclamation
TextBox3.Value = 0.25
Exit Sub
End If
' 检查相机数量是否为空
If cameraCount = 0 Then
MsgBox "相机数量不能为空,请重新输入。", vbExclamation
ComboBox1.Value = 1
Exit Sub
End If
' 计算横桥向图像完整采集一次所需时间t_h
t_h = (bridgeWidth / (1.82 * cameraCount)) * (1.82 / speedCar)
' 更新Label2显示t_h,
Label2.Caption = FormatNumber(t_h, 2)
' 计算顺桥向图像完整采集一次所需时间t_s
t_s = t_h + 2.74 / speedTruck
' 更新Label3显示t_s,并居中
Label3.Caption = FormatNumber(t_s, 2)
' 计算整个桥梁需要花费时间t_z
t_z = (bridgeLength / 2.74) * t_s / 3600
' 更新Label1显示t_z,并居中
Label1.Caption = FormatNumber(t_z, 2)
End Sub
' 辅助函数:获取有效的数字输入
Private Function GetValidNumber(ByVal inputValue As String, ByVal errorMessage As String) As Double
On Error Resume Next ' 忽略后续可能出现的错误,以便代码继续执行
Dim validNumber As Double ' 定义一个变量用于存储转换后的数字
validNumber = CDbl(inputValue) ' 尝试将字符串转换为双精度浮点数
' 检查是否有错误发生(即转换是否成功)
If Err.Number <> 0 Then
MsgBox errorMessage, vbExclamation
' 设置validNumber为默认值(这里是0.25,可以根据需要更改)
validNumber = 0.25 ' 或者其他默认值
End If
' 关闭错误忽略,使后续代码在出现错误时正常处理
On Error GoTo 0
' 返回转换后的数字或默认值
GetValidNumber = validNumber
End Function
4、结果如下:
图1 当相机数量为6时,巡检一次需要的时间为2.2h
图2