Word (VBA)

Word VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Home Premium : Word 2010)
テキスト(氏名)一文字ずつの間に全角スペース
投稿日時: 17/10/07 21:28:31
投稿者: ぬけさく

ユーザーフォーム上に、テキストボックスとコマンドボタンを配置しています。
テキストボックスには、人の氏名が入力されます。
そして、コマンドボタンをクリックすることにより、文書内のブックマーク設定箇所に、
テキストボックスに入力されたテキスト(氏名)が挿入されます。
テキストボックスに入力される人の氏名は、姓と名前の間に全角スペースが入っています。
 
その氏名を、文書内のブックマーク箇所に挿入するに当たって、すべての文字と文字の間に全角スペースを入れようとしています。
田中○一郎  → 田○中○一○郎 (○は、全角スペース)
 
そこで、次のマクロを作りました。
 
Private Sub CommandButton1_Click()
 
Dim i As Integer
Dim myTxt As String
Dim myMoji As String
 
myTxt = Me.TextBox1.Text
 
For i = Len(myTxt) To 1 Step -1
 
    myMoji = Mid(myTxt, i, 1)
     
    If myMoji <> " " Then
        myMoji = myMoji & " "
        ThisDocument.Bookmarks("氏名").Range.InsertAfter myMoji
    End If
 
Next i
 
End Sub
 
これで、一応はやりたいことができます。
しかし、どうも、まともな方法ではないような気がします。
テキストの後ろから、一文字ずつを文書に挿入するなど、スマートではないと思うのです。
どのような改良ができるでしょうか。
あるいは、全く別の発想が必要でしょうか。
よろしくお願いします。

投稿日時: 17/10/08 14:40:22
投稿者: ぬけさく

 以下のとおり、改良してみました。
 これでどうでしょう?
 これならば、まぁ許容範囲内ではないかと・・・・・(自己満足?)
 
 
Private Sub CommandButton1_Click()
'文字間にスペースを入れるマクロ
 
Dim i As Integer
Dim mySimei As String, myStr As String
 
mySimei = Me.TextBox1.Text
 
'いったん、全角スペースを削除
mySimei = Replace(mySimei, " ", "")
 
For i = 1 To Len(mySimei)
    myStr = myStr & Mid(mySimei, i, 1) & " "
Next i
  
ThisDocument.Bookmarks("氏名").Range.InsertAfter Trim(myStr)
  
End Sub

回答
投稿日時: 17/10/08 18:08:43
投稿者: んなっと

いいと思いますよ。
 
Midステートメントを使って
 
  myStr = String(2 * Len(mySimei) - 1, " ")
  For i = 1 To Len(mySimei)
    Mid(myStr, 2 * i - 1, 1) = Mid(mySimei, i, 1)
  Next
 
とする方法もあるかもしれませんが、
今回のような少ない文字数では差はないと思います。

投稿日時: 17/10/09 09:56:48
投稿者: ぬけさく

んなっと さん
 
ありがとうございました。
んなっとさんにOKをもらえて、一安心です。
 
「Mid ステートメント」という高度な技のご紹介まで、ありがとうございます。
「文字列変数の文字を他の文字列に置き換える」なんて、知りませんでした。
まだ、完全に理解できているわけではありませんが・・・・。
お礼まで。