Excel 为什么它会给我一个不匹配的错误?

Excel 为什么它会给我一个不匹配的错误?,excel,runtime-error,vba,Excel,Runtime Error,Vba,当提示用户提供我的excel文档的概览时,我让他们输入一个介于1和10之间的数字。子测试是消除1到10之外的字符串和数字。这艘潜艇有效。如果用户第一次输入数字1到10,该程序就像一个符咒。但是,如果用户先输入字符串,然后输入1-10之间的整数,则会弹出一个错误。这是一个运行时错误13类型不匹配。我已经把弹出的错误行注释掉了。然而,电子邮件仍然可以通过。另外,如果你能解释为什么我必须重新定义我的秩整数,那也会有帮助。Option Explicit不像我在书中读到的那样工作。非常感谢。如果你有任何问

当提示用户提供我的excel文档的概览时,我让他们输入一个介于1和10之间的数字。子测试是消除1到10之外的字符串和数字。这艘潜艇有效。如果用户第一次输入数字1到10,该程序就像一个符咒。但是,如果用户先输入字符串,然后输入1-10之间的整数,则会弹出一个错误。这是一个运行时错误13类型不匹配。我已经把弹出的错误行注释掉了。然而,电子邮件仍然可以通过。另外,如果你能解释为什么我必须重新定义我的秩整数,那也会有帮助。Option Explicit不像我在书中读到的那样工作。非常感谢。如果你有任何问题,请告诉我

Option Explicit
Private Sub CommandButton1_Click()
Dim OutApp As Object
Dim OutMail As Object
Dim RANK As Long


Call Test

RANK = UserForm1.TextBox1.Value  '((((THIS IS THE LINE THAT PROMPTS THE ERROR)))
Set OutApp = CreateObject("Outlook.Application")
OutApp.Session.Logon
Set OutMail = OutApp.CreateItem(0)

On Error Resume Next
With OutMail
.To = "(my email is inserted here)"
.CC = ""
.BCC = ""
.Subject = "Create Database Overall Ranking"
.Body = "The rank a company gave me was a " & RANK & "."

.send
End With
On Error GoTo 0

Set OutMail = Nothing
Set OutApp = Nothing

Unload UserForm1

End Sub

Sub Test()
Dim MyVar, MyCheck
Dim RANK As Long
 MyVar = UserForm1.TextBox1.Text ' Assign value.
 MyCheck = IsNumeric(MyVar) ' Returns True.

If MyCheck = True Then
RANK = UserForm1.TextBox1.Value

If RANK > 10 Or RANK < 1 Then

MsgBox "Please input a number between 1 and 10.", vbOKOnly, "Invalid Number"
UserForm1.TextBox1.Text = ""
On Error Resume Next
Unload UserForm1
UserForm1.Show
Else
End If
Else
MsgBox "Please input a number and not text.", vbOKOnly, "Invalid Input"
UserForm1.TextBox1.Text = ""
On Error Resume Next
Unload UserForm1
UserForm1.Show
End If
End Sub
选项显式
私有子命令按钮1_单击()
Dim OutApp作为对象
将邮件变暗为对象
淡而无味
呼叫测试
RANK=UserForm1.TextBox1.Value'((这是提示错误的行)))
Set-OutApp=CreateObject(“Outlook.Application”)
OutApp.Session.Logon
Set-OutMail=OutApp.CreateItem(0)
出错时继续下一步
发邮件
.To=“(我的电子邮件插入此处)”
.CC=“”
.BCC=“”
.Subject=“创建数据库总体排名”
.Body=“公司给我的排名是“&rank&”
邮寄
以
错误转到0
发送邮件=无
设置应用程序=无
卸载UserForm1
端接头
子测试()
我的支票
淡而无味
MyVar=UserForm1.TextBox1.Text“赋值”。
MyCheck=IsNumeric(MyVar)'返回True。
如果MyCheck=True,则
RANK=UserForm1.TextBox1.Value
如果等级>10或等级<1,则
MsgBox“请输入一个介于1和10之间的数字”,vbOKOnly,“无效数字”
UserForm1.TextBox1.Text=“”
出错时继续下一步
卸载UserForm1
UserForm1.Show
其他的
如果结束
其他的
MsgBox“请输入数字而不是文本”,vbOKOnly,“无效输入”
UserForm1.TextBox1.Text=“”
出错时继续下一步
卸载UserForm1
UserForm1.Show
如果结束
端接头
编辑:工作的代码

我让它工作了……这是代码。我刚刚做了测试,以确保它是一个数字,然后我将数字作为字符串运行

Private Sub CommandButton1_Click()
Dim OutApp As Object
Dim OutMail As Object
Dim SurveyNum As String


Call Test

SurveyNum = UserForm1.TextBox1.Text

Set OutApp = CreateObject("Outlook.Application")
OutApp.Session.Logon
Set OutMail = OutApp.CreateItem(0)


On Error Resume Next
With OutMail
.To = "(MY EMAIL HERE)"
.CC = ""
.BCC = ""
.Subject = "Create Database Overall Ranking"
.Body = "The rank a company gave me was a " & SurveyNum & "."

.send
End With
On Error GoTo 0

Set OutMail = Nothing
Set OutApp = Nothing

Unload UserForm1

End Sub
Sub Test()
Dim MyVar, MyCheck
Dim SurveyNum2 As Double
 MyVar = UserForm1.TextBox1.Text ' Assign value.
 MyCheck = IsNumeric(MyVar) ' Returns True.

If MyCheck = True Then
SurveyNum2 = UserForm1.TextBox1.Value

If SurveyNum2 > 10 Or SurveyNum2 < 1 Then

MsgBox "Please input a number between 1 and 10.", vbOKOnly, "Invalid Number"
UserForm1.TextBox1.Text = ""
On Error Resume Next
Unload UserForm1
UserForm1.Show
Else
End If
Else
MsgBox "Please input a number and not text.", vbOKOnly, "Invalid Input"
UserForm1.TextBox1.Text = ""
On Error Resume Next
Unload UserForm1
UserForm1.Show
End If
End Sub
Private子命令按钮1\u单击()
Dim OutApp作为对象
将邮件变暗为对象
作为字符串的Dim SurveyNum
呼叫测试
SurveyNum=UserForm1.TextBox1.Text
Set-OutApp=CreateObject(“Outlook.Application”)
OutApp.Session.Logon
Set-OutMail=OutApp.CreateItem(0)
出错时继续下一步
发邮件
.To=“(我的电子邮件在此)”
.CC=“”
.BCC=“”
.Subject=“创建数据库总体排名”
.Body=“一家公司给我的排名是“&SurveyNum&”
邮寄
以
错误转到0
发送邮件=无
设置应用程序=无
卸载UserForm1
端接头
子测试()
我的支票
双精度测量仪2
MyVar=UserForm1.TextBox1.Text“赋值”。
MyCheck=IsNumeric(MyVar)'返回True。
如果MyCheck=True,则
SurveyNum2=UserForm1.TextBox1.Value
如果SurveyNum2>10或SurveyNum2<1,则
MsgBox“请输入一个介于1和10之间的数字”,vbOKOnly,“无效数字”
UserForm1.TextBox1.Text=“”
出错时继续下一步
卸载UserForm1
UserForm1.Show
其他的
如果结束
其他的
MsgBox“请输入数字而不是文本”,vbOKOnly,“无效输入”
UserForm1.TextBox1.Text=“”
出错时继续下一步
卸载UserForm1
UserForm1.Show
如果结束
端接头

有一些事情可能会引起问题

Rank是VBA中已经存在的一个函数。对于用户定义的内容,使用相同的名称可能会遇到问题。尽管我不认为这是导致错误的原因

我认为问题在于将RANK声明为long。据我所知,long数据类型是一个整数。如果传递给此数据类型的值不是整数,则可能是罪魁祸首

我将重命名rank变量,并将其重新定义为double,然后看看这对您有什么作用

用代码编辑

我成功地修复了代码。我不知道到底是什么导致了问题,但我更改了一些项目

  • 您在同一过程中为同一教科书值声明了不同的变量,但使用了不同的数据类型(在测试过程中,RANK为Long,myVar为Variant)
  • 我还清理了一些项目,使代码流更好一些
  • 这是密码

    Option Explicit
    
    Private Sub CommandButton1_Click()
        Dim OutApp As Object
        Dim OutMail As Object
        Dim SurveyNum As Double
    
        If Test = True Then
    
            SurveyNum = UserForm1.TextBox1.Value
            Set OutApp = CreateObject("Outlook.Application")
            OutApp.Session.Logon
            Set OutMail = OutApp.CreateItem(0)
    
            On Error Resume Next
            With OutMail
                .To = "(my email is inserted here)"
                .CC = ""
                .BCC = ""
                .Subject = "Create Database Overall Ranking"
                .Body = "The rank a company gave me was a " & SurveyNum & "."
    
                .send
            End With
            On Error GoTo 0
    
            Set OutMail = Nothing
            Set OutApp = Nothing
    
            Unload UserForm1
        End If
    End Sub
    
    Function Test() As Boolean
        Dim MyVar As Double
        Dim MyCheck As Boolean
    
        MyVar = UserForm1.TextBox1.Value ' Assign value.
        MyCheck = IsNumeric(MyVar) ' Returns True.
    
        If MyCheck = True Then
    
            If MyVar > 10 Or MyVar < 1 Then
    
                MsgBox "Please input a number between 1 and 10.", vbOKOnly, "Invalid Number"
                UserForm1.TextBox1.Value = ""
                On Error Resume Next
                Test = False
            Else
                Test = True
            End If
        Else
            MsgBox "Please input a number and not text.", vbOKOnly, "Invalid Input"
            UserForm1.TextBox1.Value = ""
            On Error Resume Next
            Test = False
        End If
    End Function
    
    选项显式
    私有子命令按钮1_单击()
    Dim OutApp作为对象
    将邮件变暗为对象
    双倍暗测量
    如果Test=True,则
    SurveyNum=UserForm1.TextBox1.Value
    Set-OutApp=CreateObject(“Outlook.Application”)
    OutApp.Session.Logon
    Set-OutMail=OutApp.CreateItem(0)
    出错时继续下一步
    发邮件
    .To=“(我的电子邮件插入此处)”
    .CC=“”
    .BCC=“”
    .Subject=“创建数据库总体排名”
    .Body=“一家公司给我的排名是“&SurveyNum&”
    邮寄
    以
    错误转到0
    发送邮件=无
    设置应用程序=无
    卸载UserForm1
    如果结束
    端接头
    函数Test()为布尔值
    双重模糊MyVar
    将MyCheck设置为布尔值
    MyVar=UserForm1.TextBox1.Value'赋值。
    MyCheck=IsNumeric(MyVar)'返回True。
    如果MyCheck=True,则
    如果MyVar>10或MyVar<1,则
    MsgBox“请输入一个介于1和10之间的数字”,vbOKOnly,“无效数字”
    UserForm1.TextBox1.Value=“”
    出错时继续下一步
    测试=错误
    其他的
    测试=真
    如果结束
    其他的
    MsgBox“请输入数字而不是文本”,vbOKOnly,“无效输入”
    UserForm1.TextBox1.Value=“”
    出错时继续下一步
    测试=错误
    如果结束
    端函数
    
    设置邮件时,请将其设置为邮件项,而不仅仅是CreateItem(0)。与设置邮件=新建OUtlook.MailItem类似,这不起作用。设置邮件=新建OUtlook.MailItem使用调试器并告诉我们是哪一行导致了重新创建的邮件的问题