2017-05-17 4 views
2

[30] [31] [32] ... [31] [32] [33]などのシリアル番号を置き換えるときに問題があります。私は記事の真ん中に新しい参照を挿入するとMSの言葉で。 GUIで解決方法を見つけられなかったので、VBAを使用してその置換を実行しようとしました。私は、スタックオーバーフローで同様の問題を見つける:それは他の場所でいくつかの置換配列を生成する必要があるため括弧内の数字をMS Wordの計算で置き換える方法

MS Word Macro to increment all numbers in word document

しかし、この方法は少し不便です。私はregexとMS Word VBAのコードのようないくつかの機能を以下のように置き換えることができますか?

Sub replaceWithregExp() 

Dim regExp As Object 
Dim regx, S$, Strnew$ 
Set regExp = CreateObject("vbscript.regexp") 
With regExp 
    .Pattern = "\[([0-9]{2})\]" 
    .Global = True 
End With 
'How to do some calculations with $1? 
Selection.Text = regExp.Replace(Selection.Text, "[$1]") 
End Sub 

しかし、regExpで$ 1で計算する方法がわかりません。 "[$ 1 + 1]"を試してみましたが、[31 + 1] [32 + 1] [33 + 1]を返します。誰も助けることができますか?ありがとう!

+0

おそらくこれは明らかですが、わかりません。なぜ、通常の検索と置換を使用しないのですか?最も高い数字から始め、あなたの方法をダウンしてください。 – Andreas

+0

@アンドレアス私は、この種の問題を解決するためのより便利な方法を見つけたいと思うし、次に私は何度も何度も検索して置き換える必要はなく、いくつかのコードを変更して実行するだけです:) – Eki

+0

Ok。あなたは正規表現マッチを行い、マッチを操作し、oldstringとnewstringで "置き換え"ますか?私は正規表現置換があなたが望むように動作するかどうかはわかりません。一方、正規表現のマッチは機能します。 – Andreas

答えて

2

RegExp.Replaceにコールバック関数を渡すことはできませんので、唯一の選択肢があります:RegExp.executeを使用し、ループ内で一致を処理します。ここで

は、あなたのケースのためのサンプルコードは、(あなたが唯一の内側に知られている区切り文字、 []を変更する値を持っているので、私はショートカットを取った。)である。ここ

Sub replaceWithregExp() 

Dim regExp As Object 
Dim regx, S$, Strnew$ 
Set regExp = CreateObject("vbscript.regexp") 
With regExp 
    .Pattern = "\[([0-9]{2})]" 
    .Global = True 
End With 
'How to do some calculations with $1? 
' Removing regExp.Replace(Selection.Text, "[$1]") 
For Each m In regExp.Execute(Selection.Text) 
    Selection.Text = Left(Selection.Text, m.FirstIndex+1) _ 
     & Replace(m.Value, m.Value, CStr(CInt(m.Submatches(0)) + 10)) _ 
     & Mid(Selection.Text, m.FirstIndex + Len(m.Value)) 
Next m 

End Sub 

  • Selection.Text = Left(Selection.Text, m.FirstIndex+1) - 前のものを取得する
  • & Replace(m.Value, m.Value, CStr(CInt(m.Submatches(0)) + 10)) - キャプチャした番号に10を追加
  • & Mid(Selection.Text, m.FirstIndex + Len(m.Value)) - ここでは、キャプチャ
+1

WiktorStribiżewありがとうございました!クールなコードとそれが好む! – Eki

+0

@エキ:それはあなたのために働いてうれしいです。左の✓をクリックして回答を受け入れることを検討してください([回答を受け入れる方法](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)を参照)とupvoting私の答えがあなたに役立つことが判明した場合([Stack Overflowについてのアップルのしくみは?](http://meta.stackexchange.com/questions/173399/how-to-upvote-on-stack-overflow)参照)。 –

+1

をクリックしました。私はstackoverflowの新しいユーザーですので、まだその機能に精通していません。 :P – Eki

1

は、あなたがこれを達成するために使用できる簡単なVBAマクロで後は何か追加します。

トリックすればいい
Sub IncrementNumbers() 

    Dim regExp As Object 
    Dim i As Integer 
    Dim fullMatch As String 
    Dim subMatch As Integer 
    Dim replacement As String 
    Const TMP_PREFIX As String = "$$$" 

    Set regExp = CreateObject("vbscript.regexp") 
    With regExp 
     .Pattern = "\[([0-9]{2})\]" 
     .Global = True 
     .MultiLine = True 
    End With 

    'Ensure selected text match our regex 
    If regExp.test(Selection.Text) Then 
     'Find all matches 
     Set matches = regExp.Execute(Selection.Text) 
     ' Start from last match 
     For i = 0 To (matches.Count - 1) 
      fullMatch = matches(i).Value 
      subMatch = CInt(matches(i).SubMatches(0)) 
      'Increment by 1 
      subMatch = subMatch + 1 
      'Create replacement. Add a temporary prefix so we ensure [30] replaced with [31] 
      'will not be replaced with [32] when [31] will be replaced 
      replacement = "[" & TMP_PREFIX & subMatch & "]" 
      'Replace full match with [subMatch] 
      Selection.Text = Replace(Selection.Text, fullMatch, replacement) 
     Next 
    End If 

    'Now replacements are complete, we have to remove replacement prefix 
    Selection.Text = Replace(Selection.Text, TMP_PREFIX, "") 

End Sub 
+0

あなたの答えをありがとう!しかし、この方法には時には問題があるかもしれません。参考文献の通し番号は必ずしも記事で昇順であるとは限らないためです。たとえば、記事の始めと終わりに同じ参考文献を引用することがあります。 – Eki

+0

これは数時間後に修正されます) –

+0

@Ekiこれで正しく動作するはずです。 –

1

:使用する

Sub IncrementWithRegex() 
    Dim Para As Paragraph 
    Set Para = ThisDocument.Paragraphs.First 
    Dim ParaNext As Paragraph 
    Dim oRange As Range 
    Set oRange = Para.Range 
    Dim regEx As New RegExp 
    Dim regMatch As Variant 
    Dim ACrO As String 

    With regEx 
     .Global = True 
     .MultiLine = False 
     .IgnoreCase = False 
     .Pattern = "[\[]([0-9]{2})[\]]" 
    End With 

    Do While Not Para Is Nothing 
     Set ParaNext = Para.Next 
     Set oRange = Para.Range 
     'Debug.Print oRange.Text 
     If regEx.test(oRange.Text) Then 
      For Each regMatch In regEx.Execute(oRange.Text) 
       oRange.Text = _ 
        Left(oRange.Text, _ 
         InStr(1, oRange.Text, CStr(regMatch))) & _ 
        CDbl(regMatch) + 1 & _ 
        Right(oRange.Text, _ 
          Len(CStr(regMatch)) + InStr(1, oRange.Text, CStr(regMatch))) 
      Next regMatch 
     Else 
     End If 
     Set Para = ParaNext 
    Loop 
End Sub 

をこれを参照してください:

Description: Microsoft VBScript Regular Expressions 5.5 
FullPath: C:\windows\SysWOW64\vbscript.dll\3 
Major.Minor: 5.5 
Name:  VBScript_RegExp_55 
GUID: {3F4DACA7-160D-11D2-A8E9-00104B365C9F} 
関連する問題