Aha, tak to zadanie som predtým nepochopil správne. Takže aj s tým posúvaním riadkov a nepresúvaním na prázdnu bunku by to mohlo vyzerať takto:
Dim Source As Range
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim aTable As Range
Dim aRange As Range
Set aTable = Range("B3:H22")
Set aRange = Intersect(Target.Resize(1, 1), aTable.Resize(aTable.Rows.Count, 1))
If Not aRange Is Nothing Then
Set Source = aRange.Resize(1, aTable.Columns.Count)
Source.Copy
Cancel = True
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim aTable As Range
Dim aRange As Range
Dim aValue As Variant
Dim nRows As Integer
If Not Source Is Nothing Then
If Application.CutCopyMode = xlCopy Then
Set aTable = Range("B3:H22")
Set aRange = Intersect(Target.Resize(1, 1), aTable.Resize(aTable.Rows.Count, 1))
If Not aRange Is Nothing Then
If Target.Resize(1, 1).Value <> "" Then
nRows = Target.Row - Source.Row
Select Case Sgn(nRows)
Case 1
Set aRange = Source.Offset(1)
Case -1
Set aRange = Target
Case 0
Set aRange = Nothing
End Select
If Not aRange Is Nothing Then
Set aRange = aRange.Resize(Abs(nRows), aTable.Columns.Count)
aValue = Source.Value
aRange.Offset(-Sgn(nRows)) = aRange.Value
Source.Offset(nRows) = aValue
End If
End If
End If
Application.CutCopyMode = False
End If
Set Source = Nothing
End If
End Sub
Vo VBA nie je možné odlíšiť ľavé a pravé tlačidlo myši. Pri ľavom tlačidle sa vyberie bunka, čo spustí udalosť SelectionChange. Pri pravom tlačidle sa síce spustí udalosť BeforeRightClick, ale pred touto udalosťou sa spustí ešte aj SelectionChange, pretože sa zmení vybraná bunka.
Alternatíva pomocou klávesy Ctrl je realizovateľná, ale musí sa využiť Windows API, pretože priamo cez VBA sa nedá zistiť, či bol Ctrl stlačený alebo nie.