【问题标题】:"Type Mismatch" error when executing Excel Macro执行 Excel 宏时出现“类型不匹配”错误
【发布时间】:2013-03-14 16:52:57
【问题描述】:

我创建了一个宏来从我的 excel 文件中的空行中删除所有边框。这是mig代码:

Sub RemoveRows()
'
' RemoveRows Macro
'

'
    Range("A8").Select

    Dim checkval

    Dim RowAmount
    RowAmount = 93



    Do
        checkval = ActiveCell.Value
        If (checkval = "" Or checkval = Null) Then
            ActiveCell.EntireRow.Delete
        Else
            ActiveCell.Offset(1, 0).Select
        End If
        RowAmount = RowAmount - 1
    Loop While RowAmount > 0


End Sub

运行宏的方法:

public void RemoveRows_Macro(string fileName)
{
    Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
    Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
    xlWorkBook = xlApp.Workbooks.Open(fileName);
    xlApp.DisplayAlerts = true;

    //Run the macro
    xlApp.Run("RemoveRows", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
        Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
        Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

    xlWorkBook.Save();

    xlWorkBook.Close(false);
    xlApp.Quit();
    releaseObject(xlApp);
    releaseObject(xlWorkBook);
}

我的问题是我可以从我的 C# 应用程序运行此宏而不会出现此错误,但是当其他人使用我的 C# 应用程序时会收到此错误:Run-time error '13': Type Mismatch

我做错了什么?

【问题讨论】:

  • 请告诉我们您是如何运行宏的?另外,错误发生在哪个地方?
  • 此代码直接从 Excel 2010 中的 vba 按预期运行。
  • 当我运行宏时,它也可以在我的计算机上完美运行。但是当宏在某些(不是所有)机器上运行时,就会出现这个错误。此行发生错误:If (checkval = "" Or checkval = Null) Then
  • 检查单元格中的Null 是没有意义的,因为单元格不能是Null。他们可以是Empty。请注意,所有Empty 单元格也是= "",但并非所有= "" 单元格都是Empty

标签: .net excel excel-2010 vba


【解决方案1】:

要远离单元格格式,请始终使用Value2

总是标注变量类型,只在需要的时候使用,checkval不是很有用,你可以直接检查ActiveCell.Value2 = ""或者检查IsEmpty(ActiveCell)

如果你真的想使用这个变量而不是将其标注为Variant

Excel 单元格值不为 NULL,它们至少为空或等于空字符串 (""),因此在 VBA 中执行 IsNull= NULL 检查没有意义。跳过对 Null 的检查,它应该可以正常工作。

【讨论】:

  • 那没有帮助。问题是当我使用 checkval = "" 当我使用 isEmpty(checkval) 时不会发生错误,但它不会删除空行
  • 我正在我的模板文档上运行 isEmpty。文件是我老板寄给我的。我应该检查一下空格吗?
  • 如果目标单元格包含空格 (" ") 那么你应该检查那些,我们不可能告诉你,我们没有你的电子表格;)
  • 我刚刚做了一个空白测试。这并没有删除行。唯一删除行的是 checkval = "" 但由于这适用于我的笔记本电脑,它不适用于其他人。
  • 对校验值进行验证时,您可能会删除其中包含公式且结果为 ="" 的单元格,这与空单元格不同(因为它包含公式)...跨度>
【解决方案2】:

试试这个版本

它处理

  • 可能的条目显示为为空单元格但不是(删除它们)
  • 返回 "" 的公式(离开它们)
  • 大大提高了运行时间

Sub RemoveRows()
    Dim dat As Variant
    Dim i As Long
    Dim rng As Range, rngDel As Range
    Dim str As String

    Set rng = Range("A8:A100")
    dat = rng.Formula

    For i = 1 To UBound(dat, 1)
        str = Replace$(dat(i, 1), Chr(160), "")
        str = Replace$(str, vbCr, "")
        str = Replace$(str, vbLf, "")
        str = Replace$(str, vbTab, "")
        If Len(Trim$(str)) = 0 Then
            If rngDel Is Nothing Then
                Set rngDel = rng.Cells(i, 1)
            Else
                Set rngDel = Application.Union(rngDel, rng.Cells(i, 1))
            End If
        End If
    Next

    If Not rngDel Is Nothing Then
        rngDel.EntireRow.Delete
    End If

End Sub

【讨论】:

  • 这似乎是一种痛苦的方式,“如果空白删除”。谢谢微软。
【解决方案3】:

有几件事可以尝试:

  1. 最好声明变量类型,在本例中为 stringvariantrange
  2. 尝试使用IsNull(checkval) 函数而不是checkval = Null
    • 正如@Chris 所说,一个单元格确实是Empty 而不是null,使用isempty(a)
    • 经过一些处理,这似乎是一个常见问题,我遇到了一个看似万无一失的好解决方案,使用 len(trim(a)) = 0 作为检查。
  3. 没有必要通过选择单元格来循环访问它们:

代码:

Sub RemoveRows() 
'
' RemoveRows Macro 
'

' 

    Dim checkval as long, RowAmount as long
    checkval = 8
    RowAmount = 93

    Do 

        'If trim(range("A" & checkval)) = "" Or _
        '       isempty(range("A" & checkval)) Then 'thanks chris
        If Len(Trim(range("A" & checkval))) = 0 then 
            range("A" & checkval).EntireRow.Delete 
        Else 
            checkval  = checkval + 1
        End if
        RowAmount = RowAmount - 1 

    Loop While RowAmount > 0

End Sub

【讨论】:

  • 感谢您的帮助。我刚刚尝试了你的例子,我在这一行得到了同样的错误: If range("A" & checkval) = "" Or isnull(range("A" & checkval)) Then 我想这是因为单元格格式。如果我使用 0 而不是 og "" 它运行没有任何错误,但它不会删除空行。
  • 检查= ""IsEmpty 是不必要的。正如我之前所说的,所有Empty 单元格也是= ""。虽然Trim 将处理普通空格(ascii 32),但它不处理ascii > 255 的不可打印字符(例如,不间断空格ascii 160)。虽然我同意使用Select 通常是个坏主意,但您使用Range 也好不到哪里去。如果必须使用 Range,请使用 For Each cl in Range("A8:A100")
  • @chrisneilsen,因为他正在删除整行,这将跳过此循环中的以下单元格,例如而在 A8 中删除 A8,A9 将变为 A8,然后 for 循环将有效地跳过 A9 到 A10,然后呢?这就是我没有选择这个选项的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多