vba把excel表做成小软件 (excel中vba制作小程序)

excelvba代码添加附件控件,excelvba折叠工具区

线性内插在很多时候都会用到,今天我们用VBA写个线性内插的小程序,日后我们在处理数据时就可以随时随地调出线性内插工具使用了。

这里有用到VBA中的窗体和模块,窗体设计如下图,附上代码。有需要的可私信“线性内插”获取窗体及模块。

创建自己的选项卡及将程序添加到选项卡中,参照文章【VBA小程序的添加——创建自己的选项卡】

excelvba代码添加附件控件,excelvba折叠工具区

线性内插窗体设计

窗体代码:

Public resultNum
Private Sub CommandButton1_Click()
x1 = TextBox1.Value
x2 = TextBox2.Value
y1 = TextBox3.Value
y2 = TextBox4.Value
X = TextBox5.Value
y = TextBox6.Value
If x1 = "" Or x2 = "" Or y1 = "" Or y2 = "" Then MsgBox "请完善参数!", vbInformation, "提示": Exit Sub
If X = "" And y = "" Then
 MsgBox "请输入X或Y值!", vbInformation, "提示": TextBox1.SetFocus
ElseIf X = "" Then
 If y2 = y1 Then
 MsgBox "Y1与Y2不能为同一值!", vbInformation, "提示": TextBox3.SetFocus
 Else
 If TypeName(x1) = "String" Then x1 = Val(x1)
 If TypeName(x2) = "String" Then x2 = Val(x2)
 If TypeName(y1) = "String" Then y1 = Val(y1)
 If TypeName(y2) = "String" Then y2 = Val(y2)
 If TypeName(y) = "String" Then y = Val(y)
 X = x1 + (x2 - x1) / (y2 - y1) * (y - y1)
 Me.TextBox5.Value = X
 resultNum = X
 End If
ElseIf y = "" Then
 If x2 = x1 Then
 MsgBox "X1与X2不能为同一值!", vbInformation, "提示": TextBox1.SetFocus
 Else
 If TypeName(x1) = "String" Then x1 = Val(x1)
 If TypeName(x2) = "String" Then x2 = Val(x2)
 If TypeName(y1) = "String" Then y1 = Val(y1)
 If TypeName(y2) = "String" Then y2 = Val(y2)
 If TypeName(X) = "String" Then X = Val(X)
 y = y1 + (y2 - y1) / (x2 - x1) * (X - x1)
 Me.TextBox6.Value = y
 resultNum = y
 End If
Else
 MsgBox "请确保被求值为空!", vbInformation, "提示": TextBox5.SetFocus
End If
Application.ScreenUpdating = True
End Sub
Private Sub CommandButton2_Click()
Dim resultData As DataObject
Set resultData = New DataObject
resultData.SetText resultNum
resultData.PutInClipboard
Set resultData = Nothing
Unload Me
End Sub
Private Sub TextBox1_AfterUpdate() ’X1
If TypeName(Val(TextBox1.Value)) = "String" Then MsgBox "请输入数值", , "提示": TextBox1 = ""
End Sub
Private Sub TextBox2_AfterUpdate() ’X2
If TypeName(Val(TextBox2.Value)) = "String" Then MsgBox "请输入数值", , "提示": TextBox2 = ""
End Sub
Private Sub TextBox3_AfterUpdate() ’Y1
If TypeName(Val(TextBox3.Value)) = "String" Then MsgBox "请输入数值", , "提示": TextBox3 = ""
End Sub
Private Sub TextBox4_AfterUpdate() ’Y2
If TypeName(Val(TextBox4.Value)) = "String" Then MsgBox "请输入数值", , "提示": TextBox4 = ""
End Sub
Private Sub TextBox5_AfterUpdate() ’X
If TypeName(Val(TextBox5.Value)) = "String" Then MsgBox "请输入数值", , "提示": TextBox5 = ""
End Sub
Private Sub TextBox6_AfterUpdate() ’Y
If TypeName(Val(TextBox6.Value)) = "String" Then MsgBox "请输入数值", , "提示": TextBox6 = ""
End Sub

模块代码:

Sub 线性内插()
Application.ScreenUpdating = False ’//关闭屏幕刷新
Application.DisplayAlerts = False ’//关闭系统提示
Application.EnableEvents = False ’//禁止触发其他事件
UserForm12.Show
Application.EnableEvents = True ’// ’//恢复触发其他事件
Application.ScreenUpdating = True ’//恢复屏幕刷新
Application.DisplayAlerts = True ’//恢复系统提示
End Sub