【问题标题】:application-defined or object-defined error, bloody mystery应用程序定义或对象定义的错误,血腥的谜团
【发布时间】:2016-01-19 05:21:51
【问题描述】:

我是一个相对不了解的程序员,抱歉。

以下 Excel 2010 用户窗体命令按钮的代码返回应用程序定义或对象定义的错误。

Private Sub CommandButton1_Click()

Dim y, vfx, sapx, prx As String

y = Sheets(ComboBox1.Value).Range("B:B").Find(ComboBox2.Value).Row
vfx = Sheets(ComboBox1.Value).Range("1:1").Find("Vendor No").Column
sapx = Sheets(ComboBox1.Value).Range("1:1").Find("SAP Number").Column
prx = Sheets(ComboBox1.Value).Range("1:1").Find("Amey Price").Column

Lrow = Sheets("Macropage").Range("B:B")(Rows.Count).End(xlUp).Row
Userow = Lrow + 1

Sheets("Macropage").Range("A" & Userow) = ComboBox1.Value
Sheets("Macropage").Range("B" & Userow) = ComboBox2.Value
Sheets("Macropage").Range("C" & Userow) = Sheets(ComboBox1.Value).Cells(y, vfx).Value
Sheets("Macropage").Range("D" & Userow) = Sheets(ComboBox1.Value).Cells(y, sapx).Value
Sheets("Macropage").Range("E" & Userow) = Sheets(ComboBox1.Value).Cells(y, prx).Value

Sheets("Macropage").Range("A3:E" & Userow).Columns.AutoFit

Unload UserForm1

End Sub

导致错误的代码似乎是:Sheets(ComboBox1.Value).Cells(y, prx).Value,我通过将其粘贴在 MsgBox 中进行了验证。

prx 引用的列唯一不同的是它包含小数而不是一些文本。我不明白为什么这应该是个问题。

感谢任何信息,即使它只是关于应用程序定义或对象定义错误的性质。从谷歌搜索看来,这似乎只是意味着 Excel 在执行脚本时出现问题,即使编译器认为它没问题。

【问题讨论】:

  • 您确定prx 有值吗?我会在那条线上放一个断点,然后在本地窗口中查看它的值。
  • 而且,如果它没有值,我的猜测是没有“Amey Price”列。
  • Dim y, vfx, sapx, prx As String - 与您的问题无关,但您意识到只有 prx 实际上被声明为 String 对吧?其他的被隐式声明为Variant

标签: vba excel-2010 userform


【解决方案1】:

这不是问题的解决方案,而是重写代码以更好地跟踪错误。

Private Sub CommandButton1_Click()

    On Error GoTo ErrExit
    Dim y, vfx, sapx, prx As String

    Dim sheet, Macropage
    Set thisSheet = Sheets(ComboBox1.Value)
    Set Macropage = Sheets("Macropage")

    If thisSheet Then
        MsgBox "You have to select an input page", vbExclamation
        Exit Sub
    End If

    If Macropage Then
        MsgBox "You have to select a Macro page", vbExclamation
        Exit Sub
    End If

    y = thisSheet.Range("B:B").Find(ComboBox2.Value).Row
    vfx = thisSheet.Range("1:1").Find("Vendor No").Column
    sapx = thisSheet.Range("1:1").Find("SAP Number").Column
    prx = thisSheet.Range("1:1").Find("Amey Price").Column

    Lrow = Macropage.Range("B:B")(Rows.Count).End(xlUp).Row
    Userow = Lrow + 1

    Macropage.Range("A" & Userow) = ComboBox1.Value
    Macropage.Range("B" & Userow) = ComboBox2.Value

    Debug.Print "y= " & y, "vfx= " & vfx, "sapx= " & sapx, "prx= " & prx

    Macropage.Range("C" & Userow) = thisSheet.Cells(y, vfx).Value
    Macropage.Range("D" & Userow) = thisSheet.Cells(y, sapx).Value
    Macropage.Range("E" & Userow) = thisSheet.Cells(y, prx).Value

    Macropage.Range("A3:E" & Userow).Columns.AutoFit

SafeExit:
    Unload UserForm1
    Exit Sub
ErrExit:
    MsgBox Error, vbCritical, "Error"
    Resume SafeExit

End Sub

【讨论】:

  • 请发布 Debug.Print 的字符串以了解错误
  • 您好,我通过从变量声明中删除 as string 消除了错误。 prx 无法被 cells() 正确解释为字符串。 (请参阅 Mat's Mug 对我最初帖子的评论)。不过感谢您的回复,如果我永远不需要寻找错误原因,我可能会参考这个。
【解决方案2】:

天哪,我是个白痴。 Mat's Mug 向我指出了它,prx 是一个字符串 - 所以Cells() 无法将其正确解释为列索引。

不完全确定为什么我认为var1, var2, var3 as type 会对所有人应用相同的类型。我以为我以前见过这样声明的变量..

谢谢大家。可以回答我自己的问题,对吧?

【讨论】:

  • 你可能想看看Rubberduck,我的小宠物项目。最新版本 (v1.4.3) 中的解析器会因为 Sheets(ComboBox1.Value).Range("B:B").Find(ComboBox2.Value).RowMacropage.Range("B:B")(Rows.Count).End(xlUp).Row 等打包指令而崩溃,但如果您可以简化这些调用,请提取局部变量并让 Rubberduck 解析器理解您的代码 (v2.2)。 0 会有更好的解析器),我认为 代码检查 功能将特别有用。它会选择这个“带有多个声明的指令”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多