ワード2002で作成した技術文書について、
(1)(和文字+英数字)の文字列を任意に指定して、
(2)最初に文字数xを求め、
(3)次にInStrRev関数で英数字の1つ前の和文字について、文字列の初めからの数nを求める、
(4)Left関数で和文字を取り出す、(Msgboxに和文字を表示)
(5)Right関数で英数字を取り出す、(Msgboxに英数字を表示)
というマクロを作りたいのですが、
下記のマクロで足りないところを教えてください。
宜しくお願いします。
Private Sub YougoFugouBetunuki ()
Dim myText As String
Dim x As Integer
Dim Yougo As String
Dim Fugou As String
myText = Selection.Range.Text
x = Selection.Characters.Count
Fugou = "0-9A-Za-z’"
n = InStrRev(myText, Fugou)
Yougo = Left(myText, n)
Fugou = Right(myText, x-n)
End Sub
No.1ベストアンサー
- 回答日時:
Option Explicit
'多分やりたいのは文字列探しじゃなく正規表現
'参照設定でMicrosoft VBScript Regular Expressions 5.5を追加しています
Sub Sample1()
Dim RE As RegExp, strPattern As String, rt As String, Matches As Object
Dim index As Long ' Left関数とかRight関数とかFirstIndexプロパティの戻り値の型がわからん。
Dim Yougo As String
Dim Fugo As String
rt = Selection.Range.Text
Set RE = New RegExp
strPattern = "[0-9A-za-z]+"
With RE
.Pattern = strPattern ''検索パターンを設定
.IgnoreCase = True ''大文字と小文字を区別しない
.Global = True
End With
Set Matches = RE.Execute(rt)
index = Matches.Item(Matches.Count - 1).FirstIndex
Yougo = Left(rt, index)
Fugo = Right(rt, Len(rt) - index)
MsgBox (Yougo)
MsgBox (Fugo)
Set Matches = Nothing
Set RE = Nothing
End Sub
この回答への補足
Microsoft VBScript Regular Expressions 5.5を参照設定して実行してみました。
MsgBox (Yougo)
MsgBox (Fugo)
の表示がばっちりでした。
実は、YougoとFugoは、このあとに、
色塗りに使います。
例えば、
Options.DefaultHighlightColorIndex = wdTurquoise
Selection.Range.HighlightColorIndex = wdTurquoise
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Highlight = True
With Selection.Find
.Text = "Yougo"
.Replacement.Text = "Yougo"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
とコードを続けると、水色の蛍光になる部分は、
rtについて行われ、しかも文章中の選択文字列のみでした。
他の、同一の文字列について、
Selection.Find.Execute Replace:=wdReplaceAll
が効きませんでした。
これから考えると、
Yougo = Left(rt, index)
Fugo = Right(rt, Len(rt) - index)
は和文字と英数字を選択文字列から取り出していないようです。
>Yougo = Left(rt, index)
>Fugo = Right(rt, Len(rt) - index)
>は和文字と英数字を選択文字列から取り出していないようです。
と書きましたが、
.Text = "Yougo"
.Replacement.Text = "Yougo"
を
.Text = Left(rt, index)
.Replacement.Text = Right(rt, Len(rt) - index)
に直したら使えました。
ありがとうございました。
No.2
- 回答日時:
Fugou = "0-9A-Za-z’"
は
正規表現の表現でしょう。それではVBSなど使わないとならない。
http://www.geocities.co.jp/SiliconValley-Bay/199 …
など参考
どうして混合してしまったのかな。ワードVBAでは使えないと思う。
ーー
それほど考えなくても下記ではどうかな。満たしてないところあるかな。
エクセルの例でテストしたが
Sub test01()
a = Cells(2, "A")
For i = 1 To Len(a)
If IsNumeric(Mid(a, i, 1)) Then
MsgBox "和字は" & Mid(a, 1, i - 1)
MsgBox "数字は" & Right(a, Len(a) - i + 1)
Exit Sub
End If
Next i
End Sub
で和字と英数字が分かれると思うが。
上記のaは Selection.Range.Textです。
この回答への補足
If IsNumeric(Mid(a, i, 1)) Then
を使いますと、
文字列「第1のセンサ23a」について、
「第」と「1のセンサ23a」とに分かれてしまいました。
この場合は、「第1のセンサ」と「23a」とに分かれるようにしたいのですが。
文字列「センサP23a」について、
「センサP」と「23a」とに分かれてしまいました。
この場合は、「センサ」と「P23a」とに分かれるようにしたいのですが。
IsNumericの代わりに、InStrRevは使えますか?
No.3
- 回答日時:
こんにちは。
いままでの質問は、
(和文字+英数字)
「あいう123a」
#2の補足欄で、
和文字+数個の全数字+和文字1個+(和文字+全英数字+0個か1個の全角または半角不明の'アポストロフィ)
「第1のセンサ23a」
とか、
「第1のあんアん亜龠123a」
という条件で、うまく行かなかったといわれても当然だと思いますし、次に、#1 の補足欄で、色塗りということですか。
質問は似ていても、それでは最初から、やり直しになってしまいます。
そのように連続的に、後出しの条件はダメです。切り分ける内容も最初から正しく公開されていませんから、質問する前によくまとめて、詳しい情報を最初から、分かりやすく書いてください。
特に、色づけするにしても切り分けるにしても、データがどうなっているのか、なるべく元の原稿に近いものを見せないとダメです。曖昧な質問は、曖昧な解答しか出てきません。
全角、半角の問題とか、特に、Word VBAには、行という概念そのものがありません。見えているものにしか、行が存在しません。VBAでの概念は、Paragraph です。だから、見えているものを行と考えてマクロを作ると失敗することがあります。Selection.Text では、単なるベタのテキストというだけで、正規表現で切り分けても、Document から切り離されているので、そのままでは後が続きません。
特に、Wordの色塗りは別問題です。最初から、色を塗るなら塗るというコードにしないとだめです。MsgBox で出したら、その後で別のコードが必要になりますし、ややこしいです。
回答者に、かなりの経験があれば別ですが、Wordマクロは特殊なものですから、あまりうまく行かない場合は、Excelで処理したほうがよいです。Excel VBAユーザーは圧倒的に多いのです。
それと、見ているうちに、補足欄で分かったのは、それは、前回の質問ですよね。(QNo.4112579 ワードの文字列操作のコード(日本文字と英数字を格別に取り出すコード) + QNo.4138489 うしろ側の英数字のみ赤くするにはどうしたら? )
今度は、「水色の蛍光になる部分」ですか?前回は、赤の太字ではなかったでしょうか。前回の質問(QNo.4112579, Q.No.4138489)は、レスが付いていないようですから削除して、それと、なるべく質問は一環してください。見ている人は見ています。連続の質問の後だしはダメです。
最近、私はあまり掲示板に書けませんが、あまりレスが付きにくいようでしたら、小出しに質問を出すようなことをせずに、一旦、ここの掲示を締めたり、削除して、他の掲示板で聞いてみるか、英語のWord VBA の掲示板を探してみるかしてみてください。
なお、IsNumeric を使っていたので、全角・半角の区別はありませんが、正規表現では、かなり違いますから、明確にしてください。Like 演算子には、Compare Text モードがありますが、正規表現では別扱いです。
技術文などでは、英数字は半角に決まっているはずです。今までの流れから、「英数字全角」として扱うことにしました。また、行という概念は考慮していませんので、文字列パターンが同じなら、文中でも、該当するようにしています。
[0-9]+[A-z]+ 半角・全角なら、
[0-90-9]+[A-zA-z]+
となります。
'ThisDocument か、標準モジュールに貼り付け
'Option Explicit
'ここで色を調整
Private Const MYCOLOR As Long = wdColorLightBlue '色-水色
Sub StrFindProc()
'必要なら、参照設定 Microsoft VBScript Regular Expressions(なくてもよい)
Dim objRegExp As Object ''参照設定の場合 objRegExp AsNew RegExp
Dim mySelection As Selection
Dim Matches As Object
Dim Match
Dim strData()
Dim sLength As Long
Dim i As Long
Selection.HomeKey Unit:=wdStory
Selection.EndKey Unit:=wdStory, Extend:=wdExtend
Set mySelection = Selection
Set objRegExp = CreateObject("VBScript.RegExp") '参照設定したら要らない
With objRegExp
.Global = True
.IgnoreCase = True
.Multiline = True
.Pattern = "[\u3041-\u30FE\u4E00-\u9FA5\uff5B-\uff9f]+[0-9]+[A-z]+['’]?"
Set Matches = .Execute(mySelection.Text)
End With
If Matches.Count = 0 Then MsgBox _
"該当する検索文字が見つかりません", 64: Exit Sub
For Each Match In Matches
ReDim Preserve strData(i)
strData(i) = Match.Value
i = i + 1
Next Match
Application.ScreenUpdating = False
For i = 0 To UBound(strData)
WordColorPrc strData(i)
Next
Application.ScreenUpdating = True
Selection.HomeKey Unit:=wdStory
End Sub
Sub WordColorPrc(ByVal myStr As String)
Dim i As Long, e As Long, t As Long
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Highlight = True
With Selection.Find
.Text = myStr
.Replacement.Text = myStr
'.Replacement.Font.Color = MYCOLOR
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = False
.MatchFuzzy = False
End With
Selection.Find.Execute
e = Len(Selection.Text)
For i = e To 1 Step -1
If Mid(Selection.Text, i, 1) Like "[ぁ-龠]" Then
t = i
Exit For
End If
Next i
Selection.Collapse Direction:=wdCollapseEnd
Selection.MoveLeft Unit:=wdCharacter, Count:=e - t
Selection.MoveRight Unit:=wdCharacter, Count:=e - t, Extend:=wdExtend
Selection.Font.Color = MYCOLOR
'Selection.Font.Bold = True '太字
Selection.Collapse Direction:=wdCollapseEnd
t = 0
End Sub
ありがとうございました。ANo.2の回答のコードについて、
strPattern = "[0-9A-Za-z'0-9A-za-z'-]+"、と変更を加え、後は、マクロ記録したコードを繋ぎましたところ、上手く実行できました。実際の技術文書に適用して、色をつけたり消したりして、満足なマクロに仕上がりました。
QNo.4138489 うしろ側の英数字のみ赤くするにはどうしたら?については、エクセルでした。このコードが、今度の質問のケース(ワード)でも使えると思って、この前の1週間、検討していたのですが、私の力では無理でした。それで、今度の質問を出しました。前の質問は、エクセルの一覧表にした文字列の処理に使っています。ですから、今度は、「水色の蛍光になる部分」で、前回は、赤の太字というのは、整合性が取れていなくても、全く違うところで使いますから、良いわけです。
QNo.4112579 ワードの文字列操作のコード(日本文字と英数字を格別に取り出すコード については、今回の質問設定と同じです。今度の質問では、文字列関数の組み合わせを調べたので質問しました。前回の質問でレスが付かないので削除してくださいと言う通知が来まして、削除しようとしましたが、良く分からなかったことと、4週間経つと自動的に削除と言うことが書いてあったので、そのままにしてあります。
なお、技術文などでは、英数字は半角に決まっているはずです。・・・ということですが、特許の技術文書は、英数字も半角厳禁です。全部べたうちです。
.Pattern = "[\u3041-\u30FE\u4E00-\u9FA5\uff5B-\uff9f]+・・・?"
のところは分かりませんが、調べて理解します。
コードが2つのマクロになっていますが、折角示していただきましたので、VBEにコピーして実行してみましたが、できませんでした。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) VBA初心者です 検索した数字の行に色をつける 5 2023/02/13 14:22
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) 以下のVBAで該当文字列の前後に付与したい。 例 前に付与 abc ユーザーID 12345 後に付 3 2022/04/19 21:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メッセージボックスで1025文字...
-
文字の入力で横バー上段、中断...
-
半角英数字のみを受け付ける入...
-
エクセルでの漢字、カタカナ、...
-
全角半角あわせて3文字
-
phpの正規表現でカタカナ+スペ...
-
Excel関数「COUNTIF」で”文字”...
-
CapCutってどうやったら文字を...
-
テキストボックスへの文字の入...
-
全角半角変換 C++/CLI
-
ASP.net(C#) CheckBoxListで...
-
全て全角文字かチェックしたい
-
バッチファイル 全角検索
-
IT企業の技術屋にとって全角英...
-
半角文字と全角文字の判別の仕方
-
携帯電話の相手の電話番号にメ...
-
PHPでMySQLに入力した半角スペ...
-
入力内容の確認を行う前に$_POS...
-
文字列中の両丸括弧を取り除くV...
-
特定の文字を簡単な操作で半角...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字の入力で横バー上段、中断...
-
メッセージボックスで1025文字...
-
Excel関数「COUNTIF」で”文字”...
-
全角括弧と全角読点の間隔を狭...
-
半角記号、全角記号を含む正規...
-
エクセルのCOUNTIFが正しくカウ...
-
XMLのタグ名の禁則文字
-
文字列中の両丸括弧を取り除くV...
-
VBScriptである文字列に半角文...
-
全角英数文字が嫌われる理由を...
-
記号は半角と全角どちらがよい...
-
Excel2002 一桁数字だけ全角に置換
-
エクセルでの漢字、カタカナ、...
-
特定の文字を簡単な操作で半角...
-
Replace関数は文字数の制限ある...
-
VBAで英数字入力チェックしたい。
-
IT企業の技術屋にとって全角英...
-
2つ以上の連続する空白文字を除去
-
全角半角変換 C++/CLI
-
Accessの文字数を調べたい
おすすめ情報