4

さまざまなソースから Excel にデータを貼り付ける際に深刻な問題が発生しました。Excel はスマートになろうとする傾向があり、あらゆる種類のばかげた書式設定を行います。データはテキストとして必要です。

問題は、私たちには多くのユーザーがいて、その多くはコンピューターにあまり慣れていないため、毎回右クリックして「形式を選択して貼り付け」を使用するように依頼することはオプションではないということです.

「形式を選択して貼り付け」と「テキスト」を使用するマクロを記録し、ctrl-v をオーバーライドしてこの関数を使用することで解決策を見つけました。セルをマークしてコピーし、貼り付けようとするまでは、完全に機能しているように見えました。マクロがクラッシュしました。

したがって、必要なのは、コピーしたテキストを貼り付けようとしているかどうかを確認し、次の行を使用できる関数です。

 ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:= _
        False

マークされたセルを貼り付ける場合は、次の行を実行します(値のみを貼り付けるため):

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

私は Excel 用の VBA マクロを作成する経験があまりありません (その必要がないように願っています)。

4

4 に答える 4

3

クリップボードへのアクセス/操作のために、[プロジェクト] -> [参照] で Microsoft Forms 2.0 ライブラリへの参照を追加する必要があります。MSForms.DataObject次に、 (とりわけ)メソッドを持つクラスを使用してGetFormat、クリップボードに特定のタイプのデータがあるかどうかを確認できます。

これは、 を使用したクリップボード処理のかなり良い入門書DataObjectです。

于 2009-07-10T11:42:30.397 に答える
1
Sub PasteAsText() ' Assign Keyboard Shortcut: Ctrl+v
    Application.ScreenUpdating = False
    Select Case Application.CutCopyMode
        Case Is = False
                On Error Resume Next
                ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:=False
        Case Is = xlCopy
            If Not Range(GetClipboardRange).HasFormula Then
                Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
            Else
                ActiveSheet.Paste
            End If
        Case Is = xlCut
            ActiveSheet.Paste
    End Select
    Application.CutCopyMode = False
    Application.ScreenUpdating = True
End Sub

Function GetClipboardRange() As String
    ' Edited from http://www.ozgrid.com/forum/showthread.php?t=66773
    Dim formats    'Check to make sure clipboard contains table data
    formats = Application.ClipboardFormats
    For Each fmt In formats
        If fmt = xlClipboardFormatCSV Then
            Application.ActiveSheet.Paste Link:=True  'Paste link

            Dim addr1, addr2 As String 'Parse formulas from selection

            addr1 = Application.Substitute(Selection.Cells(1, 1).Formula, "=", "")
            addr2 = Application.Substitute(Selection.Cells(Selection.Rows.Count, Selection.Columns.Count).Formula, "=", "")

            GetClipboardRange = addr1 & IIf(addr1 <> addr2, ":" & addr2, "")
            Exit For
        End If
    Next
End Function
于 2012-12-17T12:29:58.960 に答える
1

これは最善の解決策ではありませんが、技術的には機能します。両方試してみてください。

On Error Resume Next
ActiveSheet.PasteSpecial Format:=Text, Link:=False, DisplayAsIcon:=False
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
于 2009-09-28T19:43:52.567 に答える
0

ターゲットシートのセルをテキストと等しくすることを検討しましたか?それらが一般的である場合、Excelは最善を尽くします-あなたが期待するものを推測します。

一方、本当にPasteSpecialを実装したい場合は...

キャッチできる「貼り付け」イベントはありません。ペーストが発生する可能性のあるすべての場所をキャッチできます。

たとえば、ブックの起動時に次のコードを発行すると(Workbook_Open)、CTRL-Vキーを押すことができます。

Application.OnKey "^v", "DoMyPaste"

これにより、Excelの貼り付け関数の代わりに関数が呼び出されます。次のようなものをモジュールに入れます。

Public Sub DoMyPaste()
    If Selection.[is marked cell] Then
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Else
        ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon _
        := False
    End If
End Sub

私はこれをテストしていません、これはもっと大まかなスケッチです。選択範囲が複数のセルになる可能性があるため、「マークされたセルのチェック」では、何らかの方法で範囲全体をチェックする必要があることに注意してください。

ただし、これは氷山の一角にすぎません。完全な解決策が必要な場合は、この記事を確認してください。これは、すべてのPaste呼び出しをキャッチするOCDバージョンです。

http://www.jkp-ads.com/Articles/CatchPaste.asp
于 2009-07-10T11:42:48.417 に答える