1

これが以前に回答されている場合は申し訳ありませんが、イベント処理はまだ私にとってまったく新しいものです。

私が達成しようとしているのは、セルをダブルクリックしてクリップボードに切り取り、新しいセルをクリックしてその時点で切り取りセルを挿入し、既存のセルを下に移動することです。

セルをカットするためのビットをダブルクリックするのは簡単です:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    Cancel = True
    Target.Cut

End Sub

...しかし、イベント内から別のイベント(私が想定しているSelectionChange)を呼び出す必要があることを考えると、残りの部分は私には明らかではありません。

これはどのように達成されますか?私はいくつかの検索を行いました - そしてそれは明白になると確信しています - しかし、私はおそらく正しい用語で検索していません.

前もって感謝します。

編集:答えてくれてありがとう。

常に人気のあるフォローアップの質問として、グラブザボーダーメソッドを使用してセルをドラッグするときに同じことを達成する方法はありますか?つまり、「置換しますか?」を呼び出すのではなく、セルをドラッグして挿入します。 " ダイアログ?Shift キーを押し続けることでこれを実行できることはわかっていますが、ドラッグ アンド ドロップしたセルが上書きではなく自動的に挿入されるようにシートをコーディングする方法を探しています。

4

1 に答える 1

1

これはどう?

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    Cancel = True
    Target.Cut

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Application.CutCopyMode = xlCut Then
        Target.Insert Shift:=xlDown
        Application.CutCopyMode = False
    End If

End Sub

アップデート:

セルのドラッグ イベントはありませんが、このリンクに基づくハッキーな回避策があります http://www.mrexcel.com/forum/excel-questions/284788-challenging-post-override-cell-drag-drop-behavior-2 .html

これにより、基本的にドラッグが可能になり、次に UNDO を適用してターゲットと宛先のセルを見つけます。私が行った唯一の追加は、 Application.AlertBeforeOverwriting を追加して上書きメッセージを無効にすることです。

Dim trigger As Boolean
Dim flag As Boolean
Dim busy As Boolean
Const overwriteAlert As Boolean = False


Private Sub Worksheet_Change(ByVal Target As Range)

    With Target
        If .Count = 1 And trigger Then
            If flag Then
            If busy Then Exit Sub
            busy = True
            Call MyDrag
            flag = False
            Else
            flag = True
            End If
        End If
    End With

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    flag = False
    busy = False
    trigger = Target.Count = 1
    Application.AlertBeforeOverwriting = overwriteAlert

End Sub

Sub MyDrag()
Dim DragAddress As String
Dim DropAddress As String

    With Application
    .EnableEvents = False
    .ScreenUpdating = False

    DropAddress = ActiveCell.Address
    .Undo
    DragAddress = ActiveCell.Address

        If Range(DropAddress).Column = Range(DragAddress).Column Then
        .Undo
        Else

            With Range(DropAddress)
            .Activate
            .Insert Shift:=xlDown
            .Offset(-1) = Range(DragAddress)
            End With

        Range(DragAddress).Delete Shift:=xlUp
        End If

    .ScreenUpdating = True
    .EnableEvents = True
    End With

'busy = False

End Sub
于 2013-08-10T23:32:04.547 に答える