- ベストアンサー
特定のセルに文字入力すると左端に「・」を自動表記
エクセル2003を使用しています。 セル”E3~E128”と”I3~I128”の範囲で何か文字を入力すると、入力した文字の左端に自動で「・」を付けるVBAは、どの様にすれば良いのでしょうか。 例としてセルE3に「2015年」と文字を入力すると自動で「・2015年」と表記される感じです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
回答No.2です。 前回の回答で提示させて頂いたVBAマクロには、範囲コピー&貼り付けを行う事で値を変更する事に対応していないという短所が存在していましたので改良致しました。 尚、こちらのVBAでは >このVBAで該当するセル範囲の文字を空白表示にした場合「・」の表記を無くし、文字を入力すると再び「・」を表記するVBAはどの様になるのでしょうか? という点にも対応しております。 Private Sub Worksheet_Change(ByVal Target As Range) 'QNo.8945681特定のセルに文字入力すると左端に「・」を自動表記 If Intersect(Target, Range("E3:E128")) Is Nothing And Intersect(Target, Range("I3:I128")) Is Nothing Then GoTo label0 Application.EnableEvents = False Dim TargetFC, TargetLC, ColumnNo As String Dim TargetFR, TargetLR, RangeFR, RangeLR As Long Dim MyRange, r As Range TargetFC = Target.Column TargetLC = Target.Column + Target.Columns.Count - 1 TargetFR = Target.Row TargetLR = Target.Row + Target.Rows.Count - 1 If TargetFR <= 128 And TargetLR >= 3 Then RangeFR = 3 If TargetLR > 3 Then RangeFR = TargetFR RangeLR = 128 If TargetLR < 128 Then RangeLR = TargetLR ColumnNo = "E" GoSub label9: ColumnNo = "I" GoSub label9: End If Application.EnableEvents = True GoTo label0 label9: Set MyRange = Range(ColumnNo & RangeFR & ":" & ColumnNo & RangeLR) If TargetFC <= MyRange.Column And TargetLC >= MyRange.Column Then For Each r In MyRange If r.Value <> "" And Left(r.Value, 1) <> "・" Then r.Value = "・" & r.Value Next r End If Return label0: End Sub
その他の回答 (3)
- real beatin(@realbeatin)
- ベストアンサー率82% (174/211)
こんにちは。お邪魔します。 Excelのセルについては常に 「値」と「表示文字列」、2つのことを考えないといけません。 「値」にも様々種類があって、 「文字列値」や「日付値」「時刻値」、その他、 これらの「値」とセルに設定されている[表示形式]と相まって 「表示文字列」が確定します。 例えば、 "2015年"という文字列を入力して確定した場合は、 これは日付としては無効なデータである為、文字列値だと判断され、 [表示形式]は[標準]のまま文字列値として、左詰めで表示されます。 例えば、 "2015年3月"や"2015年3月31日"という文字列を入力して確定した場合は、 これは日付として有効なデータである為、日付値だと判断され、 [表示形式]は入力した文字列を参照した上で[日付]や日付を表す[ユーザー定義] に自動的に変換され、文字列値ではないので右詰めで表示されます。 少しハッキリしないのは、 1・E3:E128,I3:I128の範囲に入力するのは、文字列値なのか日付時刻値なのか? 2・「左端に自動で「・」を付ける」のは 「値」を変えたいのか「表示文字列」([表示形式])を変えたいのか? 3・そもそものE3:E128,I3:I128の範囲の[表示形式]は何("標準"or?)なのか? という点です。 察するに、 「値」を変える事なく、 [表示形式]のみの操作で「表示文字列」の「左端に自動で「・」を付ける」 ということをなさりたいのかと。 1・→数値以外、文字列値や日付・時刻値。 2・→「表示文字列」の「左端に自動で「・」を付ける」 3・→[表示形式]は"標準" という条件で書いてみました。 もしも、こちらの理解と、そちらの求めるものに相違がある場合は、 是非、補足欄に具体的な説明を書いてみて下さい。 /// 仕様 /// /// 一度値を確定すると、その際に決定する[表示形式]が固定されるので、 再度入力をした際にも踏襲されます。 再度入力をする時、他の[表示形式]に振り替えたい場合には、 一旦、セルを消去してから入力確定し直すような仕様になります。 既存のデータを上書きする場合も一度セルを消去してから入力確定 すれば、正しく機能するようになります。 /// コピペなどで、複数セル範囲の値を同時に変更した場合にも機能します。 /// 結合セルにも対応します。 以下、シートモジュール Private Sub Worksheet_Change(ByVal Target As Range) ' w8945681 Dim rTgt As Range, c As Range, v Set rTgt = Intersect(Target, Range("E3:E128,I3:I128")) ' セル範囲 要指定 If rTgt Is Nothing Then Exit Sub For Each c In rTgt With c(1) v = .Value If .Row = c.MergeArea(1).Row And c.Column = c.MergeArea(1).Column Then Select Case VarType(v) ' ' 値が消去された時、表示形式を基本設定に戻す Case vbEmpty c.NumberFormatLocal = "G/標準" ' 表示形式基本設定 要指定 ' ' 文字列値が入力された時、表示形式を "・"&文字列 に指定 Case vbString c.NumberFormatLocal = "・@" ' ' 論理値が入力された時、表示形式を "・"&論理値 に指定 ' Case vbBoolean ' c.NumberFormatLocal = """・TRUE"";;""・FALSE""" Case Else ' ' 日付・時刻値が入力された時、表示形式を "・"&日付・時刻値 に指定 If Me.Evaluate("CELL(""format""," & c.Address & ")") Like "D#" Then c.NumberFormatLocal = "・" & c.NumberFormatLocal End If End Select End If End With Next End Sub
お礼
この度は回答して頂きありがとうございましたm(__)m VBAを丁寧に解説して頂き、非常に勉強になりました。 また機会があれば宜しくお願いします!!
- kagakusuki
- ベストアンサー率51% (2610/5101)
VBAはVBAでも、標準モジュールに書き込む一般的なVBAではなく、ワークシートのイベントの方に書き込むChangeプロシージャを使います。 まず、[開発]タブの「コード」グループの中にある[Visual Basic]ボタンをクリックして、VBEのプロジェクト ウィンドウを開いて下さい。 そして、ウィンドウの左側にある「プロジェクト-VBEProject」に並んでいるシートの中から、御質問の処理を行うマクロを設定したいシートをダブルクリックして下さい。 その上で、ウィンドウの右側にあるVBAの構文を書き込むための欄に、以下のVBAを書き込んで下さい。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("E3:E128")) Is Nothing And Intersect(Target, Range("I3:I128")) Is Nothing Then Exit Sub Application.EnableEvents = False Target.Value = "・" & Target.Value Application.EnableEvents = True End Sub 【参考URL】 よねさんのWordとExcelの小部屋 > Excel(エクセル) VBA入門 > ワークシートのイベント > Change http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html#change
お礼
この度は回答して頂きありがとうございましたm(__)m 凄く応用的なVBAで凄いと思いました!! また機会があれば宜しくお願いします。
補足
すいません、一つ抜けていました。 このVBAで該当するセル範囲の文字を空白表示にした場合「・」の表記を無くし、文字を入力すると再び「・」を表記するVBAはどの様になるのでしょうか?
LiberCALC でも、 ・@ で動きました。
お礼
この度は僕の為に時間を割いて頂き回答して下さりありがとうございました。
お礼
この度は素晴らしい回答ありがとうございましたm(__)m 僕の求めるVBAを回答して頂き、非常に助かりました。 機会があればまた宜しくお願いします。