2017年10月16日

【Access】フォームをスクロールさせる


フォームのGoToPageメソッドを使ってフォームをスクロールさせることが出来ます。

書式

Me.GoToPage ページ番号, 横移動量, 縦移動量

移動量に指定する数値の単位はtwipです。

twipの大きさはおよそ次ように変換できると考えてください。

約567twip = 1cm
約15twip = 1ピクセル


たとえば、このようにフォームにフレームが縦に3つ並んでいるとします。


この各フレームに対してフォームヘッダー部にあるボタンで移動するには次のように記述します。
Private Sub buttonFrame1_Click()

    Me.GoToPage 1, 0, 0

End Sub

Private Sub buttonFrame2_Click()

    Me.GoToPage 1, 0, 4536

End Sub

Private Sub buttonFrame3_Click()

    Me.GoToPage 1, 0, 9072

End Sub

2017年10月15日

画像に矢印とか注釈を入れるソフトScreenpressoを使ってみた

これまでブログに載せる画像に矢印を入れたり、注釈を入れたりするのにGIMPを使っていたのですが、GIMPだと矢印の種類が少なく形もいまいちで、どうにも表現力に乏しすぎてなんとかならないかなと思っていました。

そこでネットでいろいろ調べてみたところ、どうやらみんなSkitchというソフトを使っているということが分かりました。

なるほど!そういうソフトがあったのか。それで早速自分も使ってみようと思い、Skitchのサイトに行ってみました。しかし、どこからダウンロードしていいか分かりません。なぜかいくら探してもどこにもそれらしいのが無いんですよね。

2017年10月14日

【Access】フォームの幅・高さ・位置を変更する


フォームの幅・高さ・位置を変更するには、DoCmd.MoveSizeを使います。

書式

DoCmd.MoveSize 左位置, 上位置, 幅, 高さ

幅や位置に指定する数値の単位はtwipです。

twipの大きさはおよそ次ように変換できると考えてください。

約567twip = 1cm
約15twip = 1ピクセル

たとえば、左位置2cm、上位置2cm、幅10cm、高さ6cmに変更する場合は次のように記述します。
Private Sub Form_Open(Cancel As Integer)

    DoCmd.MoveSize 1134, 1134, 5670, 3402
    
End Sub

2017年10月13日

【Access】フォームを最小化する


フォームを最小化するには、DoCmd.Minimizeを使います。

たとえば、このようなフォームにボタン(buttonMinimize)が付いているとします。


このボタンを押すとフォームが最小化するには次のように記述します。
Private Sub buttonMinimize_Click()

    DoCmd.Minimize
    
End Sub

2017年10月12日

【Access】フォームを最大化する


フォームを最大化するには、DoCmd.Maximizeを使います。

たとえば、このようなフォームにボタン(buttonMaximize)が付いているとします。


このボタンを押すとフォームが最大化するには次のように記述します。
Private Sub buttonMaximize_Click()

    DoCmd.Maximize
    
End Sub

2017年10月11日

【PowerShell】MP3ファイルのファイル名をトラック番号付きのファイル名に変更する


MP3ファイルのファイル名をトラック番号付きのファイル名に変更するスクリプトを作ってみました。

Rename-Mp3File.ps1
param($targetDir)

$sh = New-Object -ComObject Shell.Application
$music = $targetDir
$folder = $sh.Namespace($music) 
$items = Get-ChildItem -Path $music -Include *.mp3 -Name
 
foreach($f in $items)
{
    $fi = $folder.ParseName($f)
 
    #トラック番号取得
    $num = $folder.GetDetailsOf($fi,26).PadLeft(2,"0")
    
    $oldFile = Join-Path $music $f
    $newFile = Join-Path $music ($num + ' ' + $f)

    #ファイル名変更
    Rename-Item $oldFile $newFile
}

Get-ChildItem -Path $music

実行例

たとえばこのようなMP3ファイルが入っているフォルダがあるとします。



引数にこのフォルダを指定し、スクリプトを実行します。
PS C:\work\PowerShell> .\Rename-Mp3File.ps1 C:\work\mp3


    ディレクトリ: C:\work\mp3


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2011/04/07     21:32        2215447 01 Black Star.mp3
-a----       2011/04/07     21:33        5350940 02 What The Hell.mp3
-a----       2011/04/07     21:33        5009442 03 Push.mp3
-a----       2011/04/07     21:34        5748950 04 Wish You Were Here.mp3
-a----       2011/04/07     21:35        5255534 05 Smile.mp3
-a----       2011/04/07     21:35        5378378 06 Stop Standing There.mp3
-a----       2011/04/07     21:36        6495746 07 I Love You.mp3
-a----       2011/04/07     21:36        6019979 08 Everybody Hurts.mp3
-a----       2011/04/07     21:37        6512276 09 Not Enough.mp3
-a----       2011/04/07     21:37        5618114 10 4 Real.mp3
-a----       2011/04/07     21:38        5964249 11 Darlin.mp3
-a----       2011/04/07     21:39        7133430 12 Alice (Extended Version).mp3
-a----       2011/04/07     21:39        5588210 13 Remember When.mp3
-a----       2011/04/07     21:40        6297071 14 Goodbye.mp3
-a----       2011/04/07     21:40        5792376 15 What The Hell (Acoustic).mp3
-a----       2011/04/07     21:41        4538096 16 Push (Acoustic).mp3
-a----       2011/04/07     21:41        5675687 17 Wish You Were Here (Acoustic).mp3
-a----       2011/04/07     21:42        3499686 18 Knockin' On Heaven's Door.mp3
-a----       2011/04/07     21:42        4592732 19 Bad Reputation.mp3


ファイル名の先頭にトラック番号が付与されました。







2017年10月10日

【Access】エラーログ処理をクラス化する


以前、エラーログ出力の方法を書きましたが、こういうログ処理というのはクラスにまとめてしまうと使い勝手がよくなります。

LogClass

今回、VBEでクラスモジュールを追加し、名前をLogClassとしました。

プロパティでログファイルの最大サイズやローテーション世代数を設定出来るようにしています。

'定数
Private Const MAX_FILE_SIZE As Long = 4096            'ログファイルサイズ(KB)
Private Const LOG_FILE_NAME As String = "error"       'ログファイル名
Private Const LOG_FILE_EXT As String = "log"          '拡張子名
Private Const LOG_FOLDER As String = "Log"            'フォルダ名
Private Const ROTATE_NUM As Integer = 3               'ログローテーション世代数

'メンバ変数
Private mMaxFileSize As Long                            '最大ログファイルサイズ(KB)
Private mLogFileName As String                          'ログファイル名
Private mLogFileExt  As String                          '拡張子名
Private mLogFolderName As String                        'ログフォルダ名
Private mLogRotateNum As Integer                        'ログローテーション世代数

'Win32API
Private Declare Sub GetLocalTime Lib "kernel32" (lpSystem As SYSTEMTIME)

'構造体
Private Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek  As Integer
    wDay  As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type

'プロパティ
Public Property Let MaxFileSize(ByVal Value As Long)
    mMaxFileSize = Value
End Property

Public Property Let LogFileName(ByVal Value As String)
    mLogFileName = Value
End Property

Public Property Let LogFileExt(ByVal Value As String)
    mLogFileExt = Value
End Property

Public Property Let LogFolderName(ByVal Value As String)
    mLogFolderName = Value
End Property

Public Property Let LogRotateNum(ByVal Value As Integer)
    mLogRotateNum = Value
End Property

'クラス初期化処理
Private Sub Class_Initialize()

    'デフォルト値を設定
    mMaxFileSize = MAX_FILE_SIZE
    mLogFileName = LOG_FILE_NAME
    mLogFileExt = LOG_FILE_EXT
    mLogFolderName = LOG_FOLDER
    mLogRotateNum = ROTATE_NUM

End Sub

'エラーログ作成
Public Sub MakeErrorLog(ByRef errObj As ErrObject, _
                        ByVal procName As String)

    Dim errNumber        As Long
    Dim errDescription   As String
    Dim messageLog       As String
    
    'エラー情報を保管
    errNumber = errObj.Number
    errDescription = errObj.Description
    
    'エラーを消去
    errObj.Clear
    
    messageLog = "【エラー番号】" & errNumber & _
              " 【詳細】" & errDescription & _
              " 【発生場所】" & procName
    
    '書き込み
    Call WriteLog(messageLog)
    
    'メッセージボックス表示
    MsgBox errNumber & Space(2) & errDescription, vbCritical, "エラー"

End Sub

'ログ出力
Private Sub WriteLog(ByVal message As String)
On Error GoTo ErrorTrap

    Dim ts, fso         As FileSystemObject
    Dim projectPath     As String
    Dim logFolder       As String
    Dim logFile         As String
    Dim LogFileName     As String
    Dim sysLocalTime    As SYSTEMTIME
    
    
    '現在時刻を取得
    GetLocalTime sysLocalTime
    
    'ログファイル名
    LogFileName = "error.log"
    
    'プロジェクトパスを取得
    projectPath = CurrentProject.Path
    
    'ログ格納フォルダ
    logFolder = projectPath & "\" & mLogFolderName
    
    'FileSystemObjectオブジェクトを作成する
    Set fso = CreateObject("Scripting.FileSystemObject")
   
    'ログ格納フォルダの確認(なければ作成)
    If fso.FolderExists(logFolder) = False Then
        'フォルダを作成する
        Call fso.CreateFolder(logFolder)
    End If
    
    'ログファイルフルパス名
    logFile = logFolder & "\" & LogFileName
    
    'ログローテート
    Call LogRotate(logFile)
    
    'ファイルオープン
    Set ts = fso.OpenTextFile(logFile, ForAppending, True)

    '書き込み
    Call ts.WriteLine("[" & sysLocalTime.wYear & "/" & _
                        Format(sysLocalTime.wMonth, "00") & "/" & _
                        Format(sysLocalTime.wDay, "00") & " " & _
                        Format(sysLocalTime.wHour, "00") & ":" & _
                        Format(sysLocalTime.wMinute, "00") & ":" & _
                        Format(sysLocalTime.wSecond, "00") & "." & _
                        Format(sysLocalTime.wMilliseconds, "000") & "] " & message)
                      
    'ファイルクローズ
    ts.Close
    
    Set ts = Nothing
    Set fso = Nothing
    
Exit Sub
ErrorTrap:
    MsgBox Err.Number & Space(2) & Err.Description, vbCritical, "エラー"
End Sub

'ログローテート
Private Sub LogRotate(ByVal fileName As String)
On Error GoTo Err_Trap

    Dim fso        As FileSystemObject
    Dim i          As Integer
    Dim r          As Integer
    Dim folderPath As String
    Dim srcFile    As String
    Dim destFile   As String
    Dim oldestFile As String
    Dim checkFile  As String
    Dim fileSize   As Long

    'FileSystemObjectオブジェクトを作成する
    Set fso = CreateObject("Scripting.FileSystemObject")
   
    'ファイルが存在するかチェック
    If fso.FileExists(fileName) = False Then
        Exit Sub
    End If

    'ファイルサイズを取得する
    fileSize = fso.GetFile(fileName).Size

    'ファイルサイズをチェック
    If fileSize < mMaxFileSize * 1024 Then
        '最大サイズを超えてなければ処理を抜ける
        Exit Sub
    End If

    'フォルダパスを取得
    folderPath = fso.GetParentFolderName(fileName)

    '最古ファイルパス
    oldestFile = folderPath & "\" & mLogFileName & mLogRotateNum & "." & mLogFileExt

    '最古ファイルが存在すれば削除
    If fso.FileExists(oldestFile) Then
        Call fso.DeleteFile(oldestFile)
        r = mLogRotateNum - 1
    Else
        'ローテーション世代数を調べる
        For r = (mLogRotateNum - 1) To 0 Step -1
            If r = 0 Then
                checkFile = folderPath & "\" & mLogFileName & "." & mLogFileExt
            Else
                checkFile = folderPath & "\" & mLogFileName & r & "." & mLogFileExt
            End If

            If fso.FileExists(checkFile) Then
                Exit For
            End If
        Next
    End If

    'ファイル名をローテーションする
    For i = r To 0 Step -1
        If i = 0 Then
            srcFile = folderPath & "\" & mLogFileName & "." & mLogFileExt
        Else
            srcFile = folderPath & "\" & mLogFileName & i & "." & mLogFileExt
        End If

        destFile = folderPath & "\" & mLogFileName & i + 1 & "." & mLogFileExt

        If fso.FileExists(srcFile) Then
            'ファイル名変更
            Call fso.MoveFile(srcFile, destFile)
        End If
    Next

Exit_Trap:

    Set fso = Nothing

Exit Sub
Err_Trap:
    MsgBox Err.Number & Space(2) & Err.Description, vbCritical, "エラー"
    Resume Exit_Trap
End Sub