在Office的PPT中,利用ActiveX控件和VBA代码实现相关功能

前言:笔者使用的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-CSDN博客

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  

  • 22
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值