表示形式が変更されない理由とは
セルの値が数値形式になっている
セルに値が入っており、その値が数値形式になっている場合、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を使用してエラーの詳細情報を表示するようにしました。
コメント