2017-04-05 12 views
0

私はワークブックに "Sheet1"と "Data"を2枚持っています。タイムスタンプは「データ」シートにコピーされます列D ペースト特殊1回​​以上働いていない:VBA

  • その範囲に現れる

    1. :シート1に私は変化が列Cに発生したとき、そのようWorksheet_Changeマクロを使用しています。ここで

    私のコードです:

    Private Sub Worksheet_Change(ByVal Target As Range) 
        Dim Location As Range 
        If Target.Column > 3 Or Target.Column < 3 Then Exit Sub 
        Application.EnableEvents = False 
        Cells(Target.Row, 4) = Now 
        Application.EnableEvents = True 
        Selection.End(xlToLeft).Select 
        Range(Selection, Selection.End(xlToRight)).Select 
        Selection.Copy 
        Sheets("data").Unprotect 
        Sheets("data").Range("a1").End(xlDown).Offset(1, 0).PasteSpecial _ 
         Paste:=xlPasteValues, Operation:=xlNone, _ 
         SkipBlanks:=False, Transpose:=False 
        Sheets("data").Protect 
        Range("a1").Select 
    End Sub 
    

    私の問題はPasteSpecialが複数回動作していないということです。

  • 答えて

    0

    あなたが選択を使用したときに何がコピーされているのかわからず、EnterキーまたはCtrl + Enterキーを押しても、C列の値の入力方法によって異なります。 B2に値を入力してEnterキーを押して送信すると、セルB3が選択され、コードごとにrow3の範囲がデータシートにコピーされます。一方、Ctrl + Enterキーを押すと、選択範囲はB2に残り、row2の範囲がデータシートにコピーされます。 しかし、それはあなた自身を微調整することができます。

    調整されたコードが役立つかどうかを確認してください。

    Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim Location As Range 
    If Target.Column <> 3 Then Exit Sub 
    Application.ScreenUpdating = False 
    Application.EnableEvents = False 
    Cells(Target.Row, 4) = Now 
    Application.EnableEvents = True 
    Selection.End(xlToLeft).Select 
    Range(Selection, Selection.End(xlToRight)).Select 
    Sheets("data").Unprotect 
    Selection.Copy 
    Sheets("Data").Range("A" & Rows.Count).End(3)(2).PasteSpecial xlPasteValues 
    Sheets("data").Protect 
    Range("a1").Select 
    Application.ScreenUpdating = True 
    End Sub 
    
    +0

    "データ"シートにシート変更コードがないかぎり、ペーストの周りに 'EnableEvents'フラグは必要ありません。 – Wolfie

    +0

    良いキャッチウルフ! :) – sktneer

    +0

    ありがとう皆さんありがとう、 –

    0

    問題は、シートを保護していないとクリップボードがクリアされているため、貼り付けるものがないことです。ここでは、コードを変更しました。私はこれを大幅に改善するためにいくつかの方法で変更しました。詳細はコメントを参照してください。

    Private Sub Worksheet_Change(ByVal Target As Range) 
        Dim Location As Range 
        ' Use <> to mean "not equal to" 
        If Target.Column <> 3 Then Exit Sub 
        Application.EnableEvents = False 
        ' Fully qualify the cells object 
        ThisWorkbook.Sheets("Sheet1").Cells(Target.Row, 4).Value = Now 
        Application.EnableEvents = True 
        ' Avoid using .Select and Selection, the user could have clicked anywhere after the value change 
        ' Use a With block to fully qualify your range objects 
        With ThisWorkbook.Sheets("data") 
         .Unprotect 
         ' Copy immediately before paste 
         Target.EntireRow.Copy 
         .Range("A1").End(xlDown).Offset(1, 0).PasteSpecial Paste:=xlPasteValues 
         .Protect 
        End With 
        Application.CutCopyMode = False 
    End Sub 
    

    あなたが貼り付けているデータは、列Aには何も持っていないので、列AでEnd(xlDown)が同じ位置を返すため現在、これは単に、「データ」シートに同じ行を上書きします。あなたは、列Cに変更、または静止コラム依存しているが、最後の行を取得するために上がる

    .Cells(Rows.Count,"C").End(xlUp).Offset(1, 0).PasteSpecial 
    

    を使用する必要があります。 の前にドット.があり、その行はWithブロック内にあるためです。