プロが教えるわが家の防犯対策術!

おはようございます。よろしくお願いします
いつもgooの皆さんに大変お世話になっています
エクセルは2013です

VBAでセルの右端一文字を置換するにはマクロをどう書けばよいでしょうか
日本語では次のようになります

もしも、セルA1の右端1文字がYならNに置換する、YでなければYに置換する
例として、A1が 左上_Y だったら 左上_N にしたいです
A1が 左上_N だったら 左上_Y にしたいです

質問者からの補足コメント

  • めぐみん_さん、こんにちは
    私の質問の仕方がまずかったです
    お詫びします

    セルA1は単純にRange("A1")です
    対象のセルはRange("A1")だけです
    お詫びします

    No.2の回答に寄せられた補足コメントです。 補足日時:2018/01/17 10:29

A 回答 (6件)

こんにちは!



右端一文字限定ですね?
一例です。

Sub Sample1()
Dim i As Long, myStr As String
For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row
If Right(Cells(i, "A"), 1) = "Y" Then
myStr = Left(Cells(i, "A"), Len(Cells(i, "A")) - 1) & "N"
Else
myStr = Left(Cells(i, "A"), Len(Cells(i, "A")) - 1) & "Y"
End If
Cells(i, "A") = myStr
myStr = ""
Next i
End Sub

※ 大文字・小文字の区別はしていません。

こんな感じではどうでしょうか?m(_ _)m
    • good
    • 1
この回答へのお礼

tom04さん、こんにちは
いつもいつも大変お世話になっております
今のマクロに組み込むのに手間取りましたが、お陰様でうまくできました

Right やLeftはわかっているのですが
Left(Cells(i, "A"), Len(Cells(i, "A")) - 1) & "N"
が全く想像できませんでした

ありがとうございます
お蔭様で、18個の同じ処理を一つにまとめることができました

お礼日時:2018/01/17 10:08

一例です。


もしかすると面倒なコードです。

Sub try()
Dim myReg As Object
Dim r As Range

Set myReg = CreateObject("VBScript.RegExp")
myReg.Pattern = "^(.+)(.)$"

For Each r In Range("A1", Cells(Rows.Count, 1).End(xlUp)) 'A列の値について

If myReg.Execute(r.Value)(0).Submatches(1) = "Y" Then
r.Value = myReg.Replace(r.Value, "$1N")
Else
r.Value = myReg.Replace(r.Value, "$1Y")
End If

Next

Set myReg = Nothing
End Sub
この回答への補足あり
    • good
    • 0

No.2の補足に対して



Sub try_2()
Dim myReg As Object

Set myReg = CreateObject("VBScript.RegExp")
myReg.Pattern = "^(.+)(.)$"

With Range("A1")

If myReg.Execute(.Value)(0).Submatches(1) = "Y" Then
.Value = myReg.Replace(.Value, "$1N")
Else
.Value = myReg.Replace(.Value, "$1Y")
End If

End With

Set myReg = Nothing
End Sub

ですかね。
    • good
    • 0
この回答へのお礼

めぐみん_さん、私の不手際で何度もお世話になっています
お陰様で、教えていただいたマクロで見事に目的を達成できました
ありがとうございました

宣言の後に下記のマクロで書きました
Dim myreg As Object
Set myreg = CreateObject("VBScript.RegExp")
myreg.Pattern = "^(.+)(.)$"

Select Case myreg.Execute(Target.Value)(0).Submatches(1)
   Case "Y"
      Target.Value = myreg.Replace(Target.Value, "$1N")
   Case Else
      Target.Value = myreg.Replace(Target.Value, "$1Y")
End Select
Set myreg = Nothing

教えていただいたことは後で調べて、マクロにコメント分が書けるようにします
ありがとうございました
何度もお世話になりました

お礼日時:2018/01/17 11:24

こんにちは。



Mid ステートメントを使えばよいと思います。
今回は、A1だけにします。

'//
Sub ReplaceLastChar()
 Dim mTxt As String
 If Range("A1").Value <> "" Then
  mTxt = Range("A1").Value
  If mTxt Like "*Y" Then
   Mid(mTxt, Len(mTxt), 1) = "N"
  ElseIf mTxt Like "*N" Then
   Mid(mTxt, Len(mTxt), 1) = "Y"
  End If
  Range("A1").Value = mTxt
 End If
End Sub
    • good
    • 0
この回答へのお礼

WindFallerさん、こんにちは

外付けアンプの電源確認マクロでは大変お世話になりました
お陰様で電源入れ忘れに対応できて、マクロがエラーで止まるようなことが
なくなりました
ありがとうございました

LikeもLenも一応知ってはいるのですが、Midを使ってマクロが書けませんでした
お陰様で狙った動きができています
ありがとうございました

お礼日時:2018/01/17 12:31

こんな感じのではいかがですか?


--------------------------------------------------------------------------------
Sub 後文字変換()
With Range("A1")
If .Value <> "" Then
If Right(.Value, 1) = "Y" Then
.Value = Left(.Value, Len(.Value) - 1) & "N"
Else
.Value = Left(.Value, Len(.Value) - 1) & "Y"
End If
End If
End With
End Sub
--------------------------------------------------------------------------------
    • good
    • 0
この回答へのお礼

GooUserラックさん、こんにちは
いつも大変お世話になっております

該当セルをTarget.valueとして簡単に組み込めました
Left(.Value, Len(.Value) - 1) は教えていただくと簡単ですが
ぜんぜん思い付きませんでした

今回教えていただいたので、これからは応用できると思います
ありがとうございました

お礼日時:2018/01/17 12:44

No.4 の WindFallerさんへ



今回のような場合は「Like」は使わない方が良いですよ。
たとえば A1 セルに「ABC*Y*A」のような文字が入っていた場合誤動作してしまいます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!