0

我创建了一个宏来从我的 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”:类型不匹配

我究竟做错了什么 ?

4

3 回答 3

0

试试这个版本

它处理

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

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
于 2013-03-25T10:45:25.433 回答
0

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

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

如果你真的想使用这个变量而不是维度它作为Variant.

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

于 2013-03-25T09:51:55.233 回答
-2

有几件事可以尝试:

  1. 声明变量类型是一种很好的做法,在这种情况下是stringorvariantrange
  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
于 2013-03-25T09:39:26.447 回答