写真一括貼り付けVBA(セル結合、縦横比固定)

写真の縦横比を固定した状態で結合されているセルに、一括で写真の貼り付けを行う処理を紹介します。

ボタン押下時の実行内容

・貼り付けたい写真の一覧を選択

・印刷範囲を設定しながら写真を指定の位置に貼り付け

前提条件

選択された写真は結合したセルに貼るように処理をしています。

結合したセルの大きさに合わせて写真の位置調整を行っているため、セル結合がされていない箇所に写真の貼り付けを行うと警告を返すようにしています。

セルが結合していないパターンで写真を貼り付けを行いたい場合は、写真の一括貼り付けVBAをご参考願います。

実行前

実行後

実行内容

結合したセルに、写真の縦横比を固定した状態で貼り付けています。

写真の大きさは結合したセルの高さに合わせるように設定しています。

写真貼り付け押下時の処理内容

Sub 写真貼り付け_Click()
    
    'ループ関数を設定
    Dim i As Integer
    Dim currentRow As Integer
    
    Dim FileName As Variant
    Dim dblscal As Double
    Dim str As String
    
    '撮影日
    Dim day As Date
    Dim ObjShell As Object
    Dim ObjFolder As Object
    Dim filePath As Variant
    Dim file As Variant
    

    '写真位置設定用変数
    Dim photoCell As Range
    
    Dim shpTemp As Shape  ' 一時的な Shape オブジェクト参照用
  
    '写真の一覧を取得
    FileName = Application.GetOpenFilename( _
        filefilter:="画像ファイル,*.bmp;*.jpg;*.gif;*.JPG", _
        MultiSelect:=True)
    '写真ファイルを選択しなかった場合は処理を終わらせる
    If Not IsArray(FileName) Then Exit Sub
    
    '処理中画面描写をしない
    Application.ScreenUpdating = False
        
    
    '印刷範囲の初期設定
    str = Range(Cells(1, 1), Cells(60, 16)).Address
    '原本シートのコピーを末尾に追加
    Worksheets("原本").Copy After:=Worksheets(Worksheets.Count)
    'ボタンを削除
    On Error Resume Next  ' エラーを無視して続行
    ActiveSheet.DrawingObjects.Delete
    On Error GoTo 0  ' エラー無視を解除
    
    'シェルの機能の参照
    Set ObjShell = CreateObject("Shell.Application")
    
    ' 初期位置設定
    currentRow = 2
    
    '取得した写真リストをセルに貼り付け
    For i = LBound(FileName) To UBound(FileName)
        ' 3枚ごとに新しいページを作成
        If i <> 1 And i Mod 3 = 1 Then
            Worksheets("原本").Range(str).Copy
            Cells((i \ 3) * 60 + 1, 1).PasteSpecial
            Application.CutCopyMode = False
            ActiveSheet.HPageBreaks.Add before:=Cells(((i \ 3) * 60) + 1, 1)
            currentRow = ((i \ 3) * 60) + 2  ' 新しいページの開始行
        End If
        
        ' B2セルを選択(このセルは既に結合されていることを前提)
        Set photoCell = Cells(currentRow, 2)  ' B列 (2)
        
        ' 結合セルの範囲を取得(結合済みの場合)
        Dim mergedRange As Range
        If photoCell.MergeCells Then
            Set mergedRange = photoCell.MergeArea
        Else
            ' 結合されていない場合は警告を表示
            MsgBox "セル " & photoCell.Address & " は結合されていません。"
            Set mergedRange = photoCell
        End If
        
        '選択ファイル - 縦横比を保持して貼り付け
        Set shpTemp = ActiveSheet.Shapes.AddPicture( _
            FileName:=FileName(i), _
            linktofile:=False, _
            savewithdocument:=True, _
            Left:=mergedRange.Left + 1, _
            Top:=mergedRange.Top + 1, _
            Width:=-1, _
            Height:=-1)
            
        '縦横比を保持
        shpTemp.LockAspectRatio = msoTrue
        
        ' 結合セルの高さに合わせて写真のサイズを調整
        shpTemp.Height = mergedRange.Height - 1
        
        ' 写真の位置を範囲の中央に調整
        shpTemp.Left = mergedRange.Left + (mergedRange.Width - shpTemp.Width) / 2
        shpTemp.Top = mergedRange.Top + (mergedRange.Height - shpTemp.Height) / 2
        
        '写真の貼り直し
        shpTemp.Select
        Selection.Cut
        ActiveSheet.PasteSpecial Format:="図 (JPEG)", Link:=False, DisplayasIcon:=False
        
        ' 写真の位置を調整
        With Selection.ShapeRange
            .LockAspectRatio = msoTrue
            .Height = mergedRange.Height - 2
            .Left = mergedRange.Left + (mergedRange.Width - .Width) / 2
            .Top = mergedRange.Top + (mergedRange.Height - .Height) / 2
        End With
        
        Application.CutCopyMode = False
        
        'Noに数を記入 
        Cells(currentRow + 1, 11 + 4) = i  
        
        'ファイルパスの取得
        filePath = Left(FileName(i), InStrRev(FileName(i), "\"))
        'ファイル名の取得
        file = Mid(FileName(i), Len(filePath) + 1)
        
        '写真データを参照
        On Error Resume Next  ' エラーを無視
        Set ObjFolder = ObjShell.Namespace(filePath).ParseName(file)
        
        '写真の撮影日を取得
        If Not ObjFolder Is Nothing Then
            day = ObjFolder.ExtendedProperty("System.Photo.DateTaken")
            '写真のデータの参照を解放
            Cells(currentRow + 3, 11 + 4) = Format(day, "yyyy年m月d日")
        End If
        Set ObjFolder = Nothing
        On Error GoTo 0  ' エラー無視を解除
        
        ' 次の写真は20行下に配置
        currentRow = currentRow + 20
        
    Next i
    
    'シェルの解放
    Set ObjShell = Nothing
    
    '印刷範囲を設定
    Dim lastRow As Long
    lastRow = ((UBound(FileName) - 1) \ 3 + 1) * 60
    str = Range(Cells(1, 1), Cells(lastRow, 16)).Address
    
    ActiveSheet.PageSetup.PrintArea = str
    
    Cells(1, 1).Select
    
    '画面描写を実行
    Application.ScreenUpdating = True
    
End Sub

写真の縦横比を固定する処理

        '選択ファイル - 縦横比を保持して貼り付け
        Set shpTemp = ActiveSheet.Shapes.AddPicture( _
            FileName:=FileName(i), _
            linktofile:=False, _
            savewithdocument:=True, _
            Left:=mergedRange.Left + 1, _
            Top:=mergedRange.Top + 1, _
            Width:=-1, _
            Height:=-1)
            
        '縦横比を保持
        shpTemp.LockAspectRatio = msoTrue

shpTemp.LockAspectRatio = msoTrueの処理で縦横比を固定しています。

msoTrueがmsoFalseになると縦横比は固定されません。

結合したセルの高さに合わせて写真の大きさを変更する処理

        ' B2セルを選択(このセルは既に結合されていることを前提)
        Set photoCell = Cells(currentRow, 2)  ' B列 (2)
        
        ' 結合セルの範囲を取得(結合済みの場合)
        Dim mergedRange As Range
        If photoCell.MergeCells Then
            Set mergedRange = photoCell.MergeArea
        Else
            ' 結合されていない場合は警告を表示
            MsgBox "セル " & photoCell.Address & " は結合されていません。"
            Set mergedRange = photoCell
        End If
 
      
       '~~~~~略~~~~~

        
        ' 結合セルの高さに合わせて写真のサイズを調整
        shpTemp.Height = mergedRange.Height - 1

shpTemp.Height = mergedRange.Height – 1 は

変数(今回は写真).高さ = 変数(今回は結合したセル).高さ – 1

のイメージです。

写真の撮影日付の取得処理について

        'ファイルパスの取得
        filePath = Left(FileName(i), InStrRev(FileName(i), "\"))
        'ファイル名の取得
        file = Mid(FileName(i), Len(filePath) + 1)
        
        '写真データを参照
        On Error Resume Next  ' エラーを無視
        Set ObjFolder = ObjShell.Namespace(filePath).ParseName(file)
        
        '写真の撮影日を取得
        If Not ObjFolder Is Nothing Then
            day = ObjFolder.ExtendedProperty("System.Photo.DateTaken")
            '写真のデータの参照を解放
            Cells(currentRow + 3, 11 + 4) = Format(day, "yyyy年m月d日")
        End If
        Set ObjFolder = Nothing

撮影日の取得処理が不要な場合は削除しても問題ありません。

Cells(currentRow + 3, 11 + 4) = Format(day, “yyyy年m月d日”)の行でセルに値を設定しています。コメントアウト(’←をコメントしたい行の先頭に追加)して頂ければ処理は実行されません。

処理内容は過去のブログの内容をご参考願います。

写真の撮影日の取得機能の追加

写真の撮影日取得の処理の説明

今回はセルを結合した状態で写真を一括貼り付けする処理を紹介させて頂きました。

文字列の内容 Val関数

Val関数は文字列に含まれる数値を、適切な型の数値として返します。

Val関数の構文

Val(string)

Val(文字列)

文字列の先頭に&0を設定すると8進数として認識します。

文字列の先頭に&Hを設定すると16進数として認識します。

空白とタブは無視されます。

Val関数の使用例

・文字列が空白と数値のみ

・文字列の数値が全角

・文字列が数値の後に文字がある

・文字列が数値の前に文字がある

・文字列に数値がない

・文字列が数値と数値の間に文字がある

・8進数として表示する

・16進数として表示する

・セルから文字列を取得して合計を表示

の内容で説明していきます。

文字列が空白と数値のみ

Sub Val1()

    MsgBox Val("   1000")
    
End Sub

1000が表示されました。

文字列の数値が全角

Sub Val2()

    MsgBox Val("1000")
    
End Sub

全角の数値は認識されず、0が表示されます。

文字列が数値の後に文字がある

Sub Val3()

    MsgBox Val("1 0 0円")
    
End Sub

100が表示されました。

文字列が数値の前に文字がある

Sub Val4()

    MsgBox Val("¥100")
    
End Sub

¥は数値ではないので0が表示されます。

文字列に数値がない

Sub Val5()

    MsgBox Val("あいう")
    
End Sub

もちろん数値がないので0が表示されます。

文字列が数値と数値の間に文字がある

Sub Val6()

    MsgBox Val("100.2と100")
    
End Sub

“と”は文字ですのでその前の100.2が表示されました。

8進数として表示する

Sub Val7()

    MsgBox Val("&034")
    
End Sub

3×8+4なので28が表示されました。

16進数として表示する

Sub Val8()

    MsgBox Val("&HAb")
    
End Sub

A=10

B=11

10×16+11なので171が表示されました。

今回はVal関数について記載させて頂きました。

少しでも皆様の参考になれば幸いです。

文字列の内容 Format関数 数値・文字列の表示

Format関数は日付や数値など表示形式を設定する場合に使用します。

Format関数の数値・文字列の表示の使用例について説明します。

Format関数の構文

Format(Expression, [Format], [FirstDayOfWeek], [FirstWeekOfYear])

Format(日付や数値などの文字列, [書式指定式], [週の最初の曜日], [年内の最初の週])

[]内は省略可能です。

Formatの内容

日付・時刻以外の書式をユーザーで定義する場合の内容です。

文字説明
0桁の位置や桁数を設定する
対応する桁の位置に数値がない場合、ゼロ(0)が表示される
#桁の位置や桁数を設定する
対応する桁の位置に数値がない場合は何も表示されない
¥円記号(¥)の次の文字をそのまま表示する
「¥¥」とすると、円記号を表示できる
@1つの文字やスペースを設定する
文字列より「@」の数が多い場合、先頭に空白を付けて表示される
&1つの文字を設定する
文字列より「&」の数が多い場合、文字列だけが左揃えで表示される
<アルファベットを小文字に変換する
>アルファベットを大文字に変換する
!文字を左から右に埋める
他のユーザー定義と組み合わせる

Format関数の使用例

・0を設定する

・#を設定する

・¥を設定する

・@を設定する

・&を設定する

・<を設定する

・>を設定する

・!を設定する

の内容で説明をしていきます。

0を設定する

対応する桁の位置に数値がない場合、ゼロ(0)が表示される。

Sub Format数値1()

    MsgBox Format(1234, "00000")
    
End Sub

数値は4桁で、桁数は5桁です。

先頭に0が付き5桁が表示されました。

Sub Format数値2()

    MsgBox Format(1234, "000")
    
End Sub

数値は4桁で、桁数は3桁です。

4桁が表示されました。

#を設定する

対応する桁の位置に数値がない場合は何も表示されない。

Sub Format数値3()

    MsgBox Format(1234, "#####")
    
End Sub

数値は4桁で、#は5桁です。

4桁が表示されました。

Sub Format数値4()

    MsgBox Format(1234, "###")
    
End Sub

数値は4桁で、#は3桁です。

4桁が表示されました。

¥を設定する

円記号(¥)の次の文字をそのまま表示する。

先頭に¥を付けたい。

Sub Format文字1()

    MsgBox Format(1234, "¥¥###00")
    
End Sub

先頭に¥が表示されました。

¥を1つにした場合。

Sub Format文字2()

    MsgBox Format(1234, "¥###00")
    
End Sub

¥の後に#が設定されているため#が表示されます。

@を設定する

文字列より「@」の数が多い場合、先頭に空白を付けて表示される

Sub Format文字3()

    MsgBox "あいう" + Format("えお", "@@@")
    
End Sub

“えお”を@@@で表示する様に設定します。

“えお”の前に空白が表示されました。

Sub Format文字4()

    MsgBox "あいう" + Format("えお", "@")
    
End Sub

“えお”を@で表示する様に設定します。

“あいうえお”と表示されました。

&を設定する

文字列より「&」の数が多い場合、文字列だけが左揃えで表示される。

Sub Format文字5()

    MsgBox "あいう" + Format("えお", "&&&")
    
End Sub

“えお”を&&&で表示する様に設定します。

“あいうえお”と表示されました。

Sub Format文字6()

    MsgBox "あいう" + Format("えお", "&")
    
End Sub

“えお”を&で表示する様に設定します。

“あいうえお”と表示されました。

<を設定する

アルファベットを小文字に変換する。

Sub Format文字7()

    MsgBox Format("AbCdE", "<")
    
End Sub

“ACE”が大文字、”bd”が小文字です。

全ての文字が小文字で表示されました。

>を設定する

アルファベットを大文字に変換する。

Sub Format文字8()

    MsgBox Format("AbCdE", ">")
    
End Sub

“ACE”が大文字、”bd”が小文字です。

全ての文字が大文字で表示されました。

!を設定する

文字を左から右に埋める。

!を使用しない場合

Sub Format文字9()

    MsgBox "あいう" + Format("えお", "@@@") + "かき"
    
End Sub

@は文字数以上設定していると空白になるので”え”の前に空白が入ります。

!を使用した場合

Sub Format文字10()

    MsgBox "あいう" + Format("えお", "!@@@") + "かき"
    
End Sub

!を使用することによって左埋めになり”お”の後に空白が入ります。

今回はFormat関数の数値・文字列の表示について記載させて頂きました。

少しでも皆様の参考になれば幸いです。

文字列の内容 Format関数 日付関連の使用例

Format関数は日付や数値など表示形式を設定する場合に使用します。

Format関数の使用例について説明します。

Format関数の定義済みの内容などの説明は前回の内容を参考に確認お願い致します。

Format関数の構文

Format(Expression, [Format], [FirstDayOfWeek], [FirstWeekOfYear])

Format(日付や数値などの文字列, [書式指定式], [週の最初の曜日], [年内の最初の週])

[]内は省略可能です。

Format関数の使用例

・定義済みの書式で日付を表示(Long Date)

・定義済みの書式で日付を表示(Medium Date)

・定義済みの書式で日付を表示(Short Date)

・定義済みの書式で日付を表示(Long Time)

・定義済みの書式で日付を表示(Medium Time)

・定義済みの書式で日付を表示(Short Time)

・日付1桁の場合、先頭に0は付けない

・日付1桁の場合、先頭に0を付ける

・英語(省略形)表記の曜日

・日本語(省略形)表記の曜日

・英語表記の曜日

・日本語表記の曜日

・年、月、日を含むyyyy/mm/dd形式の日付を表示

・日本の場合は年月日で日付を表示

・曜日を表す数値

・その日が一年のうちで何週目かを表す数値

・月1桁の場合、先頭に0は付けない

・月1桁の場合、先頭に0を付ける

・英語(省略形)表記の月の名前

・英語表記の月の名前

・日本語表記の月の名前

・1年のうちで何番目の四半期かを表す数値

・年号の頭文字

・年号の頭文字の漢字1文字

・年号

・年号に基づく和暦1桁の場合、先頭に0は付けない

・年号に基づく和暦1桁の場合、先頭に0を付ける

・1年のうちで何日目かを表す数値

・西暦年の下2桁の数値

・西暦年の4桁の数値

・時間1桁の場合、先頭に0は付けない

・時間1桁の場合、先頭に0は付ける

・分1桁の場合、先頭に0は付けない

・分1桁の場合、先頭に0を付ける

・秒1桁の場合、先頭に0は付けない

・秒1桁の場合、先頭に0を付ける

・h:nn:ss形式の時刻

・AM/PM表記

・am/pm表記

・A/P表記

・a/p表記

・FirstDayOfWeekの設定方法

・FirstWeekOfYearの設定方法

の内容で説明をしていきます。

定義済みの書式で日付を表示(Long Date)

Sub format1()

    MsgBox Format("2022/04/03 16:49:45", "Long Date")
    
End Sub

定義済みの書式で日付を表示(Medium Date)

Sub format2()

    MsgBox Format("2022/04/03 16:49:45", "Medium Date")
    
End Sub

定義済みの書式で日付を表示(Short Date)

Sub format3()

    MsgBox Format("2022/04/03 16:49:45", "Short Date")
    
End Sub

定義済みの書式で日付を表示(Long Time)

Sub format4()

    MsgBox Format("2022/04/03 16:49:45", "Long Time")
    
End Sub

定義済みの書式で日付を表示(Medium Time)

Sub format5()

    MsgBox Format("2022/04/03 16:49:45", "Medium Time")
    
End Sub

定義済みの書式で日付を表示(Short Time)

Sub format6()

    MsgBox Format("2022/04/03 16:49:45", "Short Time")
    
End Sub

日付1桁の場合、先頭に0は付けない

Sub format7()

    MsgBox Format("2022/04/03", "d")
    
End Sub

日付1桁の場合、先頭に0を付ける

Sub format8()

    MsgBox Format("2022/04/03", "dd")
    
End Sub

英語(省略形)表記の曜日

Sub format9()

    MsgBox Format("2022/04/03", "ddd")
    
End Sub

日本語(省略形)表記の曜日

Sub format10()

    MsgBox Format("2022/04/03", "aaa")
    
End Sub

英語表記の曜日

Sub format11()

    MsgBox Format("2022/04/03", "dddd")
    
End Sub

日本語表記の曜日

Sub format12()

    MsgBox Format("2022/04/03", "aaaa")
    
End Sub

年、月、日を含むyyyy/mm/dd形式の日付を表示

Sub format13()

    MsgBox Format("2022年04月03日", "ddddd")
    
End Sub

日本の場合は年月日で日付を表示

Sub format14()

    MsgBox Format("2022/04/03", "dddddd")
    
End Sub

曜日を表す数値

日曜日が1、土曜日が7

Sub format15()

    MsgBox Format("2022/04/03", "w")
    
End Sub

その日が一年のうちで何週目かを表す数値

Sub format16()

    MsgBox Format("2022/04/03", "ww")
    
End Sub

月1桁の場合、先頭に0は付けない

Sub format17()

    MsgBox Format("2022/04/03", "m")
    
End Sub

月1桁の場合、先頭に0を付ける

Sub format18()

    MsgBox Format("2022/4/03", "mm")
    
End Sub

英語(省略形)表記の月の名前

Sub format19()

    MsgBox Format("2022/4/03", "mmm")
    
End Sub

英語表記の月の名前

Sub format20()

    MsgBox Format("2022/4/03", "mmmm")
    
End Sub

日本語表記の月の名前

Sub format21()

    MsgBox Format("2022/4/03", "oooo")
    
End Sub

1年のうちで何番目の四半期かを表す数値

Sub format22()

    MsgBox Format("2022/4/03", "q")
    
End Sub

年号の頭文字

Sub format23()

    MsgBox Format("2022/4/03", "g")
    
End Sub

年号の頭文字の漢字1文字

Sub format24()

    MsgBox Format("2022/4/03", "gg")
    
End Sub

年号

Sub format25()

    MsgBox Format("2022/4/03", "ggg")
    
End Sub

年号に基づく和暦1桁の場合、先頭に0は付けない

Sub format26()

    MsgBox Format("2022/4/03", "e")
    
End Sub

年号に基づく和暦 1桁の場合、先頭に0を付ける

Sub format27()

    MsgBox Format("2022/04/03", "ee")
    
End Sub

1年のうちで何日目かを表す数値

Sub format28()

    MsgBox Format("2022/04/03", "y")
    
End Sub

西暦年の下2桁の数値

Sub format29()

    MsgBox Format("2022/04/03", "yy")
    
End Sub

西暦年の4桁の数値

Sub format30()

    MsgBox Format("2022/04/03", "yyyy")
    
End Sub

時間1桁の場合、先頭に0は付けない

Sub format31()

    MsgBox Format("06:49:45", "h")
    
End Sub

時間1桁の場合、先頭に0は付ける

Sub format32()

    MsgBox Format("6:49:45", "hh")
    
End Sub

分1桁の場合、先頭に0は付けない

Sub format33()

    MsgBox Format("06:09:45", "n")
    
End Sub

分1桁の場合、先頭に0を付ける

Sub format34()

    MsgBox Format("06:9:45", "nn")
    
End Sub

秒1桁の場合、先頭に0は付けない

Sub format35()

    MsgBox Format("06:49:05", "s")
    
End Sub

秒1桁の場合、先頭に0を付ける

Sub format36()

    MsgBox Format("06:49:5", "ss")
    
End Sub

h:nn:ss形式の時刻

Sub format37()

    MsgBox Format("06:49:5", "ttttt")
    
End Sub

AM/PM表記

Sub format38()

    MsgBox Format("06:49:05", "AM/PM")
    
End Sub

am/pm表記

Sub format39()

    MsgBox Format("16:49:05", "am/pm")
    
End Sub

A/P表記

Sub format40()

    MsgBox Format("06:49:05", "A/P")
    
End Sub

a/p表記

Sub format41()

    MsgBox Format("16:49:05", "a/p")
    
End Sub

FirstDayOfWeekの設定方法

日曜日が 1(規定)、土曜日が 7

通常の場合

Sub format42()

    MsgBox Format("2022/04/04", "w")
    
End Sub

2022/04/04は月曜日のため2が表示されます。

月曜日を週の始まりとして設定

Sub format43()

    MsgBox Format("2022/04/04", "w", 2)
    
End Sub

規定値を2(月曜日)に設定したので戻り値が1になりました。

FirstWeekOfYearの設定方法

2022年1月前半のカレンダーです。

規定として1 月 1 日が含まれる週から開始します。

Sub format44()

    MsgBox Format("2022/01/2", "ww")
    
End Sub

2022/1/2は2週目なので、2が戻り値です。

定数説明
vbFirstJan111 月 1 日が含まれる週から開始します (既定)。
vbFirstFourDays24 日以上が含まれる最初の週が年の第 1 週目になります。
vbFirstFullWeek31 週間全体が含まれる最初の週がその年の第 1 週目になります。

FirstWeekOfYearの値を3に設定します。

Sub format45()

    MsgBox Format("2022/01/2", "ww", , 3)
    
End Sub

1 週間全体が含まれる最初の週がその年の第 1 週目になりますので、1が戻り値です。

今回はFormat関数の日付関連の使用例について記載させて頂きました。

次回はFormat関数の数値関連について記載していきます。

少しでも皆様の参考になれば幸いです。

文字列の内容 Format関数 日付関連の説明

Format関数は日付や数値など表示形式を設定する場合に使用します。

Format関数は長くなるため説明と使用例に分けます。

Format関数の構文

Format(Expression, [Format], [FirstDayOfWeek], [FirstWeekOfYear])

Format(日付や数値などの文字列, [書式指定式], [週の最初の曜日], [年内の最初の週])

[]内は省略可能です。

Formatの内容

Format(Expression, [Format], [FirstDayOfWeek], [FirstWeekOfYear])

Formatの定義済みの書式で日付や時間の内容です。

定義済みの書式内容表示内容
Long Date年月日で日付を表示2022年3月27日
Medium Date簡略形式で日付を表示22-03-27
Short Date短い形式で日付を表示2022/03/27
Long Time時刻、分、秒で時刻を表示16:33:49
Medium Time午前、午後表記で時間と分を表示04:33 午後
Short Time時間と分を24時間制で表示16:33

ユーザーで定義する書式の内容です。

定義内容表示内容
:時刻の区切り記号16:33:49
/日付の区切り記号2022/03/27
cdddddおよびtttttの書式で表した日付と時刻を、日付、時刻の順で表示2022/03/27 16:33:49
d日付1桁の場合、先頭に0は付けない1~31
dd日付1桁の場合、先頭に0を付ける01~31
ddd英語(省略形)表記の曜日Sun~Sat
aaa日本語(省略形)表記の曜日日~土
dddd英語表記の曜日Sunday~Saturday
aaaa日本語表記の曜日日曜日~土曜日
ddddd年、月、日を含むyyyy/mm/dd形式の日付を表示2022/03/27
dddddd日本の場合は年月日で日付を表示2022年3月27日
w曜日を表す数値日曜日が 1、
土曜日が 7
wwその日が一年のうちで何週目かを表す数値1~54
m月1桁の場合、先頭に0は付けない
hやhhの直後にmを指定した場合は、分で表示
1~12
mm月1桁の場合、先頭に0を付ける
hやhhの直後にmを指定した場合は、分で表示
01~12
mmm英語(省略形)表記の月の名前Jan~Dec
mmmm英語表記の月の名前January~December
oooo日本語表記の月の名前1月~12月
q1年のうちで何番目の四半期かを表す数値1~4
g年号の頭文字M、T、S、H、R
gg年号の頭文字の漢字1文字明、大、昭、平、令
ggg年号明治、大正、昭和、平成、令和
e年号に基づく和暦1桁の場合、先頭に0は付けない1
ee年号に基づく和暦
1桁の場合、先頭に0を付ける
01
y1年のうちで何日目かを表す数値1~366
yy西暦年の下2桁の数値00~99
yyyy西暦年の4桁の数値100~9999
h時間1桁の場合、先頭に0は付けない0~23
hh時間1桁の場合、先頭に0は付ける00~23
n分1桁の場合、先頭に0は付けない0~59
nn分1桁の場合、先頭に0を付ける00~59
s秒1桁の場合、先頭に0は付けない0~59
ss秒1桁の場合、先頭に0を付ける00~59
ttttth:nn:ss形式の時刻16:33:49
AM/PM時刻が正午以前の場合AM
正午~午後11時59分の場合PM
AM
PM
am/pm時刻が正午以前の場合am
正午~午後11時59分の場合pm
am
pm
A/P時刻が正午以前の場合A
正午~午後11時59分の場合P
A
P
a/p時刻が正午以前の場合a
正午~午後11時59分の場合p
a
p

FirstDayOfWeekの内容

Format(Expression, [Format], [FirstDayOfWeek], [FirstWeekOfYear])

firstdayofweek引数の設定は次のとおりです。

定数説明
vbSunday1日曜日 (既定)
vbMonday2月曜日
vbTuesday3火曜日
vbWednesday4水曜日
vbThursday5木曜日
vbFriday6金曜日
vbSaturday7土曜日

FirstWeekOfYearの内容

Format(Expression, [Format], [FirstDayOfWeek], [FirstWeekOfYear])

FirstWeekOfYear引数の設定は次のとおりです。

定数説明
vbFirstJan111 月 1 日が含まれる週から開始します (既定)。
vbFirstFourDays24 日以上が含まれる最初の週が年の第 1 週目になります。
vbFirstFullWeek31 週間全体が含まれる最初の週がその年の第 1 週目になります。

今回はFormat関数の日付関連の説明について記載させて頂きました。

次回はFormat関数の日付関連の使用例について記載していきます。

少しでも皆様の参考になれば幸いです。

文字列の内容 StrComp関数

StrComp関数は文字列の内容を比較します。

StrCompの構文

StrComp(string1, string2, [ compare ])

StrComp(文字列1, 文字列2, [ 比較方法 ])

[]内は省略可能です。省略した場合はバイナリーモードです。

比較方法はバイナリーモード(vbBinaryCompare)とテキストモード(vbTextCompare)があります。

戻り値の内容

条件戻り値
string1 が string2 より小さい-1
string1 が string2 と等しい0
string1 が string2 より大きい1
string1 または string2 が Null であるNull

文字列の比較方法

バイナリモードの場合は文字コードの番号で比較されます。

テキストモードの場合はひらがなやカタナカや英字の順番で比較されます。

バイナリモードで”a”(10進数で97)と”b”(10進数で98)で比較すると、”a”の方が小さいため-1が返却されます。

同様に”A”(10進数で65)と”a”(10進数で97)を比較すると、”A”が小さいため-1が返却されます。

テキストモードの場合は”A”(10進数で65)と”a”(10進数で97)を比較すると、等しいと認識されて0が返却されます。

StrCompの使用例

string1 が string2 より小さい

string1 が string2 と等しい

string1 が string2 より大きい

string1 または string2 が Null である

・比較方法を指定して実行する

・表から文字列を取得して比較する

の内容で説明をしていきます。

string1 が string2 より小さい

アルファベットで比較

Sub StrComp1()

    MsgBox "aとbを比較 戻り値" & StrComp("a", "b")
    
End Sub

数値で比較

Sub StrComp2()

    MsgBox "1と2を比較 戻り値" & StrComp(1, 2)
    
End Sub

ひらがなで比較

Sub StrComp3()

    MsgBox "あといを比較 戻り値" & StrComp("あ", "い")
    
End Sub

それぞれstring1 < string2 のため戻り値が-1です。

string1 が string2 と等しい

アルファベットで比較

Sub StrComp4()

    MsgBox "abとabを比較 戻り値" & StrComp("ab", "ab")
    
End Sub

数値で比較

Sub StrComp5()

    MsgBox "1と1を比較 戻り値" & StrComp(1, 1)
    
End Sub

ひらがなで比較

Sub StrComp6()

    MsgBox "あとあを比較 戻り値" & StrComp("あ", "あ")
    
End Sub

それぞれstring1 = string2 のため戻り値が0です。

string1 が string2 より大きい

アルファベットで比較

Sub StrComp7()

    MsgBox "bとacを比較 戻り値" & StrComp("b", "ac")
    
End Sub

数値で比較

Sub StrComp8()

    MsgBox "10と1を比較 戻り値" & StrComp(10, 1)
    
End Sub

ひらがなで比較

Sub StrComp9()

    MsgBox "いとあうを比較 戻り値" & StrComp("い", "あう")
    
End Sub

それぞれstring1 > string2 のため戻り値が1です。

string1 または string2 が Null である

Sub StrComp10()

    MsgBox "あとNullを比較 戻り値" & StrComp("あ", Null)
    
End Sub

string2がNullのため戻り値がNullです。

比較方法を指定して実行する

比較方法ですが、大文字小文字全角半角を比較するしないの設定が出来ます。

全角と半角で比較する(vbBinaryCompare)

Sub StrComp11()

    MsgBox "bとbを比較 戻り値" & StrComp("b", "b", vbBinaryCompare)
    
End Sub

全角と半角で比較しない(vbTextCompare)

Sub StrComp12()

    MsgBox "bとbを比較 戻り値" & StrComp("b", "b", vbTextCompare)
    
End Sub

全角と半角を比較していますが戻り値が0です。

大文字と小文字で比較する

Sub StrComp13()

    MsgBox "Bとbを比較 戻り値" & StrComp("B", "b")
    
End Sub

大文字と小文字で比較しない(vbTextCompare)

Sub StrComp14()

    MsgBox "Bとbを比較 戻り値" & StrComp("B", "b", vbTextCompare)
    
End Sub

大文字と小文字で比較していますが戻り値が0です。

表から文字列を取得して比較する

C列とD列の文字列を比較してE列に戻り値を設定します。

Sub StrComp15()
    
    Dim str1, str2 As String
    Dim i As Integer
    i = 2
    
    Do While Cells(i, 3) <> ""
        'セルから文字列を取得
        str1 = Cells(i, 3)
        str2 = Cells(i, 4)
        'セルにStrCompの戻り値を設定
        Cells(i, 5) = StrComp(str1, str2)
        
        i = i + 1
    Loop
        
End Sub

E列に比較した戻り値が設定されました。

今回はStrComp関数について記載させて頂きました。

少しでも皆様の参考になれば幸いです。

文字列の内容 Trim/LTrim/RTrim関数

Trim関数は、文字列の先頭と末尾に空白がある場合は、空白を削除する関数です。

LTrim関数は、文字列の先頭に空白がある場合は、空白を削除する関数です。

RTrim関数は、文字列の末尾に空白がある場合は、空白を削除する関数です。

構文

Trim(string)

Trim(文字列)

LTrim(string)

LTrim(文字列)

RTrim(string)

RTrim(文字列)

Trim/LTrim/RTrim関数の使用例

・半角の空白を文字列の先頭と末尾に設定

・全角の空白を文字列の先頭と末尾に設定

・記号を文字列の先頭と末尾に設定

・文字列に指定した文字列が無い場合

・半角と全角の空白を文字列の先頭と末尾に設定

・セルから文字列を取得してTrimで変換してセルに設定

・繰り返し処理(Trim/LTrim/RTrim関数)

の内容で説明をしていきます。

半角の空白を文字列の先頭と末尾に設定

Sub Trim1()
    
    Dim moji As String
    '文字列の先頭と末尾に空白を2つ設定
    moji = "  abcd  "
    
    MsgBox Trim(moji) & "," & LTrim(moji) & "," & RTrim(moji) & ","
    
End Sub

変数mojiに文字列の先頭と末尾に空白を2つ設定しています。

Trimでは先頭と末尾の空白、LTrimでは先頭の空白、RTrimでは末尾の空白が削除されました。

全角の空白を文字列の先頭と末尾に設定

Sub Trim2()
    
    Dim moji As String
    '文字列の先頭と末尾に全角の空白を2つ設定
    moji = "  abcd  "
    
    MsgBox Trim(moji) & "," & LTrim(moji) & "," & RTrim(moji) & ","
    
End Sub

変数mojiに文字列の先頭と末尾に全角の空白を2つ設定しています。

Trimでは先頭と末尾の全角の空白、LTrimでは先頭の全角の空白、RTrimでは末尾の全角の空白が削除されました。

記号を文字列の先頭と末尾に設定

Sub Trim3()
    
    Dim moji As String
    '文字列の先頭と末尾に空白を2つ設定
    moji = "? abcd /"
    
    MsgBox Trim(moji) & "," & LTrim(moji) & "," & RTrim(moji) & ","
    
End Sub

変数mojiに文字列の先頭に”? “と末尾に” /”の記号と空白を設定しました。

先頭と末尾に空白ではない文字が存在する場合、文字の間に空白がある場合でも空白は削除されません。

文字列に指定した文字列が無い場合

Sub Trim4()
    
    Dim moji As String

    
    MsgBox Trim(moji) & "," & LTrim(moji) & "," & RTrim(moji) & ","
    
End Sub

変数mojiに文字列を設定していません。

変数mojiに何も設定されていないため、Trimの間に設定している”,”しか表示されていません。

半角と全角の空白を文字列の先頭と末尾に設定

Sub Trim5()
    
    Dim moji As String
    '文字列の先頭と末尾に半角と全角の空白を設定
    moji = "  abcd  "
    
    MsgBox Trim(moji) & "," & LTrim(moji) & "," & RTrim(moji) & ","
    
End Sub

変数mojiに文字列の先頭と末尾に半角と全角の空白を設定しています。

Trimでは先頭と末尾の半角と全角の空白、LTrimでは先頭の半角と全角の空白、RTrimでは末尾の半角と全角の空白が削除されました。

セルから文字列を取得してTrimで変換してセルに設定

B2のセルに文字列” あいう “が設定されています。

Sub Trim6()
    
    Dim moji As String
    'セルから文字列を取得
    moji = Cells(2, 2)
    'セルにTrimで変換した値を設定
    Cells(2, 3) = Trim(moji)
    Cells(2, 4) = LTrim(moji)
    Cells(2, 5) = RTrim(moji)
        
End Sub

変換した値を各セルに設定しました。

繰り返し処理(Trim/LTrim/RTrim関数)

B列に文字列を設定します。

Sub Trim7()
    
    Dim moji As String
    Dim i As Integer
    i = 2
    
    Do While Cells(i, 2) <> ""
        'セルから文字列を取得
        moji = Cells(i, 2)
        'セルにTrimで変換した値を設定
        Cells(i, 3) = Trim(moji) & ","
        Cells(i, 4) = LTrim(moji) & ","
        Cells(i, 5) = RTrim(moji) & ","
        
        i = i + 1
    Loop
        
End Sub

C~E列に変換した値に”,”を付けて設定しています。

各列に”,”を付けた状態で文字列が表示されました。

今回はTrim/LTrim/RTrim関数を使用した使用例を複数記載致しました。

皆様の参考になれば幸いです。

文字列の内容 LCase/UCase関数

LCase関数はアルファベットの大文字の文字列を小文字に変換します。

UCase関数はアルファベットの小文字の文字列を大文字に変換します。

データベースに書式を統一して登録したい時などに使用します。

LCase関数の構文

LCase(string)

LCase(文字列)

UCase関数の構文

UCase(string)

UCase(文字列)

LCase/UCase関数の使用例

・アルファベットを設定

・空白を設定

・アルファベットと記号の設定

・セルから文字列を取得して隣のセルに設定

・繰り返し処理(Do While文)

の内容で説明していきます。

アルファベットを設定

Sub LCaseUCase1()

    MsgBox LCase("AbCdE") & vbLf & UCase("AbCdE")

End Sub

L/UCase関数内で”AbCdE”を設定します。

vbLfは改行です。

LCaseですべて小文字に変換されました。

UCaseですべて大文字に変換されました。

空白を設定

Sub LCaseUCase2()

    MsgBox LCase("") & vbLf & UCase("")

End Sub

L/UCase関数内は空白です。

何も表示されません。

アルファベットと記号の設定

Sub LCaseUCase3()

    MsgBox LCase("A|B?c&d") & vbLf & UCase("A|B?c&d")

End Sub

L/UCase関数内で”A|B?c&d”を設定します。

LCaseで記号以外は小文字に変換されました。

UCaseで記号以外は大文字に変換されました。

セルから文字列を取得して隣のセルに設定

セルのB2に”AbCdE”が入力されています。

B2の値をLCaseとUCaseを使用した結果をセルに表示します。

Sub LCaseUCase4()

    Dim moji As String
    
    'セルから文字列を取得
    moji = Cells(2, 2)
    Cells(2, 3) = LCase(moji)
    Cells(2, 4) = UCase(moji)
    
End Sub

小文字と大文字に変換されました。

繰り返し処理(Do While文)

B列に複数の文字列が入力されています。

B列の値をLCaseとUCaseを使用した結果をセルに表示します。

Sub LCaseUCase5()

    Dim moji As String
    Dim i As Integer
    
    i = 0
    'B列が空白でない間繰り返し処理
    Do While Cells(2 + i, 2) <> ""
        moji = Cells(2 + i, 2)
        Cells(2 + i, 3) = LCase(moji)
        Cells(2 + i, 4) = UCase(moji)
        i = i + 1
    Loop
    
End Sub

アルファベットが小文字と大文字に変換されました。

今回はLCase/UCase関数を使用した使用例を複数記載致しました。

皆様の参考になれば幸いです。

文字列の内容 StrConv関数

StrConv関数は文字列を指定された変換方法で文字列を返します。

データベースに入力内容の書式を統一して登録する時などに利用できます。

StrConv関数の構文

StrConv(string, conversion, [ LCID ])

StrConv(文字列, 変換方法, [ロケールID])

[]内は省略可能です。

ロケールIDは言語を表すコードであり、Windowsの地域設定などでも使用されています。

既定値はシステムが使用する LCID です。

コントロール パネル → 時計と地域 → 地域の内容で確認できます。

StrConv関数の使用例

・文字列を大文字に変換します。vbUpperCase

・文字列を小文字に変換します。vbLowerCase

・文字列内のすべての単語の最初の文字を大文字に変換します。vbProperCase

・文字列内の半角文字 (1 バイト) を全角文字 (2 バイト) に変換します。vbWide

・文字列内の全角文字 (2 バイト) を半角文字 (1 バイト) に変換します。vbNarrow

・文字列内のひらがな文字をカタカナ文字に変換します。vbKatakana

・文字列内のカタカナ文字をひらがな文字に変換します。vbHiragana

・変換内容の組み合わせ vbKatakana + vbNarrow

の内容で説明していきます。

文字列を大文字に変換します。vbUpperCase

Sub StrConv1()
    
    MsgBox StrConv("Abc", vbUpperCase)

End Sub

“A”だけ大文字で”bc”は小文字です。

“BC”も大文字になりました。

Sub StrConv2()
    
    MsgBox StrConv("Abc", 1)

End Sub

vbUpperCaseではなく、1で処理を実行することも可能です。

文字列を小文字に変換します。vbLowerCase

Sub StrConv3()
    
    MsgBox StrConv("Abc", vbLowerCase)

End Sub
Sub StrConv4()
    
    MsgBox StrConv("Abc", 2)

End Sub

“A”だけ大文字で”bc”は小文字です。

“A”が小文字の”a”に変換されました。

文字列内のすべての単語の最初の文字を大文字に変換します。vbProperCase

Sub StrConv5()
    
    MsgBox StrConv("abc def/ghi", vbProperCase)

End Sub
Sub StrConv6()
    
    MsgBox StrConv("abc def/ghi", 3)

End Sub

“c”と”d”の間に” “、”f”と”g”の間に”/”を入力しています。

文字列内のすべての単語の最初の文字を大文字にするので”a”と”d”が大文字に変換されました。

文字列内の半角文字 (1 バイト) を全角文字 (2 バイト) に変換します。vbWide*

東アジアのロケールIDに適用されます。

Sub StrConv7()
    
    MsgBox StrConv("a <>/?-~", vbWide)

End Sub
Sub StrConv8()
    
    MsgBox StrConv("a <>/?-~", 4)

End Sub

それぞれの文字と記号を設定しています。

全角文字に変換されました。

文字列内の全角文字 (2 バイト) を半角文字 (1 バイト) に変換します。vbNarrow*

東アジアのロケールIDに適用されます。

Sub StrConv9()
    
    MsgBox StrConv("c、< >・あ", vbNarrow)

End Sub
Sub StrConv10()
    
    MsgBox StrConv("c、< >・あ", 8)

End Sub

それぞれの文字と記号を設定しています。

全角文字が半角文字に変換されました。

“あ”は全角文字ですが半角に変換されません。

文字列内のひらがな文字をカタカナ文字に変換します。vbKatakana

日本にのみ適用されます。

Sub StrConv11()
    
    MsgBox StrConv("あイうエお", vbKatakana)

End Sub
Sub StrConv12()
    
    MsgBox StrConv("あイうエお", 16)

End Sub

“あイうエお”が設定されています。

すべてカタカナに変換されました。

文字列内のカタカナ文字をひらがな文字に変換します。vbHiragana

日本にのみ適用されます。

Sub StrConv13()
    
    MsgBox StrConv("あイうエお", vbHiragana)

End Sub
Sub StrConv14()
    
    MsgBox StrConv("あイうエお", 32)

End Sub

“あイうエお”が設定されています。

すべてひらがなに変換されました。

変換内容の組み合わせ vbKatakana + vbNarrow

Sub StrConv17()
    
    MsgBox StrConv("あいうえお", vbKatakana + vbNarrow)

End Sub
Sub StrConv18()
    
    MsgBox StrConv("あいうえお", 16 + 8)

End Sub

“あいうえお”が設定しています。

カタカナにするのと半角にするのをいっぺんに行います。

半角カタカナに変換されました。

また、vbUnicodeとvbFromUnicodeもあります。

vbUnicode(64)は文字コードをUnicodeに変換します。

vbFromUnicode(128)は文字コードをUnicodeからシステム既定の文字コードに変換します。

今回はStrConv関数を使用した使用例を複数記載致しました。

皆様の参考になれば幸いです。

文字列の内容 CStr関数

CStr関数は、指定した値を文字列に変換します。

数値や日付などを文字列に変換したい場合などに使用します。

CStr関数の構文

CStr(expression)

CStr(文字列に変換したい値)

Cstr関数の使用例

・数値を文字列に変換

・日付を文字列に変換

・時間を文字列に変換

・日付と時間を文字列に変換

・文字列の結合でCStr関数を使用

・セルから値を取得してString型の配列に格納

の内容で説明していきます。

数値を文字列に変換

Sub CStr1()
    
    MsgBox CStr(3)

End Sub

CStrに数値の3を設定しています。

日付を文字列に変換

Sub CStr2()
    
    MsgBox CStr(Date)

End Sub

CStrに本日の日付を設定しています。

Dateは本日の日付を取得します。

時間を文字列に変換

Sub CStr3()
    
    MsgBox CStr(Time())

End Sub

CStrに今の時間を設定しています。

Time()で今の時間を取得します。

日付と時間を文字列に変換

Sub CStr4()
    
    MsgBox CStr(Now())

End Sub

CStrに今の時間と日付を設定しています。

Now()で今の時間を取得します。

文字列の結合でCStr関数を使用

CStr関数が必要になる場合を記載致します。

Sub CStr5()
    
    MsgBox "今は" + Now() + "です"

End Sub

上記のコードを記載するとエラーが発生します。

MsgBoxを呼び出し時にString型以外の足し算はエラーになります。

CStr関数を使用した修正方法

Sub CStr6()
    
    MsgBox "今は" + CStr(Now()) + "です"

End Sub

Now()をCStrに設定しています。

エラーが発生することなく表示されました。

大体の方はCStrで書かず&でコードを書くと思います。

Sub CStr7()
    
    MsgBox "今は" & Now() & "です"

End Sub

セルから値を取得してString型の配列に格納

上記の内容は文字列、日付、数値のデータがあります。

こちらを文字列に変換して配列に格納していきます。

Sub CStr8()

    Dim neko(3) As String
    Dim i As Integer
    
    i = 0
    Do While Cells(2, i + 2) <> ""
        neko(i) = CStr(Cells(2, i + 2))
        i = i + 1
    Loop
    
    Cells(2, i + 2) = Join(neko)

End Sub

2行目のデータを配列に格納します。

格納したデータをF列に表示します。

B~E列の値がF列に表示されました。

配列にString型で格納されています。

CStr関数は、取得する値が不明でもString型に変換する事でデータの確認などを行えます。

今回はCStr関数について記載させて頂きました。

少しでも皆様の参考になれば幸いです。