3

次のコードは、テンプレートを希望どおりに正しくフォーマットします。ただし、テンプレートが空で、ユーザーがシートの準備アップロードボタンを押すと、オーバーフローエラー6が表示されます。このエラーの原因を取り除く方法はありますか?

    Sub PrepForUpload()

Dim cel As Range, rng As Range

Set rng = Range("A2", Range("A65536").End(xlUp))

For Each cel In rng

    If cel.Value = "" Then

        If cel.Offset(, 2).Value = "" Then
            cel.EntireRow.Delete

        End If

    End If

    Next cel

Dim rowNumber As Integer
With Sheets("Initiatives")

If Len(.Cells(2, 1)) = 0 Then

rowNumber = .Cells(2, 1).End(xlDown).End(xlDown).Row + 1

Else: rowNumber = .Cells(2, 1).End(xlDown).Row + 1

End If

.Rows(rowNumber & ":" & .Rows.Count).Clear

End With


End Sub

デバッグは、問題として次の行を指します。

rowNumber = .Cells(2, 1).End(xlDown).End(xlDown).Row + 1

ありがとう

ライアン

4

3 に答える 3

10

IntegerVBAには16ビットの符号付き数値(最大値32767)があるため、オーバーフローが発生しています。Excelのバージョンに関係なく、少なくとも65535行あり、XLSXファイル形式を使用している場合はそれ以上になる可能性があります。あなたはに変更する必要がありrowNumberますLong

また、空白のワークシートscenerioをコーディングする必要があります。この行を呼び出すとき:

rowNumber = .Cells(2, 1).End(xlDown).End(xlDown).Row + 1

ワークシートが空白.End(xlDown)の場合、ワークシートの最後の可能な行が返されます。Excel2010(およびExcel 2007)の場合は1048576です。に変更rowNumberするとLong、オーバーフローエラーは発生しなくなりますが、次のようになります。この行の問題:

.Rows(rowNumber & ":" & .Rows.Count).Clear

これは、存在しない範囲(行1048577)を選択しようとしているためです(したがって、タイプが一致していません)。このシナリオを回避するには、コード行を追加する必要があります。最初に空白のワークシートをチェックするか、行>1048576をチェックします。

最も簡単な方法は、これを確認するための行を追加することです。

If rowNumber <= 1048576 Then
    .Rows(rowNumber & ":" & .Rows.Count).Clear
End If
于 2012-09-27T15:13:57.530 に答える
0

に変更rowNumberしてLongから追加するか、「type-mismatch」エラーを取り除くために1&使用します。CLng

rowNumber = CLng(.Cells(2, 1).End(xlDown).End(xlDown).Row + 1)

また

rowNumber = .Cells(2, 1).End(xlDown).End(xlDown).Row + 1&
于 2012-09-27T15:32:11.267 に答える
0

A列にデータがどのように表示されるかを教えてください。行番号を取得する前に行数をテストするこのコードを試すこともできます

Dim cel As Range, rng As Range

If Application.WorksheetFunction.CountA(Columns(1)) <= 1 Then
    MsgBox "No lines"
    Exit Sub
End If

Set rng = Range("A2", Cells(Rows.Count, 1).End(xlUp))

For Each cel In rng

    If Len(cel.Value) = 0 Then

        If Len(cel.Offset(, 2).Value) = 0 Then cel.EntireRow.Delete

    End If

Next cel

Dim rowNumber As Long

With Sheets("Initiatives")

    If Application.WorksheetFunction.CountA(.Columns(1)) <= 1 Then
        MsgBox "No lines in sheet Initiative"
        Exit Sub
    End If


If Len(.Cells(2, 1)) = 0 Then

    rowNumber = .Cells(2, 1).End(xlDown).End(xlDown).Row + 1

    Else: rowNumber = .Cells(2, 1).End(xlDown).Row + 1

End If

.Rows(rowNumber & ":" & .Rows.Count).Clear

End With
于 2012-09-27T16:10:39.510 に答える