- ベストアンサー
英数字は後ろから何文字目まで?
エクセルで、前側は数字、中臍は平仮名と漢字、後側は英数字の文字列が、複数のコラムに沢山存在します。 後側の後側は英数字の文字列は重要なので、赤くしたいのですけれど、後ろからカウントしていって何文字目までが英数字であるかを知りたいのですが、どなたか教えて下さい。お願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
まず、ご質問の趣旨を一貫して頂きたいと思います。 初めのご質問では 1)エクセルで 2)後側は英数字の文字列は重要なので、赤くしたい という事でした。 それで、そういったコードを書きました。 しかし後の補足によりますと a)ワードに応用 b)後側英数字の文字列を抜き出す c)英数字のみではなく「’」アポストロフィもある というように、当初入っていない条件があるようです。 また、私の方にも勘違いがありました。 英数字は半角で入力されている前提でコードを書きました。 以下、全角英数字とアポストロフィを検知し、文字を赤くするコードです。 変数ptは文字列後ろから調べていき、最初に「全角英数字+アポストロフィでない」 文字が出てきた位置を表します。 rStr.Characters(Start:=pt + 1, Length:=Len(rStr.Value) - pt).Font.ColorIndex = 3の文は、ptの右隣の文字から「全文字数-pt」の文字数分を赤くする、という意味です。 文字列を抜き出す方法や、Word VBAへの応用は別質問を立てられた方がよろしいかと 思います。 Sub narrowRed() Const myRange As String = "A1:A10" Dim rStr As Variant Dim pt As Integer For Each rStr In Range(myRange) For pt = Len(rStr.Value) To 1 Step -1 If (Mid(rStr.Value, pt, 1) < "0") Or (Mid(rStr.Value, pt, 1) > "z") Then If Mid(rStr.Value, pt, 1) <> "’" Then rStr.Characters(Start:=pt + 1, Length:=Len(rStr.Value) - pt).Font.ColorIndex = 3 Exit For End If End If If pt = 1 Then rStr.Characters.Font.ColorIndex = 3 Next Next End Sub
その他の回答 (3)
- kigoshi
- ベストアンサー率46% (120/260)
Selection Changeイベント ではなく Worksheet_Changeイベントの方がよろしいと思います。 しかし、とりあえず、この質問を一度締め切られた方がよろしいように思います。 そして、最終的になにを実現したいのか具体的にまとめて別質問をたてられた方がよろしいかと。
補足
大変にありがとうございました。このコードを使わせていただくと共に、このコードをベースにして別のやりたいコードを発展的に考えて見ます。ここで閉じます。
- imogasi
- ベストアンサー率27% (4737/17069)
>重要なので、赤くしたいのですけれど これは (1)手操作 (2)VBA 出しか出来ないと思うが、 VBAの質問ですか。 明確に書いてない。 関数で後から何文字かが割り出せても、文字列の1部の色を関数では 設置できないのだし。 回答のお礼から推定すると、(2)らしいが、質問にははっきり書いておくこと。 関数で後半の英数の部分の桁数割り出しも難しいと思うが。 VBAなら後ろから1文字ずつ判別して行けばしまいでは無いですか。 正規表現的なやり方に拘らなくても。
補足
すみません。手操作ではありません。 質問は、エクセルにおいて、としましたが、ワードでできると助かります。 エクセルのセルに記載した文字列を1文字ずつ判別してカタカタ及び英数字を赤くするコードはすでに使っているのですが、第1の・・という文字列では、前側の1も赤くなってしまいます。 このコードをワードで使おうとしたのですが、使える場合には、やはり、前側の1も赤くなってしまうと思います。 それで、新しいコードを模索しています。 >VBAなら後ろから1文字ずつ判別して行けばしまいでは無いですか。 これは、InStrRev関数で処理できる、ということで良いでしょうか。 文字列関数を調べただけでまだ使ったことがありません。 loopで回すか、Find関数を組み合わせるかといったことも、現段階では目学問の域を出ません。特にわからないのは、InStrRev関数の引数について、(0-9a-zA-Z’)を直接入れられないと思うのですけれど、この処理が分かりません。
- kigoshi
- ベストアンサー率46% (120/260)
ご質問の意味をちゃんと理解していないかも知れませんが、以下の手順をお試し下さい。 1)シートタブを右クリック、「コードの表示」をクリック。 2)画面右側のエディタエリアに下記コードを貼り付け。 3)対象範囲を指定。 コード2行目の Const myRange As String = "A1:C100"←の部分を実際の範囲に 替える(このままではA1セル~C100セルのみを処理します)。 4)[F5]キーを押してマクロを実行。 Sub narrowRed() Const myRange As String = "A1:C100" Dim rStr As Variant Dim pt As Integer For Each rStr In Range(myRange) For pt = Len(rStr.Value) To 1 Step -1 If StrConv(Mid(rStr.Value, pt, 1), vbWide) = Mid(rStr.Value, pt, 1) Then rStr.Characters(Start:=pt + 1, Length:=Len(rStr.Value) - pt).Font.ColorIndex = 3 Exit For End If If pt = 1 Then rStr.Characters.Font.ColorIndex = 3 Next Next End Sub もし期待通りでなかった場合、補足願います。
お礼
ありがとうございました。 追伸: rStr.Characters(Start:=pt + 1, Length:=Len(rStr.Value) - pt).Font.ColorIndex = 3 のところの前側部分の意味が分かりません。 私は、この質問について以下のようなコードになると考えていました。 実際のコードはまだ作れないのですが。 ~~~~~~~ワードに応用した場合~~~~~~~~~~~~~ myText = Selection.Range.Text Trim関数により前側と後側の空白を取り去る Selection.Range.Textの文字数Xをカウントする InStrRev関数により、myTextのうしろ側の英数字よりも1字前の和文字について、前からの位置nを検出する myTextは、 うしろ側が英数字(0-9A-Za-z’)であり、 前側が和文字(あんアン亜)である。 ~~~~~~~~~~~~~~~~~~~~~~~~ 位置nが分かれば、以下の抜き出しができる。 LEFT関数により、myTextについて前からn字までをmyText1として抜き出す。 RIGHT関数により、myTextについてうしろからx-n字までをmyText2として抜き出す。
補足
回答ありがとうございます。 Sheet1のA1:C100に 第1のエンジン装置34c’ 第3のエンジン装置13a 第5のエンジン装置22c 第6のエンジン装置26 第8のエンジン装置2c 第4のエンジン装置5b 第2のエンジン装置4c’ 第1のエンジン装置123a 第12のエンジン装置23 のような文字列で全て埋め尽くして、実行してみましたが何も変化はありませんでした。
お礼
If (Mid(rStr.Value, pt, 1) < "0") Or (Mid(rStr.Value, pt, 1) > "z") Then のコードははじめてみました。 赤くなったのを目視できなかったので(既に赤くなっていた)、 Const myRange As String = "A1:A10"を Const myRange As String = "A1:C100"に変えてみて、実行してみました。見事に、一面が赤くなりました。 ありがとうございました。 派生的な質問なのですけれど、このコードを、Selection Changeイベントにすれば、セルに入力を終えた時点で赤くなるでしょうか。