クリップボードに日付型データが入っている場合のみ日付型テキストボックスの右クリックメニューの「貼り付け」を有効にする
クリップボードに日付型データが入っている場合は日付型テキストボックスの右クリックメニューの「貼り付け」を有効にし、クリップボードに日付型データが入っていない場合は日付型テキストボックスの右クリックメニューの「貼り付け」を無効にします。


クリップボードのデータを取得する関数の記述
標準モジュールにクリップボードのデータを取得する関数を記述します。
Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function CloseClipboard Lib "user32.dll" () As LongPtr
Private Declare PtrSafe Function IsClipboardFormatAvailable Lib "user32.dll" (ByVal wFormat As LongPtr) As LongPtr
Private Declare PtrSafe Function GetClipboardData Lib "user32.dll" (ByVal wFormat As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalLock Lib "kernel32.dll" (ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalUnlock Lib "kernel32.dll" (ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function GlobalSize Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
Private Declare PtrSafe Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyW" (ByVal lpString1 As LongPtr, ByVal lpString2 As LongPtr) As LongPtr
Public Function GetClipboard() As String
Dim iStrPtr As LongPtr
Dim iLen As LongPtr
Dim iLock As LongPtr
Dim sUniText As String
Const CF_UNICODETEXT As LongPtr = 13&
OpenClipboard 0&
If IsClipboardFormatAvailable(CF_UNICODETEXT) Then
iStrPtr = GetClipboardData(CF_UNICODETEXT)
If iStrPtr Then
iLock = GlobalLock(iStrPtr)
iLen = GlobalSize(iStrPtr)
sUniText = String$(CLng(iLen \ 2& - 1&), vbNullChar)
lstrcpy StrPtr(sUniText), iLock
GlobalUnlock iStrPtr
End If
GetClipboard = sUniText
End If
CloseClipboard
End Function下記サイトからコピペしました。
VBAでクリップボードへ文字列を送信・取得する3つの方法|VBA技術解説
ショートカットメニューの作成
標準モジュールに下記コードを記述します。
Sub CreateShortcutMenu(ByVal SCM As String)
'エラーなら引数のコマンドバーを削除
On Error Resume Next
CommandBars(SCM).Delete
On Error GoTo 0
' "shortcut"をCommandBarオブジェクト変数に設定 →①
Dim Shortcut As CommandBar
'新しいショートカット型のコマンド バーを作成し、コマンド バーのコレクションに追加。→②
Set Shortcut = CommandBars.Add(SCM, msoBarPopup, False, True)
'作成したコマンドバーにid=19「コピー」コントロール,id=22「貼り付け」コントロールを追加。→③
Shortcut.Controls.Add Type:=msoControlButton, ID:=19, before:=1
Shortcut.Controls.Add Type:=msoControlButton, ID:=22, before:=2
If SCM = "ShortcutMenu_Date" Then
If IsDate(GetClipboard) Then
Shortcut.Controls(2).Enabled = True
Else
Shortcut.Controls(2).Enabled = False
End If
End If
' "shortcut" 変数がCommandbarオブジェクトを参照するのを解除 →④
Set Shortcut = Nothing
End Sub下記サイトのコードを改変してショートカット型コマンドバーの名前がShortcutMenu_Dateの場合でクリップボードのデータが日付でないときは「貼り付け」を無効にしています。
ランタイム版で右クリックショートカットメニューを使用する 静にして以て幽なり
ショートカットメニュー作成用プロシージャの実行
フォームに下記コードを記述します。
Private Sub Form_Open(Cancel As Integer)
CreateShortcutMenu ("ShortcutMenu_Date")
CreateShortcutMenu ("ShortcutMenu_Name")
End Subショートカットメニュープロパティの設定
「ファイル」タブの「オプション」をクリック
↓
「Accessのオプション」ダイアログボックスを表示
↓
「カレントデータベース」をクリック
↓
「既定のショートカットメニュー」のチェックを外す
↓
フォームのショートカットメニュープロパティで「はい」を選択
↓
テキストボックスのショートカットメニューバープロパティにショートカットメニュー名を入力
日付テキストボックス:ShortcutMenu_Date
名前テキストボックス:ShortcutMenu_Name
日付テキストボックスのイベントプロシージャの記述
日付テキストボックスのイベントプロシージャに下記コードを記述します。
Private Sub txtDate_KeyDown(KeyCode As Integer, Shift As Integer)
KeyCode = 0
End Sub
Private Sub txtDate_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = acRightButton Then
CreateShortcutMenu ("ShortcutMenu_Date")
End If
txtDate.SelStart = 0
txtDate.SelLength = Len(Nz(txtDate.Text))
End Sub
