書斎仮想化

主にプログラムに関連した記事を投稿していきます。なるべく素早く導入して頂けるよう、独自の粒度で情報をまとめることをモットーに記事を執筆しております。

公開済みのVBAを諸々詰め込んだBookを作ってみた

はじめに

windows10 + Excel 2013で動作確認済

ポイント

  • 公開済みのVBAを諸々詰め込み+α

結論

以下からダウンロードできます

ダウンロードはこちら

  • Evernoteの公開ノートのリンクです。こちらに更新していきます。

おわりに

今後も随時実装していきます。

Excelのセルをダブルクリックしてその位置にスクリーンショット画像を貼り付けるコピペ

はじめに

開発環境

コピペ場所

VBA Projectの任意の場所にコピーしてお使いください。

例)VBA Project > Microsoft Excel Objects > Sheet1 (Sheet1)に貼り付けるなど

f:id:readyhawker:20180617011233j:plain

ポイント

動作

結論

コピペ内容

' セルのクリックイベント
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    ' 画像貼り付け
    Call fromClipBoardToCellPasteAction
End Sub

' クリップボードから画像をセルに貼り付け
Sub fromClipBoardToCellPasteAction()
    ' 変数宣言
    ' リサイズ値
    Dim reSize As Integer
    
    ' 変数設定
    reSize = 600
    
    ' クリップボードの内容が画像か判定する
    If isImg = False Then
        MsgBox "画像ではありません"
        Exit Sub
    End If
    
    ' クリップボードから画像をセルに貼り付け
    Call fromClipBoardToCellPaste(reSize)
End Sub

' クリップボードから画像をセルに貼り付け
Function fromClipBoardToCellPaste(ByVal reSize As Integer)
    ' 変数宣言
    ' 画像リサイズの縦と横
    Dim reSizeW As Integer
    Dim reSizeH As Integer
    
    ' 変数設定
    reSizeW = 0
    reSizeH = 0

    ' 貼り付け
    ActiveCell.PasteSpecial

    ' 画像リサイズ
    With Selection
        ' リサイズ値を算出(短辺を指定のサイズに設定し、長編の比率を合わせる)
        If (.Width <= .Height) Then
            reSizeW = reSize
            reSizeH = .Height * (reSizeW / .Width)
        Else
            reSizeH = reSize
            reSizeW = .Width * (reSizeH / .Height)
        End If
        
        ' リサイズ値の設定
        .Width = reSizeW
        .Height = reSizeH
    End With

    ' 画像配置調整
    With Selection
        '選択セルの左端から10ピクセル移動
        .Left = ActiveCell.Left + 10
        '選択セルの上端から10ピクセル移動
        .Top = ActiveCell.Top + 10
    End With

    ' 画像編集(枠線追加)
    With Selection.ShapeRange.line
        '枠線表示
        .Visible = msoTrue
        '枠線幅指定1ピクセル
        .Weight = 1
    End With
End Function

' クリップボードの内容が画像か確認する
Function isImg() As Boolean
    ' 変数宣言
    'クリップボードのデータ形式を確認・表示します。
    Dim tempObject As Variant
    Dim i As Long
    
    ' 結果
    Dim result As Boolean

    ' 変数設定
    result = False

    ' クリップボードオブジェクトを取得する
    tempObject = Application.ClipboardFormats

    ' クリップボードが空か判定する
    If tempObject(1) = -1 Then
        isImg = False
        Exit Function
    End If

    ' クリップボードの内容を確認
    For i = 1 To UBound(tempObject)
        Select Case tempObject(i)
            ' スクリーンショットはbitmap
            Case xlClipboardFormatBitmap
                result = True
            Case Else
                
        End Select
    Next
    isImg = result
End Function

出力結果

f:id:readyhawker:20180617012538j:plain

テストでのハードコピー系エビデンスの取得にどうぞ。

Excelのセルをダブルクリックしてファイルをセルに出力するコピペ

はじめに

開発環境

コピペ場所

VBA Projectの任意の場所にコピーしてお使いください。

例)VBA Project > Microsoft Excel Objects > Sheet1 (Sheet1)に貼り付けるなど

f:id:readyhawker:20180617010905j:plain

ポイント

動作

  • セルB2をクリックする
  • Excelブックが存在するディレクトリの「filelist.txt」を読み込む
  • セルB2~Bnに読み込んだファイルを1行ずつ出力する

結論

コピペ内容

' セルのクリックイベント
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    ' 変数宣言
    ' クリックセル位置
    Dim clickRow As Integer
    Dim clickCol As Integer
    
    ' 変数設定
    clickRow = 2
    clickCol = 2
    
    ' セルクリックイベントの位置を設定
    If (Target.row = clickRow And Target.Column = clickCol) Then
        Call readFileAction
    End If
End Sub

' ファイル読み込みアクション
Sub readFileAction()
    ' 変数宣言
    ' 読み込みファイル名とセル出力位置
    Dim fileName As String
    Dim outCellRow As Integer
    Dim outCellCol As Integer

    ' 変数設定
    fileName = "filelist.txt"
    outCellRow = 2
    outCellCol = 2
    
    ' ファイルの読み込みとセルに出力
    Call readFileAndCellOutAction(fileName, outCellRow, outCellCol)
    
    MsgBox "ファイルを読み込みました"
End Sub

' ファイルの読み込みとセルに出力
Function readFileAndCellOutAction(ByVal fileName As String, ByVal row As Integer, ByVal col As Integer)
    ' 変数宣言
    ' ファイル1行読み込み
    Dim line As String
    ' 出力セルの行移動カウンタ
    Dim outRowCounter As Integer
    
    ' 変数設定
    outRowCounter = 0
    
    ' ファイル読み込み
    Open ThisWorkbook.Path & "\" & fileName For Input As #1
        Do Until EOF(1)
            Line Input #1, line
            ' 1行を指定のセルに出力する
            Cells(row + outRowCounter, col).Value = line
            outRowCounter = outRowCounter + 1
        Loop
    Close #1
End Function

出力結果

f:id:readyhawker:20180616220003j:plain

おわりに

地味に毎回作っているので、コピペ化しました。ご自由にお使いください。

windowsBatでファイル名を取得するコピペ(下位層のフォルダ全てを対象にしたファイル名の取得)

はじめに

windows10にて動作確認済

ポイント

dirコマンドを使用します。パスの指定を「*」とし、実行ファイルが存在するディレクトリを含む、直下の全てのディレクトリを対象とします。

オプション 効果 備考
/b ファイル名のみを表示します
/a- 指定した属性のファイル「以外」を表示します 「-」を付けると右辺が否定対象になります
/d /aの属性です。ディレクトリを表します
/s /aの属性です。システムファイルを表します

使用状況としては以下の通りになります。

  1. /bでファイル名のみを表示します(バイト数や余計な補足情報を表示しないようにします)
  2. /a-/d/sでディレクトリを表示しないようにします。また、システムファイルを表示しないようにします。

結論

コピペ内容

dir * /b/a-/d/s > filelist.txt

出力例

list.txtと言うファイル名で、実行したパス直下に出力されます。

C:\Users\User\Desktop\aaa.txt
C:\Users\User\Desktop\bbb.xlsx
C:\Users\User\Desktop\ccc.lnk
C:\Users\User\Desktop\AAA\aaa.txt
C:\Users\User\Desktop\BBB\ZZZ\bbb.xlsx
C:\Users\User\Desktop\CCC\YYY\XXX\ccc.lnk

おわりに

ちょっとしたときに、やっぱり楽したいとき、うっかり忘れてしまったときにお使いください。

windowsBatでファイル名を取得するコピペ(直下のファイル名のみを取得)

はじめに

windows10にて動作確認済

ポイント

dirコマンドを使用します。パスを指定せず、いきなりオプションを指定することで、バッチファイルが存在するディレクトリのみを対象とすることができます。

オプション 効果 備考
/b ファイル名のみを表示します
/a- 指定した属性のファイル「以外」を表示します 「-」を付けると右辺が否定対象になります
/d /aの属性です。ディレクトリを表します

使用状況としては以下の通りになります。

  1. /bでファイル名のみを表示します(バイト数や余計な補足情報を表示しないようにします)
  2. /a-/dでディレクトリを表示しないようにします。

結論

コピペ内容

dir /b/a-d > filelist.txt

出力例

list.txtと言うファイル名で、実行したパス直下に出力されます。

aaa.txt
bbb.xlsx
ccc.lnk

おわりに

ちょっとしたときに、やっぱり楽したいとき、うっかり忘れてしまったときにお使いください。

powerShellのlistに要素を追加するとき標準出力に戻り値を出さないようにする

はじめに

windows10、powerShellにて問題発生

listに要素を追加するとき、標準出力に戻り値が出力されてしまう問題を解決する

ポイント

  • これを出さないよう対応するには、$nullに戻り値を返却する

結論

参考

# リストを新規作成
$list  = New-Object System.Collections.ArrayList
$null = $list.add('要素追加1')
$null = $list.add('要素追加2')
$null = $list.add('要素追加3')

おわりに

現状個人的にaddメソッドで対応しただけですが、他にも応用できると思います

powerShellでサブフォルダを含む全てのファイルをフルパスで取得するコピペ

はじめに

windows10にて動作確認済

ポイント

  • 実行階層がルートとなる
  • ルートを変える場合は事前にcdすること
  • 拡張子指定付き(以下の例では.mdを指定している)
  • リストで取得する

結論

コピペ内容

$list = Get-ChildItem -Recurse -File | Where-Object {$_.Extension.ToLower() -eq ".md"} | select-object fullname

出力例

$listにリスト形式で取得できる

用法例

# foreachで1つずつ取り出すやり方
foreach($path in $list){
    # フルパスはこのように取得する
    $path.FullName
}

おわりに

取得後がcmdよりも使いやすいですね!