セルアドレスを含めたエクセルファイルのフルパスをクリップボードへ入れるマクロ
普通とめんどくさいの2種類ある
Windows8.1の64bitとエクセルの組み合わせにはバグがあって普通が使えない!
ので今回は、めんどくさいほうのマクロ
セルA146を選択した状態でマクロを実行すると
がコピーされる
これは
がファイルのフルパスで
_文字
がシート名
_$A$146
がセルアドレス
書いたマクロ
Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Declare Function CloseClipboard Lib "User32" () As Long
Declare Function OpenClipboard Lib "User32" (ByVal hwnd As Long) As Long
Declare Function EmptyClipboard Lib "User32" () As Long
Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
Declare Function SetClipboardData Lib "User32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Public Const GHND = &H42
Public Const CF_TEXT = 1
Public Const MAXSIZE = 4096
Sub クリップボードへアクティブセルのフルパスを送る()
Dim RetVal As Long
Dim sLen As Long
Dim mObj As Long
Dim gMemH As Long
Const GHND = &H42
Dim MyString As String
Dim bookName, sheetName, cellAddress As String
bookName = ActiveWorkbook.fullname
sheetName = ActiveSheet.Name
cellAddress = ActiveCell.Address
MyString = bookName & "_" & sheetName & "_" & cellAddress
If OpenClipboard(0) = 0 Then Exit Sub
If EmptyClipboard() = 0 Then
RetVal = CloseClipboard()
Exit Sub
End If
sLen = LenB(MyString) + 1
mObj = GlobalAlloc(GHND, sLen)
If mObj = 0 Then Exit Sub
gMemH = GlobalLock(mObj)
If gMemH = 0 Then Exit Sub
RetVal = lstrcpy(gMemH, MyString)
GlobalUnlock (mObj)
RetVal = SetClipboardData(CF_TEXT, gMemH)
RetVal = CloseClipboard()
End Sub
使っていない変数や関数があるかもだけどこれで動いている
画像だとこう
書いた場所は個人用マクロブックの
PERSONAL.XLSBの標準モジュール
同じPERSONAL.XLSBのフォームに作ってあったUserForm2に
適当なボタンを作って、それにマクロを割り当てた
Private Sub CommandButtonCBクリップボードへフルパス_Click()
Call クリップボードへアクティブセルのフルパスを送る
End Sub
がコピーされる
このマクロで何が嬉しいのか
アプリを作るときにもテストしたり考えたりするのにエクセルをよく使う
それを元にコードを書くんだけど2,3日くらいするとほとんど忘れる
エクセルに書いたから見ようとするけど、どこに書いたか忘れている
ならばコードの中にどこに書いたかをメモしておけばいい
でも手動で書くのはめんどくさい
このめんどくさいを解決
どのシートのどの辺りに書いたかなんてのはすぐ忘れるけど、これで少し良くなった