みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

特定のセルに文字入力すると左端に「・」を自動表記

エクセル2003を使用しています。

セル”E3~E128”と”I3~I128”の範囲で何か文字を入力すると、入力した文字の左端に自動で「・」を付けるVBAは、どの様にすれば良いのでしょうか。

例としてセルE3に「2015年」と文字を入力すると自動で「・2015年」と表記される感じです。

投稿日時 - 2015-03-30 13:03:33

QNo.8945681

すぐに回答ほしいです

質問者が選んだベストアンサー

 回答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

投稿日時 - 2015-03-31 12:33:32

お礼

この度は素晴らしい回答ありがとうございましたm(__)m
僕の求めるVBAを回答して頂き、非常に助かりました。
機会があればまた宜しくお願いします。

投稿日時 - 2015-04-01 17:28:23

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

こんにちは。お邪魔します。

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

投稿日時 - 2015-03-31 06:29:25

お礼

この度は回答して頂きありがとうございましたm(__)m
VBAを丁寧に解説して頂き、非常に勉強になりました。
また機会があれば宜しくお願いします!!

投稿日時 - 2015-04-01 17:30:46

ANo.2

 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

投稿日時 - 2015-03-30 15:43:19

補足

すいません、一つ抜けていました。
このVBAで該当するセル範囲の文字を空白表示にした場合「・」の表記を無くし、文字を入力すると再び「・」を表記するVBAはどの様になるのでしょうか?

投稿日時 - 2015-03-30 23:27:28

お礼

この度は回答して頂きありがとうございましたm(__)m
凄く応用的なVBAで凄いと思いました!!
また機会があれば宜しくお願いします。

投稿日時 - 2015-04-01 17:29:53

LiberCALC でも、 ・@ で動きました。

投稿日時 - 2015-03-30 13:09:29

お礼

この度は僕の為に時間を割いて頂き回答して下さりありがとうございました。

投稿日時 - 2015-04-01 17:29:05

あなたにオススメの質問