执行Excel宏时出现“类型不匹配”错误

执行Excel宏时出现“类型不匹配”错误

问题描述:

我创建了一个宏,用于从我的Excel文件中的空行中删除所有边界。这是米格代码:执行Excel宏时出现“类型不匹配”错误

运行宏
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#应用​​程序他们得到这个错误:运行时错误'13':类型不匹配

我在做什么错?

+0

请向我们展示如何运行宏? 另外,在哪个地方发生错误? – 2013-03-25 09:08:17

+0

http://msdn.microsoft.com/en-us/library/3etdkytt(v=vs.80).aspx – SysDragon 2013-03-25 09:10:01

+0

此代码直接从Excel 2010中的vba直接运行。 – 2013-03-25 09:18:23

几件事情尝试:

  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 
+0

谢谢你的帮助。我只是试过你的例子,我在这条线上得到同样的错误:**如果范围(“A”&checkval)=“”或isnull(范围(“A”&checkval))然后**我认为它是因为单元格格式化。如果我使用0而不是og“”它运行没有任何错误,但它不会删除空行。 – Lahib 2013-03-25 09:45:48

+0

我正在运行excel 2010 – Lahib 2013-03-25 10:00:57

+0

检查'=“”'和'IsEmpty'是不必要的。正如我前面所说的_all'Empty'单元格也是'=“”'_。虽然'Trim'将处理普通空格(ascii 32),但它不处理不可打印字符ascii> 255(例如,非空格空格ascii 160)。尽管我同意使用'Select'通常是一个糟糕的主意,但是使用'Range'并不会更好。如果您必须使用范围,请使用'For Each cl in Range(“A8:A100”)' – 2013-03-25 10:26:15

远离单元格格远总是用Value2

总是对变量类型进行维度定位,只在需要时使用它们,checkval不是非常有用,您可以直接检查ActiveCell.Value2 = ""或检查IsEmpty(ActiveCell)

如果你真的想要使用这个变量而不是尺寸它作为Variant

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

+1

没有帮助。问题是当我使用checkval =“”当我使用isEmpty(checkval)错误不会发生,但它不删除空行 – Lahib 2013-03-25 10:00:40

+0

我正在我的模板文件上运行isEmpty。这份文件是由我的老板发给我的。我应该可能检查空白区域? – Lahib 2013-03-25 10:06:09

+0

如果目标单元格包含空格(“”),那么您应该检查这些空格,我们不可能告诉您,我们没有您的电子表格;) – 2013-03-25 10:08:41

试试这个版本

它与apear为空单元格,但arn't(删除它们)返回""(使他们)

  • 可能出现的条目
  • 式的
  • 交易
  • 大大提高了运行时间

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 
+1

这似乎是一个痛苦的做法,“如果空白删除”。谢谢微软。 – glh 2013-03-25 10:50:49