0

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# アプリケーションを使用すると、次のエラーが発生することです:実行時エラー '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 はあまり役に立ちません。直接チェックActiveCell.Value2 = ""またはチェックできIsEmpty(ActiveCell)ます。

この変数を実際に使用したい場合は、次のようにディメンション化しVariantます。

Excel セルの値は NULL ではなく、少なくとも空であるか空の文字列 ("") に等しいため、VBAではIsNullorチェックを実行しても意味がありません。= NULLNull のチェックをスキップすると、正常に動作するはずです。

于 2013-03-25T09:51:55.233 に答える
-2

試してみるいくつかのこと:

  1. 変数の型を宣言することをお勧めします。この場合はstringorvariantですrange
  2. IsNull(checkval)の代わりに関数を使用してみてくださいcheckval = Null
    • @Chris が述べているように、セルは実際にEmptyはありませnullisempty(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 に答える