0

私は比較的vbaに慣れていないので、優しくしてください:)

ctrl c/ctrl v またはコピー & ペーストが使用されているときに、スプレッドシートのセルの書式設定を保持すると思われるさまざまなスクリプトを確認しました。残念ながら、私の意図に沿ったバリエーションを得ることができないようです。これは、コピー&ペーストされている多くのデータが他のプログラムからコピーされ、ワー​​クシートに貼り付けられていることが原因である可能性があると思います(したがって、元のプログラムのフォーマットをコピーして保持します)。私が操作しようとしたすべてのマクロは、セル/ワークシートまたはワークブック間でコピーするときにフォーマットを保持しようとするようで、別のプログラムからコピーするときにデータ形式に対処しません.

別のアプローチを探しています。論理的な観点から、コピーしたデータを変数として保存し、そのフォーマットを取り除き、生の値のみを貼り付ける方法が ctrl v または貼り付けイベントにあるはずだと考えています。Pastespecial をいじってみましたが、pastespecial を強制する (または pastespecial を pastespecial に置き換える) 方法がわかりません。

ここにいくつかのコードサンプルがありますが、私にはうまくいかないようです。私は得続けます:

マクロ "C:...Test.xlsm'!MyPaste' を実行できません。このブックでマクロを使用できないか、すべてのマクロが無効になっている可能性があります。

マクロは確実に有効化され、コードは [ThisWorkbook(Code)] に貼り付けられます

Option Explicit

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim UndoList As String

    Application.ScreenUpdating = False
    Application.EnableEvents = False

    On Error GoTo Whoa

    '~~> Get the undo List to capture the last action performed by user
    UndoList = Application.CommandBars("Standard").Controls("&Undo").List(1)

    '~~> Check if the last action was not a paste nor an autofill
    If Left(UndoList, 5) <> "Paste" And UndoList <> "Auto Fill" Then GoTo LetsContinue

    '~~> Undo the paste that the user did but we are not clearing the clipboard
    '~~> so the copied data is still in memory
    Application.Undo

    If UndoList = "Auto Fill" Then Selection.Copy

    '~~> Do a pastespecial to preserve formats
    On Error Resume Next
    '~~> Handle text data copied from a website
    Target.Select
    ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:=False

    Target.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    On Error GoTo 0

    '~~> Retain selection of the pasted data
    Union(Target, Selection).Select

LetsContinue:
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume LetsContinue
End Sub
4

1 に答える 1

1

エラー メッセージの理由は、コードがイベント ハンドラーであることです。

見る:

基本的に、ユーザーがワークシートのセルを変更すると、 Worksheet.Change イベント (Excel)が発生します。Excel はWorksheet Objectオブジェクトをshとして、Range オブジェクト (Excel)Targetとして渡します。次に、コードでこれらのオブジェクトを使用します( Ozgrid Excel VBA Crash Course Lesson 4 - Common objects )。

David Zemensが提案したように、 SheetオブジェクトのPasteSpecialメソッドを使用する必要があります。詳細については、MSDN ライブラリ: PasteSpecial メソッド [Excel 2003 VBA 言語リファレンス]を参照してください。

読み終えたら、以下のコードをコピーして貼り付ける準備が整います。

Option Explicit

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim UndoList As String

    Application.ScreenUpdating = False
    Application.EnableEvents = False

    On Error GoTo Whoa

    '~~> Get the undo List to capture the last action performed by user
    UndoList = Application.CommandBars("Standard").Controls("&Undo").List(1)

    '~~> Check if the last action was not a paste nor an autofill
    If Left(UndoList, 5) <> "Paste" And UndoList <> "Auto Fill" Then GoTo LetsContinue

    '~~> Undo the paste that the user did but we are not clearing the clipboard
    '~~> so the copied data is still in memory
    Application.Undo

    If UndoList = "Auto Fill" Then Selection.Copy

    '~~> Do a pastespecial to preserve formats
    On Error Resume Next
    '~~> Handle text data copied from a website
    Target.PasteSpecial Paste:=xlPasteValues
    On Error GoTo 0

    '~~> Retain selection of the pasted data
    Target.Select

LetsContinue:
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume LetsContinue
End Sub

というbada bing bada bingわけで、作業コードと、コードが何をどのように行っているかをよりよく理解するのに役立つ読み物があります。

于 2013-05-18T15:52:23.467 に答える