1

ボタンをクリックすると、Excel VBA マクロを使用してすべてのワークシート ページ ヘッダー (列ヘッダーではない) に関連情報を自動的に入力するシートがあります。このマクロは、wSheet.Name を使用してヘッダー タイトルを入力します。ただし、wSheet.Name には、ヘッダーに表示したくない先頭の数字、ピリオド、およびスペースが含まれていることがよくあります。

次のサンプル ワークシート名に注意してください。

Cover Page
1a. Test Page
1b. Sample Page
2. Another Test Page
3. Yet Another Test Page
4. Almost the Last Example Page
998.  Last Example Page

正規表現を使用してこれらの先頭の数字、ピリオド、およびスペースを削除したいのですが、Excel で VBA を使用してコーディングする方法がわかりません。できるだけ柔軟に対応していただきたいです。ワークシート名を表示する方法の例を次に示します。

Cover Page
Test Page
Sample Page
Another Test Page
Yet Another Test Page
Almost the Last Example Page
Last Example Page

ヘッダーを設定する既存のコードは次のとおりです。

Sub FillHeaders()
'
' Auto_Fill_Project_Name Macro
'
For Each wSheet In ActiveWorkbook.Worksheets
    If wSheet.Name <> "Cover Page" Then
        wSheet.PageSetup.CenterHeader = _
            "&16&KFF0000" & ActiveSheet.Range("J1") & "&10&K000000 &16" & " " & _
            wSheet.Name & Chr(13) & "&10 &11 Revision Date: "
    End If
    Next wSheet
'
End Sub

目標を達成するためにこれを変更するにはどうすればよいですか?

ありがとうございました!

編集-私は次のアプローチを取りました:

Function remleaddig(str As String)
    Set regEx = CreateObject("VBScript.RegExp")
    regEx.Pattern = "^\S*\."
    str = regEx.Replace(str, "")
    remleaddig = Trim(str)
End Function
4

3 に答える 3

2

更新:-追加UDF

Function StripChars(strIn As String) As String
Dim objRegex As Object
Set objRegex = CreateObject("vbscript.regexp")
 With objRegex
 .Pattern = "^.+\.\s+"
.ignorecase = True
StripChars = .Replace(strIn, vbNullString)
End With
End Function

最初の投稿`

をバリアント配列と組み合わせて、コードの実行時間を短縮します。以下のコードは

  1. を設定するためのレイトバインディングregexp
  2. の列Aの値はActiveSheet、変数配列に読み込まれます(コードは2D範囲を処理することに注意してください。つまり、列AとBでの作業にX使用できます。X = Range([a1], Cells(Rows.Count, "B").End(xlUp)).Value2
  3. regexp不要な文字を取り除きます-保持したいテキストの前にある場合は、複数のスペースを処理します
  4. クリーンアップされたテキストは、で始まるアクティブなシートにダンプされますC1。この行を変更してダンプを移動します。で始まる元の値の上にダンプを戻すことができますA1[c1].Resize(UBound(X, 1), UBound(X, 2)).Value2 = X

ここに画像の説明を入力してください

コード

Sub QuickUpdate()
Dim X()
Dim objRegex As Object
Dim lngRow As Long
Dim lngCol As Long

X = Range([a1], Cells(Rows.Count, "A").End(xlUp)).Value2
Set objRegex = CreateObject("vbscript.regexp")
 With objRegex
 .Pattern = "^.+\.\s+"
.ignorecase = True
For lngRow = 1 To UBound(X, 1)
For lngCol = 1 To UBound(X, 2)
X(lngRow, lngCol) = .Replace(X(lngRow, lngCol), vbNullString)
Next lngCol
Next lngRow
End With

[c1].Resize(UBound(X, 1), UBound(X, 2)).Value2 = X

End Sub
于 2012-11-05T22:32:41.520 に答える
1

実は、VBScript の RegEx オブジェクトを介して正規表現を使用できます。例については、 https://stackoverflow.com/a/13041710/1756702を参照してください。

于 2012-11-05T14:36:43.907 に答える
1

私のコメントを詳しく説明します。

これには、への参照が必要でしたMicrosoft VBScript Regular Expressions 5.5(または、マシン上の番号は何でも)

Dim r As RegExp
Set r = New RegExp
r.Pattern = "^\S*\. "

Dim c As Range, rng As Range
Set rng = Range("A1:A7")   ' <-- Set this to your range
For Each c In rng
    c.Value = r.Replace(c.Value, "")
Next c

すべてのテキストが 1 つのセルにある場合は、次のように変更します。

Dim r As RegExp
Set r = New RegExp
r.Pattern = "^\S*\. "
r.MultiLine = True
r.Global = True

Dim c As Range
Set c = Range("J1")
    c.Value = r.Replace(c.Value, "") '<--or place the result where ever you want

正規表現の説明

  • "^ これは、指定されたパターンが文字列の先頭から開始する必要があることを示しています。ヘッダー タイトルの途中にある数字は一致させたくありません。
  • \S これは、空白 ([^a-zA-Z0-9]) を除くすべてに一致します。つまり、文字と数字に一致します。
  • * これは前のパターンの 0 個以上に一致します
  • \. これはピリオドに一致します (ピリオド自体は前のパターンの 1 つ以上に一致することを意味する\ため、ピリオドは a でエスケープする必要があります。.
  • " これは単一のスペースに一致します。
于 2012-11-05T15:40:28.313 に答える