2

私はメインフレームから引き出されたデータを使って努力を続けています。現在、フォームで使用するデータのソートや潜在的なデータ処理などの作業を続けています。データは英数字で、私の継続的なデータへの取り組みに関連する以前の質問の 1 つと形式が似ています。

私の現在の開発ラインの 1 つは、マクロを有効にしたボタンの形でユーザビリティを向上させることに関係していました。そのようなボタンの 1 つは、シート内の既存のデータ行の A2 から末尾までの 1 つの列 "A" のすべてのデータを削除することを目的としたマクロを含みます。

コードは次のとおりです。

Sub DeleteCriteria_Click()

Dim CriteriaRange As Range

Dim LastCriteriaCell As Long

With Sheets("Criteria")
    LastCriteriaCell = .Range("A" & Sheets("Criteria").Rows.Count).End(xlUp).Row
    Set CriteriaRange = .Range("A2:A" & LastCriteriaCell)
End With

CriteriaRange.Cells.Select

Selection.Delete

End Sub

不思議なことに、このコードは、ボタンをアクティブにするたびに列を 1 つずつシフトし、クリックを繰り返すとヘッダーと後続の列を削除してしまいます。この動作は、列の通常の削除機能に似ています。範囲コマンドのリファクタリングCriteriaRange.Cells.Select| Selection.Deleteこの問題は修正されCriteriaRange.Cells.DeleteませCriteriaRange.Deleteん。

私の意図は、エントリが削除された後に新しい基準が入力されたときに空白や残りのデータセットがないように、エントリを完全に削除することです。したがって、2つの質問があります。

1) この動作の原因、つまり、ここで間違っていることは何ですか?

2) この動作を修正して、セルを完全に削除するか、同等の機能を実行して、列を保持しながら空白または null セルへの参照を防ぐにはどうすればよいですか?

4

1 に答える 1

2

コードを次のように変更します

CriteriaRange.Delete Shift:=xlUp

デフォルトは

CriteriaRange.Delete Shift:=xlToLeft

このため、列が移動されます。

あなたのコードは次のように書くことができます

Sub DeleteCriteria_Click()
    Dim LastCriteriaCell As Long

    With Sheets("Criteria")
        LastCriteriaCell = .Range("A" & .Rows.Count).End(xlUp).Row

        '~~> This is required so that your header cells are not touched
        If LastCriteriaCell < 2 Then Exit Sub

        .Range("A2:A" & LastCriteriaCell).Delete Shift:=xlUp
    End With
End Sub

また

Sub DeleteCriteria_Click()
    Dim LastCriteriaCell As Long

    With Sheets("Criteria")
        LastCriteriaCell = .Range("A" & .Rows.Count).End(xlUp).Row

        '~~> This is required so that your header cells are not touched
        If LastCriteriaCell >= 2 Then _
        .Range("A2:A" & LastCriteriaCell).Delete Shift:=xlUp
    End With
End Sub
于 2012-08-13T16:21:21.517 に答える