忍者ブログ
22 January

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

09 October

【Excel/VBA】選択中のワークグループの(シェイプ内テキストを含む)置換

先日の応用。通常の検索ウィンドウで検索する要領で、シェイプのテキストも置換していく。
※ただし、値の入力はイミディエイトでCallだし、パラメータも不十分。

ところで、メモリが足りないせいなのか、イミディエイトに記入済みのコマンドの再実行をしようとすると、そんなモジュールねぇよ!(意訳)って怒られて貼り直す→動く、ということをしてました。なんなんだぉ

'-----------------------------------------------------------------------------------------
Public Sub Replace_RaS(Tgt_Text As String, Rep_Text As String, Optional Mode As Long)
'====================================
' 選んだワークシートの全置換※シェイプ内テキストを含む
'====================================
Dim WSs As Object, WS As Worksheet
Dim Rng As Range
Dim shps As Shapes, shp As Shape
Dim i As Long, wkStr As String

On Error GoTo Err_Replace_RaS

i = 0
If Mode = 0 Then Mode = xlFormulas

Set WSs = ActiveWindow.SelectedSheets
Application.ScreenUpdating = False

For Each WS In WSs

' 普通に置換
Set Rng = WS.Cells.Find(Tgt_Text, , Mode)
Do Until Rng Is Nothing
Select Case Mode
Case xlFormulas
Rng.Formula = Replace(Rng.Formula, Tgt_Text, Rep_Text)
Case xlValues
Rng.Value = Replace(Rng.Value, Tgt_Text, Rep_Text)
Case xlComments
Rng.Comment = Replace(Rng.Comment, Tgt_Text, Rep_Text)
Case Else
Rng.Value = Replace(Rng.Value, Tgt_Text, Rep_Text)
End Select

i = i + 1
Set Rng = WS.Cells.Find(Tgt_Text, Rng, Mode)
Loop

Set Rng = Nothing
Set shps = WS.Shapes

On Error GoTo Non_Err_CK

For Each shp In shps
If InStr(shp.TextFrame.Characters.Caption, Tgt_Text) > 0 Then
wkStr = shp.TextFrame.Characters.Caption
shp.TextFrame.Characters.Caption = Replace(wkStr, Tgt_Text, Rep_Text)
i = i + 1
End If
Skip_Shp:
Next

Set shp = Nothing
Set shps = Nothing

On Error GoTo Err_Replace_RaS
Next

Application.ScreenUpdating = True

MsgBox i & " 件置換しました。"


Exit Sub
Non_Err_CK:
Select Case Err.Number
Case 13
Resume Skip_Shp
End Select

Err_Replace_RaS:
Debug.Print Err.Number & " " & Err.Description
Resume Next
End Sub
'-----------------------------------------------------------------------------------------

余談で発見したTips。Variant型のOptionalが省略されている時に、規定値を設定したい時
(↑の『If Mode = 0 Then Mode = xlFormulas』のModeがLong型じゃなくてVariant型だったら)

xlCommensをxlCommantと間違ってDebug.printで中味を確認したら、xlCommentさんは、0バイト文字だったんですよ。……String型、だと……?と、まぁ、そんな筈はねーんですけど。

String型かLong型が来るかもしれない渡し値なら、Variantで受けねばなんねぇことになった訳で、このVariant型のModeが省略されているか?の判断がなかなかできなかったんです。(EmptyもNothingもNullも空白文字ももちろんダメだぜちくしょうっ…!)

が、正着はこれっぽい↓
'-----------------------------------------------------------------------------------------
If TypeName(Mode) = "Error" Then Mode = xlFormulas
'-----------------------------------------------------------------------------------------
詳しくはTypeName関数のぐぐり結果に任せます。

拍手

PR