-1

誰かが私を助けてくれるのではないかと思います。

特定の「入力範囲」を維持できるように、ユーザーが選択した1つまたは複数の行からセルコンテンツを削除するスクリプトをまとめようとしています。次に、行7から始まる列「A」が入力されている場合は、データを含むすべての行をスプレッドシートの一番上に移動します。

行からセルの内容を削除する以下のコードをまとめましたが、データを含む行を「Shift Up」移動して、データ間の空白行を省略して、上下に並べる方法を理解できません。

Sub DelRow()
    Dim msg

        Sheets("Input").Protect "password", UserInterFaceOnly:=True
        Application.EnableCancelKey = xlDisabled
        Application.EnableEvents = False
        msg = MsgBox("Are you sure you want to delete this row?", vbYesNo)
        If msg = vbNo Then Exit Sub
        With Selection
            Application.Intersect(.Parent.Range("A:R"), .EntireRow).Interior.ColorIndex = xlNone
            Application.Intersect(.Parent.Range("S:AD"), .EntireRow).Interior.ColorIndex = 37
            Application.Intersect(.Parent.Range("AF:AQ"), .EntireRow).Interior.ColorIndex = 42
            Selection.SpecialCells(xlCellTypeConstants).ClearContents
        End With
        Application.EnableEvents = True

End Sub

以下に示す「並べ替え」マクロをまとめました。これは、データを含む2つの連続した行では機能しますが、「削除」マクロを使用した行では機能しません。

たとえば、「入力範囲」の1行目と2行目にデータを入力すると、コードは、並べ替え条件として列「B」を使用してスプレッドシートを正しく並べ替えます。しかし、最初の行の内容を削除して空白の行を作成すると、「並べ替え」スクリプトは2番目の行を上にシフトしません。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.EnableCancelKey = xlDisabled
    With Sheets("Input")
        If .Range("A7").Value = "" Then Exit Sub
        .Range("B7:AS400").Sort Key1:=Range("$B$1"), _
        Order1:=xlAscending, _
        Header:=xlGuess, _
        OrderCustom:=1, _
        MatchCase:=False, _
        Orientation:=xlTopToBottom, _
        DatOption1:=xlSortNormal
    End With
End Sub

誰かがこれを見て、ソート機能を追加できるようにコードをどのように適応させる必要があるかについてのガイダンスを提供できるかどうか疑問に思いました。

よろしくお願いします

4

3 に答える 3

0

コードに基づいて行を削除するには、次の方法が最適です。

Selection.Delete Shift:=xlUp

行全体が削除されていることを確認したい場合は、次のようにします。

Selection.EntireRow.Delete Shift:=xlUp

後の並べ替えについては、必要に応じてRange.Sortを調べてください。


編集:行の一部を削除したいが、具体的には、次のようにすることができます。

Range(Cells(Selection.Row,5),Cells(Selection.Row,8)).Delete Shift:=xlUpこれにより、削除が列に適用されますE-H

于 2012-12-31T21:15:16.997 に答える
0

ヘッダーをxlGuessではなくxlNoに変更してみてください。Excelは、ソートされる行に含まれないヘッダー行があると「考える」可能性があるため、空白の一番上の行はそこに残ります。

つまり、に変更 Header:=xlGuessしますHeader:=xlNo

于 2013-01-01T15:44:07.697 に答える
0

インターネットでさらに検索したところ、次の記事が見つかりました: http ://www.access-programmers.co.uk/forums/showthread.php?t=178521

これを使用して、「行の削除」コードを次のように修正しました。これは完全に機能します。

Sub DelRow()
    Dim msg

        Sheets("Input").Protect "handsoff", UserInterFaceOnly:=True
        Application.EnableCancelKey = xlDisabled
        Application.EnableEvents = False
        msg = MsgBox("Are you sure you want to delete this row?", vbYesNo)
        If msg = vbNo Then Exit Sub
        With Selection
            Application.Intersect(.Parent.Range("A:R"), .EntireRow).Interior.ColorIndex = xlNone
            Application.Intersect(.Parent.Range("S:AD"), .EntireRow).Interior.ColorIndex = 37
            Application.Intersect(.Parent.Range("AF:AQ"), .EntireRow).Interior.ColorIndex = 42
            Selection.SpecialCells(xlCellTypeConstants).ClearContents
        End With
       Application.EnableEvents = True
            With Range("A7:AS400" & Cells(Rows.Count, "A").End(xlUp).Row)
            .Sort Key1:=Range("B7"), _
            Order1:=xlAscending, _
            Header:=xlNo, _
            OrderCustom:=1, _
            MatchCase:=False, _
            Orientation:=xlTopToBottom, _
            DataOption1:=xlSortNormal
End With

End Sub

親切に助けてくれたすべての人に感謝します。

たくさんの感謝ととても幸せな新年。

敬具

于 2013-01-01T16:07:13.033 に答える