三流君 ken3のmemo置き場

三流プログラマーのメモ書きです。主にVBAやWindowsの話題が多いです

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。

よく検索されるキーワード: [質問回答XXXXさんへ] [CreateObject] [VBA] [JRA競馬オッズ]

VBA Wordマクロ 文字単位で処理 Word.Document.Characters 例題:丸数字の振り直し

知恵袋の質問
detail.chiebukuro.yahoo.co.jp

>ワード文書内に①①②③③・・・がある場合に、
>これらを①②③④⑤・・・というふうに重複したものを順番に置き換える
>マクロを考えております。
>(①②③・・・は行頭にあるとは限らないので、ワード本来の機能(段落?)
>では難しいかなと考えています。)

にチャレンジしてみました

Word.Document.Characters

マクロのデバッグ 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
↑も、お時間のある時に見て笑ってください。

Ken3 ホームページ 目次

分類:HPを大きく分けると4つの柱(分類)です。

  1. [VBA・マクロ プログラミング]の解説
    当店の人気はVBA系のCreateObject("XXXXXX.application")で他のアプリケーションを操作するサンプルが人気です
  2. [プログラマーの愚痴]では、あまり見せたくない三流プログラマーの内面かな。
    三流君を踏み台にする
  3. [古いクラシック ASP(Active Server Pages)]の解説。
  4. [元コンビニ店長時代の話]が弟に巻き込まれ、失敗した脱サラ、畑違い?の仕事で失敗。
主に上記4つの分類でHP作成やメルマガの発行を行ってます。
※更新頻度が落ちていて情報の鮮度が悪いです。



本当に三流なんです(笑):たまにスゴイですねなんて言われることもありますが、
真実は→ [三流君の真実は...] ←を初めに見てくださるとわかると思います。
(からくりは、成功例↑しか載せてなくて ヒドイ失敗例はお蔵入り迷宮入りが多かったりします)