2017-01-03 3 views
1

OK、範囲内のセルが選択されたことを検出し、その横にボタンを作成するワークシートコードがあります。すべてが正常であるように見えましたが、ボタンを作成するとクリップボードがクリアされます。ここでは、関連する範囲内のセルが選択されるたびに呼び出され、元のコードは次のとおりです。Excel-VBA:ボタンを追加するとクリップボードがクリアされる - 回避策が必要

Public Sub splitTransactionIn(ByVal Target As Range) 
    Dim btn As Button 
    Set t = ActiveSheet.Range("E" & Target.Row) 
    rowNumber = Target.Row 
    On Error Resume Next 
    ActiveSheet.Buttons("Split").Delete 
    Set btn = ActiveSheet.Buttons.Add(t.Left, t.Top, t.Width, t.Height) 
    With btn 
    .OnAction = "btnIn" 
    .Caption = "Split transaction" 
    .Name = "Split" 
    End With 
End Sub 

私は、できるだけ早く.OnAction、.Captionまたは.nameのいずれかに達したとしてアウトセクションをコメントしてブレークポイントを挿入しようとした、とクリップボードがクリアされます。なぜ、私は分かりません。

は、論理的にはそれについて考えて、私はそれがクリアされた前のクリップボードをキャプチャし、サブの最後でそれを置き換えるために、コードのいくつかの余分なラインに追加ので、私はこれで終わる:

Public Sub splitTransactionIn(ByVal Target As Range) 
    Dim btn As Button 
    Dim objData As New MSForms.DataObject 
    Dim strText 

    objData.GetFromClipboard 
    strText = objData.GetText() 
    Set t = ActiveSheet.Range("E" & Target.Row) 
    rowNumber = Target.Row ' gets used elsewhere... 
    On Error Resume Next 
    ActiveSheet.Buttons("Split").Delete 
    Set btn = ActiveSheet.Buttons.Add(t.Left, t.Top, t.Width, t.Height) 
    With btn 
    .OnAction = "btnIn" 
    .Caption = "Split transaction" 
    .Name = "Split" 
    End With 
    objData.SetText strText 
    objData.PutInClipboard 
End Sub 

さて、これはうまくいっていますが、一点に過ぎません。そこで範囲内のセルを選択してコピー(Ctrl-C)し、同じ範囲で3セルをさらに下に選択して貼り付けます(Ctrl-V)。私が得るのはエラーメッセージです:「クリップボード上のデータは同じサイズではなく、選択されたエリアとしての形状」であり、OKを押すと、単一のセルにペーストされます。私はソースとターゲットが異なるサイズであることを知っていますが、コピー/貼り付け時にシートのこの部分はうまくいきます。明らかに私はクリップボードの読み書きに奇妙なことをしてきましたが、私は何が分かりません。

+0

あなたが使用する必要がありますかコピーペースト?もしそうなら、クリップボードにどれくらいの時間データを保持する必要がありますか? – Comintern

+0

はい、かなり基本的です。このシートを使用すると、ユーザーは何百行ものデータを取り込んでフィルタリングし、カテゴリに割り当てることができます。コピー/ペーストは、ドロップダウンからカテゴリを一度選択してコピーすると、1つの行に何百もの他の行に貼り付けることができます。 –

+0

変数に格納するのはなぜでしょうか? – Comintern

答えて

0

[OK]をクリックすると、Excelは実際にここまでのすべてのステップを戦いました。本質的に、言われたように、インタフェースの変更はクリップボードを拭きます。だから私の場合、私がターゲットセルを選択したとき、自分のコードがクリップボードの横に新しいボタンを挿入していた。

2回目の試行で試したクリップボードをコピーしようとすると、何らかの理由で非常に信頼性が低いと判断されました。とにかく、答えはボタンの生成をトリガーするために別の列を使用することでした。したがって、ペーストのターゲットセルを選択すると、クリップボードはそのまま残ります。最後の落とし穴として

、(私が使用していたものである)のセルが選択されたときに検出するために、そのシートレベルのコードに注意して、細胞が保護されている場合は動作しませんが...

関連する問題