2016-03-21 9 views
3

私はVBAに新しく、次のコードスニペットで奇妙な問題が発生しました。私の目標は、ユーザーが手動でテーブルにデータを貼り付けるときに行を挿入することです。ユーザはテーブルの一部を手作業でコピーします(列A1からC25まで - 列のDとEはそのままです)。A26に手動で貼り付けると、行が挿入されます。このように、テーブルの下にはより多くのコンテンツが存在するため、テーブルはデータを適切に収めるために展開されます。複数の列に貼り付けるのを防ぐにはどうすればよいですか?

以下のコードは、sortaの作業をしていますが、唯一の問題は、列(AからC)の貼り付けられたデータがすべての列(DからF、GからIなど..)私は(と「永遠に」の継続から)挿入された行の上に私の他の列を上書きからこの貼り付けられたデータを防ぐにはどうすればよい

' When cells are pasted, insert # of rows to paste in 
Dim lastAction As String 
' If a Paste action was the last event in the Undo list 
lastAction = Application.CommandBars("Standard").Controls("&Undo").List(1) 
If Left(lastAction, 5) = "Paste" Then 
    ' Get the amount that was pasted (table didn't expand) 
    numOfRows = Selection.Rows.Count 
    ' Undo the paste, but keep what is in the clipboard 
    Application.Undo 
    ' Insert a row 
    ActiveCell.offset(0).EntireRow.Insert 
End If 

私は、コマンドバーの[元に戻す]コントロールを使用していた理由は、このためであります手動の貼り付けイベントでコードを実行する必要があります。

+0

これはExcelで定義された 'テーブル 'ですか?または単にデータのテーブルですか? –

+0

これは単なるデータテーブルです。データが入っているセルには何もありません。 –

+0

私は解決策に取り組んでいます - これはワークシート変更イベントですか? –

答えて

1

このショットを投稿してください。私はクリップボードからデータを削除しましたが、変数を最初に格納して、行を挿入してからデータを適切な場所に追加し、他の列を空白のままにしました。

Private Sub Worksheet_Change(ByVal Target As Range) 

' If a Paste action was the last event in the Undo list 
Dim lastAction As String 
lastAction = Application.CommandBars("Standard").Controls("&Undo").List(1) 

If Left(lastAction, 5) = "Paste" Then 

    Dim rng() As Variant 
    rng() = Target 

    numofRows = Target.Rows.Count 'get amount of rows pasted 
    numofColumns = Target.Columns.Count 'get amount of columns pasted 

    With Application 
     .EnableEvents = False 'stop events from firing momentarily 
     .Undo 'undo paste action 
     .CutCopyMode = False 'remove data from clipboard 
    End With 

    ActiveCell.Resize(numofRows, 1).EntireRow.Insert 'insert new amount of rows based on paste 

    ActiveCell.Resize(numofRows, numofColumns).Value = rng() 'replace pasted values 

    Application.EnableEvents = True 'turn back on event firing 

End If 

End Sub 
+0

これは本当に適切に動作することに近いです。現在、「貼り付けた値を置き換える」は、元々貼り付けられたものを置き換えません。代わりに、以前はセル内にあるデータを貼り付けています。言い換えれば、それは行の量を配置しましたが、行23の元のデータ(下のテーブルの一部)は元に戻されました。それは "クリップボードからデータを削除する"ことができますか? –

+0

@BrettComardelle - 私はそれが実際には「元に戻す」コマンドだと思います。それは 'Target'セルの値をリセットしていました。私は範囲の代わりにバリアント配列にロードされ、新しい値はそのように固定されています。 –