午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

ブックのフルパスを含めたアクティブセルアドレスをクリップボードにコピーするマクロ、めんどくさいを解決するめんどくさいマクロ

セルアドレスを含めたエクセルファイルのフルパスをクリップボードへ入れるマクロ
 
任意の文字列をクリップボードに入れるマクロには
普通とめんどくさいの2種類ある
Windows8.1の64bitとエクセルの組み合わせにはバグがあって普通が使えない!
ので今回は、めんどくさいほうのマクロ
 
 
セルA146を選択した状態でマクロを実行すると
E:\オレ\エクセル\VisualBasicでアプリ作成2.xlsm_文字_$A$146
がコピーされる
これは
E:\オレ\エクセル\VisualBasicでアプリ作成2.xlsm
がファイルのフルパスで
_文字
がシート名
_$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
使っていない変数や関数があるかもだけどこれで動いている
f:id:gogowaten:20191017143357p:plain
画像だとこう
書いた場所は個人用マクロブックの
PERSONAL.XLSBの標準モジュール

f:id:gogowaten:20191017143412p:plain

同じPERSONAL.XLSBのフォームに作ってあったUserForm2に
適当なボタンを作って、それにマクロを割り当てた
 
Private Sub CommandButtonCBクリップボードへフルパス_Click()
    Call クリップボードへアクティブセルのフルパスを送る
End Sub
 

f:id:gogowaten:20191017143430p:plain

 

f:id:gogowaten:20191017143441p:plain

ボタンを押すとクリップボード
E:\オレ\エクセル\VisualBasicでアプリ作成2.xlsm_文字_$A$146
がコピーされる
 
このマクロで何が嬉しいのか
アプリを作るときにもテストしたり考えたりするのにエクセルをよく使う
それを元にコードを書くんだけど2,3日くらいするとほとんど忘れる
エクセルに書いたから見ようとするけど、どこに書いたか忘れている
ならばコードの中にどこに書いたかをメモしておけばいい
でも手動で書くのはめんどくさい
このめんどくさいを解決
 

f:id:gogowaten:20191017143457p:plain

どのシートのどの辺りに書いたかなんてのはすぐ忘れるけど、これで少し良くなった