重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

行番号1から12の任意のセルをコピーして貼り付ける場合ですが、
行番号13以降への貼り付けをしようとしても「制御されています。」というメッセージボックスが出て、しかも貼り付けが実行されない設定をしたいと思います。
また、
行番号13以降の任意のセルをコピーして貼り付ける場合も、
行番号1から12への貼り付けをしようとしても「制御されています。」というメッセージボックスが出て、しかも貼り付けが実行されない設定をしたいと思います。This Workbookにどんなマクロ記述をしたらよいですか?
教えてください。よろしくお願いします。

A 回答 (1件)

ThisWorkbookに記述するということは、特定のシートではなくそのBOOKのすべてのシートに適用させるのですね?



こんなのはどうでしょう?
http://www2.aqua-r.tepm.jp/~kmado/kvba.htm
のE03M121 切り取り又はコピーされたセル範囲を取得する を参考にさせていただきました。

標準モジュールに

Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Declare Function CloseClipboard Lib "user32" () As Long
Declare Function RegisterClipboardFormat Lib "user32" Alias "RegisterClipboardFormatA" _
 (ByVal lpString As String) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
 (Destination As Any, Source As Any, ByVal Length As Long)
Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long

Function kGetRangeCopyCut() As Range
  Dim mem&, sz&, lk&, vv As Variant, buf$
  If Application.CutCopyMode = False Then Exit Function
  OpenClipboard 0&
  mem = GetClipboardData(RegisterClipboardFormat("Link"))
  CloseClipboard
  If mem = 0 Then Exit Function
  sz = GlobalSize(mem)
  lk = GlobalLock(mem)
  buf = String(sz, vbNullChar)
  CopyMemory ByVal buf, ByVal lk, sz
  GlobalUnlock mem
  vv = Split(buf, vbNullChar)
  buf = "'" & vv(1) & "'!" & Application.ConvertFormula(vv(2), xlR1C1, xlA1)
  Set kGetRangeCopyCut = Range(buf)
End Function


ThisWorkbookに

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  If Application.CutCopyMode <> xlCopy Then Exit Sub
  If kGetRangeCopyCut.Row < 13 Then
    If Target.Row > 12 Then buf = True
  Else
    If Target.Row < 13 Then buf = True
  End If
  If buf Then
    MsgBox "制御されています。"
    Application.EnableEvents = False
    Application.Undo
    Application.EnableEvents = True
  End If
End Sub
    • good
    • 0
この回答へのお礼

ご挨拶がおそくなり失礼しました。完璧でした。心よりお礼申し上げます。作成中の「万年予定出納日記帳」もこれを以て完成となりそうです。助かりました。このマクロがないとどうしても条件付き書式のセルが移動してしまったりで悩んでおりました。

お礼日時:2013/07/30 03:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!