こんばんは。Wendy02です。
ちょっとお話に興味があって、あえて修正版を作りました。
しょせん、Undoの仕組みというのは、どこかにバッファを置いているだけだと思うのです。私は、この手のものは、時々、Undoに代わるものを作ります。前のは、手抜きでしたから、今度は、もう少し手の込んだものを作りました。
通常は、VBAプロシージャで、すべてのUndoを考えていたら、VBA側に与えられているメモリは小さいので、それを食いつぶしてしまう可能性があります。
以下は、配列変数の一こまに、どの程度の許容量があるのか知りませんが、許容量を増やすなら、以下は、Logs の型をString 型すれば広がります。しかし、Null値を入れるために、Variant 型にしてあります。
String型の場合は、その代わりに、Chr(0)を入れればよいのですが。Null値のほうが簡単なのど、それを用いました。
'---------------------------------------------------------
'Option Explicit
Private Logs(100) As Variant
Sub ReplaceInTextBoxesR()
Dim shp As Object
Dim i As Integer
Const BEF As String = "あいうえお" '検索後
Const AFT As String = "ABCDE" '置換語
Const TX As Integer = vbTextCompare '全半角区別なし
Const BIN As Integer = vbBinaryCompare '全半角区別あり
For Each shp In ActiveSheet.Shapes
If shp.Type = msoTextBox Then
Logs(i) = shp.DrawingObject.Text
shp.DrawingObject.Text = _
Replace(shp.DrawingObject.Text, BEF, AFT, , TX) '全角半角区別なし
i = i + 1
End If
Next
Logs(i) = Null
If MsgBox("これでよろしいですか?", vbQuestion + vbOKCancel) = vbCancel Then
Call UndoLogs
End If
End Sub
Private Sub UndoLogs()
'一回きり、戻せます。
Dim shp As Variant
Dim i As Integer
For Each shp In ActiveSheet.Shapes
If shp.Type = msoTextBox Then
If IsNull(Logs(i)) Or IsEmpty(Logs(0)) Then Exit For
shp.DrawingObject.Text = Logs(i)
i = i + 1
End If
Next
Erase Logs
End Sub
投稿日時 - 2007-03-24 19:42:15