执行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':类型不匹配
我在做什么错?
几件事情尝试:
- 这是很好的做法,声明你的变量类型,在这种情况下
string
或variant
或range
。 - 尝试使用
IsNull(checkval)
函数代替checkval = Null
。- 正如@Chris所述,一个单元确实是
Empty
而不是null
,使用isempty(a)
。 - 一些底定到这之后,似乎是一个常见的问题,我已经遇到似乎傻瓜证明,使用
len(trim(a)) = 0
作为检查一个很好的解决方案。
- 正如@Chris所述,一个单元确实是
- 它是通过细胞选择这些不必要的循环:
代码:
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
谢谢你的帮助。我只是试过你的例子,我在这条线上得到同样的错误:**如果范围(“A”&checkval)=“”或isnull(范围(“A”&checkval))然后**我认为它是因为单元格格式化。如果我使用0而不是og“”它运行没有任何错误,但它不会删除空行。 – Lahib 2013-03-25 09:45:48
我正在运行excel 2010 – Lahib 2013-03-25 10:00:57
检查'=“”'和'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,它应该工作正常。
试试这个版本
它与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
这似乎是一个痛苦的做法,“如果空白删除”。谢谢微软。 – glh 2013-03-25 10:50:49
请向我们展示如何运行宏? 另外,在哪个地方发生错误? – 2013-03-25 09:08:17
http://msdn.microsoft.com/en-us/library/3etdkytt(v=vs.80).aspx – SysDragon 2013-03-25 09:10:01
此代码直接从Excel 2010中的vba直接运行。 – 2013-03-25 09:18:23