知恵袋の質問
detail.chiebukuro.yahoo.co.jp
>ワード文書内に①①②③③・・・がある場合に、
>これらを①②③④⑤・・・というふうに重複したものを順番に置き換える
>マクロを考えております。
>(①②③・・・は行頭にあるとは限らないので、ワード本来の機能(段落?)
>では難しいかなと考えています。)
にチャレンジしてみました
マクロのデバッグ Word文章で.Characters.Countを使うと文字数がわかるので
あとは、ループでCharacters(n)で一文字取り出し、処理を行ってみました。
For n = 1 To oDOC.Characters.Count
strCHAR = oDOC.Characters(n) 'n文字目を取得 .Item(n)どちらでも好きな方で
Debug.Print n & "文字目:" & strCHAR & " 文字コード:" & Hex(Asc(strCHAR))
If n = 50 Then Exit For 'テストなので50文字で抜ける
Next n
など。
youtu.be
https://youtu.be/SE2b2pB8ZWU
目次
00:00 あいさつ・やりたいこと
01:30 単体 Document Characters のテスト
05:21 取得とセット 複数セットの不思議?
07:16 Asc関数とChr関数を使い文字の計算
11:36 回答:丸数字を連番でふり直す
16:14 総合テスト
18:00 不具合のテスト
21:53 再度VBAコードの説明を行う
#WordVBA #マクロ #デバッグ
#Document #Characters #Asc関数 #Chr関数
問題点・不具合
1.20を超えた丸数字
2.ワードの機能で丸数字を段落で使用、混ざったとき
18:00 不具合のテスト
>(①②③・・・は行頭にあるとは限らないので、
>ワード本来の機能(段落?)では難しいかなと考えています。)
マクロのループでワード本来の機能(段落?)
が、私の作成した単純ループでは取得できなかったので
文章に混ざっていると、バグります。
連番処理のヒントとなれば幸いです。
Wordのマクロで文章を一文字単位で処理してみました。
下記のソースコードが参考となれば幸いです。
Option Explicit 'ワード文書内に①①②③③・・・がある場合に、 'これらを①②③④⑤・・・というふうに Sub 知恵袋の回答丸数字を1から振る() '処理する文章、ドキュメント Dim oDOC As Word.Document '変数に入れなくてもいいんだけど、気分で Set oDOC = Application.ActiveDocument 'アクティブな文書に対して処理する '丸数字のカウンター 0から、①+cntで使う Dim cntMARU As Integer cntMARU = 0 Dim n As Long 'n文字目のカウンター Dim ascCODE As Long '1文字の文字コード For n = 1 To oDOC.Characters.Count ascCODE = Asc(oDOC.Characters(n)) 'n文字目を取得して文字コードにする '①~⑳の判断 If Asc("①") <= ascCODE And ascCODE <= Asc("⑳") Then 'データを①からの連番丸数字①②③④⑤・・・に置き換える oDOC.Characters(n) = Chr(Asc("①") + cntMARU) '①+cntで連番にする cntMARU = cntMARU + 1 '次の丸数字へ(↑の文字コードの計算に使用) End If '↑これだと、20を超えたとき、チェック無しでマズいんだけど... Next n MsgBox "処理終了、確認してください" End Sub
単体テスト 1.丸数字のコードを足し算、計算する
07:16 Asc関数とChr関数を使い文字の計算
丸数字①を攻略したかったので、
Dim ascMARU1 As Long '文字コード Dim strMOJI As String '1文字入れる(文字列型だけどね) '基準を①にする ascMARU1 = Asc("①") 'Ascで文字コードに変換 '①からどれだけ離れたコードか?チェックする For n = 0 To 20 'ループで0~20(21個) strMOJI = Chr(ascMARU1 + n) '①+n Debug.Print n, strMOJI Next
コードの足し算、計算で求めるときに使ってみてください
Asc(文字)で文字をコードに
Chr(数値)で文字コードを文字に
単体テスト 2.Word文章を一文字単位で取り出す
01:30 単体 Document Characters のテスト
05:21 取得とセット 複数セットの不思議?
Characters.Count で 文字数
Characters(n) や Characters.Item(n) で取り出す
もちろん、逆のセットも可能
Application.ActiveDocument.Characters(10) = "1"
不思議だったのが、間違って
Application.ActiveDocument.Characters(10) = "1234"
など、複数文字を指定すると?
テスト文章 1.単純に貼り付けて、テストする
カップラーメンの作り方:①ふたを開ける
②粉末スープを取り出す、粉末スープを入れる※後入れに注意
③お湯を入れる
④よくかき混ぜる
18:00 ~ 不具合のテスト
テスト文章 2.箇条書き、番号管理をWordでやっていると、バグ・不具合の説明
質問文にあった
>(①②③・・・は行頭にあるとは限らないので、
>ワード本来の機能(段落?)では難しいかなと考えています。)
カップ焼きそば Wordの機能で①を振る
ふたを開ける
ソースを取り出す ※ここに、あとで、フリカケ・青のりを取り出すを追加するTEST
お湯を入れる 三分待つ
お湯を捨てる
ソースを入れ よくかき混ぜる
↑焼きそばのソースとVBAソースコードのおっさんギャグを動画に入れるの忘れた・・。。
あと、からまったスパゲッティ的なコードの話も動画に入れ忘れた。
落ち着いて動画作らないとなぁ・・・
下記、VBAソースコードです。よくかき混ぜて処理してください。
Option Explicit Sub Word文章から一文字単位で取り出す() Dim oDOC As Word.Document Set oDOC = Application.ActiveDocument Dim n As Long 'n文字目のカウンター Dim strCHAR As String '一文字だけど文字列型で受け取る Debug.Print ".Characters.Count=" & oDOC.Characters.Count For n = 1 To oDOC.Characters.Count strCHAR = oDOC.Characters(n) 'n文字目を取得 .Item(n)どちらでも好きな方で Debug.Print n & "文字目:" & strCHAR & " 文字コード:" & Hex(Asc(strCHAR)) If n = 50 Then Exit For 'テストなので50文字で抜ける Next n End Sub
Option Explicit 'ワード文書内に①①②③③・・・がある場合に、 'これらを①②③④⑤・・・というふうに Sub 知恵袋の回答丸数字を1から振る() '処理する文章、ドキュメント Dim oDOC As Word.Document '変数に入れなくてもいいんだけど、気分で Set oDOC = Application.ActiveDocument 'アクティブな文書に対して処理する '丸数字のカウンター 0から、①+cntで使う Dim cntMARU As Integer cntMARU = 0 Dim n As Long 'n文字目のカウンター Dim ascCODE As Long '1文字の文字コード For n = 1 To oDOC.Characters.Count ascCODE = Asc(oDOC.Characters(n)) 'n文字目を取得して文字コードにする '①~⑳の判断 If Asc("①") <= ascCODE And ascCODE <= Asc("⑳") Then 'データを①からの連番丸数字①②③④⑤・・・に置き換える oDOC.Characters(n) = Chr(Asc("①") + cntMARU) '①+cntで連番にする cntMARU = cntMARU + 1 '次の丸数字へ(↑の文字コードの計算に使用) End If '↑これだと、20を超えたとき、チェック無しでマズいんだけど... Next n MsgBox "処理終了、確認してください" End Sub
Option Explicit Sub test丸数字() Dim ascMARU1 As Long '文字コード ascMARU1 = Asc("①") 'Ascで文字コードに変換 Debug.Print ascMARU1, "16進数Hex", Hex(ascMARU1) Debug.Print Chr(ascMARU1) '文字コードに対応する文字を表示 End Sub Sub test丸数字_文字コードの足し算() Dim n As Long 'カウンター Dim ascMARU1 As Long '文字コード Dim strMOJI As String '1文字入れる(文字列型だけどね) '基準を①にする ascMARU1 = Asc("①") 'Ascで文字コードに変換 '①からどれだけ離れたコードか?チェックする For n = 0 To 20 'ループで0~20(21個) strMOJI = Chr(ascMARU1 + n) '①+n Debug.Print n, strMOJI Next End Sub
Word VBA 動画 再生リスト
https://www.youtube.com/playlist?list=PL8vZhsyiiFhu6QVh2ABnZVGfSqJBGkWEO
↑も、お時間のある時に見て笑ってください。