例文を使って繰り返し業務を時短

【マクロ・VBA】列の表示形式を確認する

エクセル、マクロ、VBAで列の表示形式を確認する方法 VBA

表示形式を確認する方法

表示形式を確認するには、NumberFormatとNumberFormatLocalの2つのプロパティを活用します。

NumberFormatとNumberFormatLocalの違い

VBAで表示形式を確認する場合、NumberFormatとNumberFormatLocalの2つのプロパティが使用できますが、両者には以下のような違いがあります。

  • NumberFormatプロパティは、セルに設定された数値フォーマットの書式を返します。例えば、セルが “yyyy/mm/dd” の場合、NumberFormatプロパティは “yyyy/mm/dd” を返します。
  • NumberFormatLocalプロパティは、現在のシステム設定に従って、セルに設定された数値フォーマットのローカル書式を返します。例えば、セルが “yyyy/mm/dd” の場合でも、Windowsのローカル設定が日本語の場合、NumberFormatLocalプロパティは “yyyy年mm月dd日” を返します。

つまり、NumberFormatプロパティは常に英語の書式を返すのに対し、NumberFormatLocalプロパティはシステムのローカル設定に従った書式を返します。そのため、NumberFormatLocalプロパティを使用すると、ユーザーの設定に合わせた表示形式を取得することができます。

  • NumberFormat:Generalが返される
  • NumberFormatLocal:G/標準が返される
    ⇒NumberFormatとNumberFormatLocalは書式の設定方法が異なる

TypeName関数とは

VBAのTypeName関数は、渡されたオブジェクトのデータ型を文字列として返す関数です。

具体的には、以下のように使用します。

Dim var As Variant
var = "Hello"
MsgBox TypeName(var) ' "String" と表示される

この場合、変数varには文字列が代入されています。TypeName関数にvarを渡すと、”String”という文字列が返されます。

TypeName関数は、渡されたオブジェクトのデータ型を判定するために使われます。これにより、変数に格納された値の型に応じた処理を行うことができます。例えば、数値型の変数に対して数値演算を行うか、文字列型の変数に対して文字列処理を行うかを、TypeName関数を使って判断することができます。

TypeName関数の構文

TypeName 関数:指定した変数の型名を返す 
*Variant や Object 型に設定されている型を調べたいときに使用
⇒戻り値:StringやNullなど
⇒配列を指定すると型の後ろに()を付ける 例)Integer()

Range("A1") = TypeName(Range("A1").Value)

解説

  • 引数「値」の型名 (Integer 型なら Integer) を文字列で返す
  • Variant 型や Object 型のときは、それに入っている値の型名を返す
  • 引数「値」が配列なら型名()のように、後ろに()を付けて返す
  • Variant 型や Object 型の配列、その中に配列が入っている時は、Variant()やObject()を返す

NumberFormatLocal_指定列の表示形式の確認

指定列のセルの表示形式を確認するために、VBAのNumberFormatLocalプロパティを使用することができます。以下は、例として列Aのセルの表示形式を確認するコードです。

Sub CheckNumberFormat()
    
    Dim LastRow As Long
    Dim i As Long
    
    ' データがある最終行を取得
    LastRow = Range("A" & Rows.Count).End(xlUp).Row
    
    ' 列Aのセルの表示形式を確認
    For i = 1 To LastRow
        Debug.Print Range("A" & i).NumberFormatLocal
    Next i
    
End Sub

このコードでは、LastRow変数を使用して、列Aにデータがある最終行を取得しています。その後、Forループを使用して、列Aのセルの表示形式を確認し、Debug.Print文を使用して、結果を出力しています。

例えば、セルが日付形式の場合、出力結果は以下のようになります。

yyyy/mm/dd
yyyy/m/d
mm/dd/yyyy
m/d/yyyy
...

同様に、数値形式の場合は以下のようになります。

0
0.0
0.00
#,##0
#,##0.0
#,##0.00
...

このように、NumberFormatLocalプロパティを使用することで、指定列のセルの表示形式を簡単に確認することができます。

別のエクセルマクロ

Sub 指定列の表示形式の確認()

Dim str As String
Dim LastRow1 As Long
Dim i As Long

LastRow1 = Cells(Rows.Count, 1).End(xlUp).Row

For i = 2 To LastRow1
    str = Range("A" & i).NumberFormatLocal
    Range("B" & i) = str
Next

MsgBox "完了"
End Sub

TypeName_該当列の表示形式確認

Sub 該当列の表示形式確認()
Dim i As Long
Dim LastRow1 As Long
LastRow1 = Cells(Rows.Count, 1).End(xlUp).Row

Range("B2").EntireColumn.Insert

For i = 2 To LastRow1
Cells(i, 2).Value = TypeName(Cells(i, 1).Value)
Next

MsgBox "完了"
End Sub

ダイアログを表示して該当列の表示形式確認する方法

このマクロは、ダイアログで選択した列のセルの表示形式を確認するためのものです。

*表対応可能

Sub ダイアログで範囲指定した列の表示形式確認()

'選択セル範囲を受け取る変数を宣言
Dim selectedRange As Range, rng As Range, sng As Range

On Error GoTo myError

'列挿入用_セル選択ダイアログを表示----------------------------------------
Set sng = Application.InputBox("調べる列のセルを選択", Type:=8)

sng.Select
ActiveCell.Offset(0, 1).EntireColumn.Insert
ActiveCell.Offset(0, 1).EntireColumn.Insert
ActiveCell.Offset(0, 1).EntireColumn.Insert
'----------------------------------

'セル選択ダイアログを表示--------------------------
Set selectedRange = Application.InputBox("調べる列のセル範囲を選択してください", Type:=8)

'選択セル範囲に対してループ処理 順番 列→行 左から右へ
For Each rng In selectedRange
    rng.Next.Value = rng.NumberFormatLocal
    rng.Offset(0, 2).Value = rng.NumberFormat
    rng.Offset(0, 3).Value = TypeName(rng)
Next
'----------------------------------

myError:

sng.Select

MsgBox "完了"
End Sub

解説

  • 最初に、セル選択ダイアログを表示し、調べる列のセルを選択します。その列の次に3列挿入され、その後に表示形式が格納されます。
  • 次に、もう一度セル選択ダイアログが表示され、調べる列のセル範囲を選択します。選択された範囲に対してループ処理を行い、それぞれのセルの表示形式を取得して、隣に表示形式を格納するようになっています。
  • 最後に、エラーが発生した場合に、エラーメッセージを表示します。そして、最初に選択した列のセルを選択して、完了のメッセージを表示します。

NumberFormat・NumberFormatLocal_範囲を指定して表示形式確認 *イミディエイトに表記

Sub 範囲を選択して表示形式確認()  

Range("B2").EntireColumn.Insert

Dim r As Range
For Each r In Selection
    Debug.Print r.NumberFormat
    Debug.Print r.NumberFormatLocal
    'Cells(r, 3) = r.NumberFormat
Next

MsgBox "完了"
End Sub

セルの表示形式判定

このマクロは、選択されたセル範囲の表示形式を判定し、条件に応じて色を変えます。

Sub セル範囲の表示形式判定()

Range("A2").CurrentRegion.Select

Dim A As Integer
Dim b As Integer
Dim c As Integer
Dim d As Integer

Dim i As Integer
Dim j As Integer

'範囲指定
A = Selection(1).Row
b = Selection(Selection.Count).Row
c = Selection(1).Column
d = Selection(Selection.Count).Column

Range("A2").CurrentRegion.Select

  For i = A To b
    For j = c To d

    '数式ならば:青色
    If Cells(i, j).HasFormula Then
    Cells(i, j).Interior.Color = 16764006
    
    '未入力ならば:透明
    ElseIf Cells(i, j) = "" Then
    Cells(i, j).Interior.Pattern = xlNone
    
    '数値ならば:桃色
    ElseIf IsNumeric(Cells(i, j)) = True Then
    Cells(i, j).Interior.Color = 16764159
    
    '文字列ならば:緑色
    ElseIf VarType(Cells(i, j)) = vbString Then
    Cells(i, j).Interior.Color = 10092441
    
    End If

    Next j
  Next i
  
MsgBox "完了"
End Sub

解説

  • まず、Range("A2").CurrentRegion.Selectにより、選択されたセル範囲がA2から始まっていることを想定して、選択された範囲を選択します。
  • 次に、Aからbまでの各行、cからdまでの各列についてループを行います。このループを通じて、各セルの表示形式を判定します。
  • ループ内の各Ifステートメントは、セルの内容を検査し、適切な色を割り当てます。
    • Cells(i, j).HasFormulaは、セルに数式がある場合、そのセルを青色にします。
    • Cells(i, j) = ""は、セルが未入力の場合、セルを透明にします。
    • IsNumeric(Cells(i, j)) = Trueは、セルが数値である場合、セルを桃色にします。
    • VarType(Cells(i, j)) = vbStringは、セルが文字列である場合、セルを緑色にします。
  • 最後に、マクロは”完了”というメッセージボックスを表示して終了します。

選択したセルが文字列か文字列でないかをメッセージボックスに表示

これは、ユーザーが選択したセルの中身が文字列であるかどうかを判定し、結果をメッセージボックスで表示するエクセルマクロです。

Sub セルを選択してメッセージボックスに文字列かどうかを判定()
  
'選択セル範囲を受け取る変数を宣言
Dim rng As Range
Set sng = Application.InputBox("調べるセルを選択", Type:=8)
sng.Select
  
  If VarType(ActiveCell.Value) = vbString Then
    MsgBox "文字列"
  Else
    MsgBox "文字列でない"
  End If
 
MsgBox "完了"
End Sub

解説

  • まず、Dim文を使って変数rngを宣言します。この変数は、後で選択されたセル範囲を受け取るために使用します。
  • 次に、InputBox関数を使って、ユーザーにセルを選択するように促します。Type:=8を指定することで、入力ボックスに選択範囲を指定することができるようになります。選択されたセル範囲は、変数sngに代入されます。
  • sng.Selectを使って、選択されたセル範囲をアクティブにし、If文で選択されたセル範囲の中身が文字列であるかどうかを判定します。VarType関数を使って、セルの型を取得し、vbStringと比較することで、文字列であるかどうかを判定します。
  • 最後に、結果をメッセージボックスで表示し、処理が完了したことを示すメッセージボックスを表示します。

コメント

タイトルとURLをコピーしました