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

【マクロ・VBA】表示形式が変更されない場合の対処_繰り返し

エクセル、マクロ、VBAで表示形式が変更されない場合の対処方法 VBA

表示形式が変更されない理由とは

セルの値が数値形式になっている
セルに値が入っており、その値が数値形式になっている場合、VBAで文字列形式に変更しても、値の形式は変わりません。この場合、値を一旦文字列形式に変更した上で、セルの表示形式を設定する必要があります。

Sub 表示形式変更()
    Dim val As String
    val = Range("A1").Value ' セルの値を取得
    Range("A1").Value = CStr(val) ' 値を文字列形式に変換してセット
    Range("A1").NumberFormat = "@" ' 表示形式を設定
End Sub

システムのロケール設定によって表示形式が変わる

システムのロケール設定によって、セルの表示形式が変わることがあります。例えば、日付形式の場合、日本語版のWindowsでは「2022/01/01」、英語版のWindowsでは「01/01/2022」となります。

この場合、VBAで表示形式を設定しても、システムのロケール設定によって表示形式が変わってしまうため、意図した表示形式にならない場合があります。この場合、システムのロケール設定を変更するか、VBAで特定の表示形式を指定する必要があります。

以下は、特定の日付表示形式を指定する例です。

Sub 日付表示形式変更()
    Range("A1").Value = "2022/01/01" ' 日付をセット
    Range("A1").NumberFormat = "yyyy/mm/dd" ' 表示形式を設定
End Sub

表示形式が変更されない場合の対処

セルオブジェクトのValueプロパティを使用するコード例です。

このコードは、選択したセルの値を一時変数に格納してから、値を書き換えるためにセルのValueプロパティを直接操作します。

Part1

Sub 表示形式が変更されない場合の処理_F2_確定()

   Dim Last As Long
   Dim i As Long
   Dim tmp As Variant
   
   On Error GoTo ErrorHandler
   
   Last = Selection.Count

   For i = 1 To Last
       Selection(i).Activate
       
       tmp = Selection(i).Value
       Selection(i).Value = tmp
       
       DoEvents
   Next i
   
   MsgBox "完了"
   
   Exit Sub

ErrorHandler:
   MsgBox "エラーが発生しました:" & Err.Description, vbCritical
End Sub

このコードでは、値を変更するために、値を一時変数に格納し、セルのValueプロパティを使用して値を書き換えます。これにより、SendKeys関数の代わりに安全な方法でセルの値を直接操作することができます。

Part2

このVBAコードは、選択したセル範囲内の値を更新して、表示形式が変更されない場合の問題を解決するためのものです。

Sub 表示形式が変更されない場合の対処()

    Set selectedRange = Application.InputBox("セル範囲を選択", Type:=8)

    For Each e In Selection
        e.Value = e.Value
        DoEvents
    Next

MsgBox "完了"
End Sub

1行目: マクロの名前を定義しています。この場合、”表示形式が変更されない場合の対処()”という名前になっています。

3行目: Set文を使用して、選択した範囲を変数selectedRangeに格納します。Application.InputBox関数を使用して、ユーザーにセル範囲の選択を促します。Type:=8を指定することで、セル範囲の選択を要求するダイアログボックスが表示されます。

5行目: For Each文を使用して、選択範囲内の各セルに対して処理を行います。

6行目: セルの値を自分自身に代入することで、表示形式が変更されない場合でも、値を更新することができます。これは、VBAコードでセルのフォーマットを強制的に更新する方法の1つです。

7行目: DoEvents関数を使用して、処理の進捗状況を表示します。DoEvents関数は、プログラムが処理を中断し、他のアプリケーションが実行されるため、メッセージボックスの表示やExcelの画面更新などが行われます。

9行目: 処理が完了したことを示すメッセージボックスを表示します。

このコードは、VBAにおいてよく使われる技術であるセルの値を自分自身に代入することで、表示形式が変更されない場合でも、値を更新する方法を使用しています。また、DoEvents関数を使用することで、処理の進捗状況を示すメッセージボックスが表示されます。

表示形式が変更されない場合の対処 :F2とEnter のタップ

このコードは、選択したセルに対してF2を押してセルを編集モードにし、Enterを押して編集を確定するという処理を行います。これは、複数のセルに同じ処理を行いたい場合に有用です。

ただし、このコードにはいくつかの注意点があります。まず、SendKeys関数は、ユーザーのキーボード入力を模倣するため、マクロ実行中に他のアプリケーションの操作を誤ってトリガーする可能性があります。また、DoEvents関数は、マクロの実行を一時停止して、Windowsが処理するメッセージを処理するために使用されますが、過剰に使用するとパフォーマンスが低下する可能性があります。

したがって、このコードを使用する場合は、注意して使用し、必要に応じてエラー処理を追加してください。また、可能であれば、SendKeys関数の代わりにセルオブジェクトのValueプロパティを直接操作する方法を検討することをお勧めします。

Sub 表示形式が変更されない場合の処理_F2_確定()

   Dim Last As Long
   Dim i As Long

   On Error GoTo ErrorHandler
   
   Last = Selection.Count

   For i = 1 To Last
       Selection(i).Activate
       
       SendKeys "{F2}", True
       SendKeys "{ENTER}", True
       
       DoEvents
   Next i
   
   MsgBox "完了"
   
   Exit Sub

ErrorHandler:
   MsgBox "エラーが発生しました:" & Err.Description, vbCritical
End Sub

エラー処理を追加することで、実行中にエラーが発生しても、エラーメッセージを表示して処理を中断することができます。また、エラーメッセージには、Err.Descriptionを使用してエラーの詳細情報を表示するようにしました。

コメント

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