• ベストアンサー

Excel : テキストボックス中のテキストの検索・置換

Excelの図として貼り付けたテキストボックスにテキストが入力されていて、そのテキストボックスが数十個、シートに貼り付けられています。またそれが30シートくらいあります。 このたくさんのテキストボックスに入力されたテキストを複数のシートに渡って一括置換する方法はありませんでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんばんは。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

buzhidao
質問者

お礼

修正版までありがとうございます。 月曜日に試してみたいと思います。(^^)

その他の回答 (4)

  • cthrough
  • ベストアンサー率0% (0/1)
回答No.4

#1です。 >元に戻せないことを強調 マクロの場合は、 間違った置換を行った場合は戻せませんよ(※)、 という意味合いでした、誤解を招き申し訳ないです。 ※トレースジャーナルを持たない限り不可逆な置換である、と考えより 【ABCD】の【BC】を【CD】に変換しようとして【AB】を置換してしまったとしても 返還後の【CDCD】に無条件で【CD】を【AB】へ戻す処理を施しても 【ABAB】にしかならない (“共有”ブックにある履歴を読み戻すイメージじゃない限り)  

buzhidao
質問者

お礼

なるほど。 丁寧な説明ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 #1の補足の、「残念ながら、マクロは使えません。」の意味が、マクロを使っていけないなら、諦めるしかありませんね。 それと、あまり、元に戻せないことを強調しているようなので、元に戻すオプションをつけてしまいました。 Const SW As Integer = 0 '順行 /0以外は、反転 は、簡単にいうと、=1 を入れれば、元に戻ります。 '------------------------------------- '標準モジュールが適しています。 Sub ReplaceInTextBoxes() Dim shp As Object Const BEF As String = "abcdefg" '検索後 Const AFT As String = "あいうえお" '置換語 Const SW As Integer = 0 '順行 /0以外は、反転 Const TX As Integer = vbTextCompare '全半角区別なし Const BIN As Integer = vbBinaryCompare '全半角区別あり Dim SWd As String Dim RWd As String   If SW = 0 Then  SWd = BEF: RWd = AFT Else  SWd = AFT: RWd = BEF End If  For Each shp In ActiveSheet.Shapes  If shp.Type = msoTextBox Then   shp.DrawingObject.Text = _   Replace(shp.DrawingObject.Text, SWd, RWd, , , TX) '全角半角区別なし  End If  Next End Sub

buzhidao
質問者

お礼

誤解を招く表現で申し訳ございませんでした。 マクロを使っていけないということはありません。 元に戻すオプションまでつけて頂きありがとうございました。

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

マクロで一括置換する方法です。 Alt+F11でVBAの画面を開き、左側のツリーからブック名を選択し、右クリックから「挿入」>「標準モジュール」を選択して、右の画面に以下のマクロをコピーして貼り付けてください。 Sub テキストボックス置換()  Dim BeforeStr As String  Dim AfterStr As String  Dim WS As Worksheet  Dim s As Shape    Application.ScreenUpdating = False  BeforeStr = InputBox("置換前の文字列を入力してください。")  AfterStr = InputBox("置換後の文字列を入力してください。")  For Each WS In Worksheets   WS.Activate   For Each s In WS.Shapes    If s.Name Like "Text Box*" Then     s.Select     Selection.Characters.Text = _     Replace(Selection.Characters.Text, BeforeStr, AfterStr)    End If   Next  Next  Application.ScreenUpdating = True End Sub その画面でF5キーを押すか、Alt+F11でExcelの画面に戻ってAlt+F8からマクロを実行してみてください。一度置換したら元には戻せないのでご注意ください。

buzhidao
質問者

お礼

わざわざマクロを作って頂きありがとうございました。

  • cthrough
  • ベストアンサー率0% (0/1)
回答No.1

通常の検索機能で検索・置換では やはり変換は行えません。 質問者の方がマクロを使えれば For EachをWorkSheetとShape(※)で ネストさせながらReplaceを発行していけば それほど複雑な制御なく置換(※※)が行えます。 ※ShapeがTextBox以外ある場合はTextBoxを判定しないといけません ※※当然、マクロなのでUNDOはできません  

buzhidao
質問者

お礼

ありがとうございます。 残念ながら、マクロは使えません。

関連するQ&A

  • Excelで、テキストボックスに書かれた文字を検索したい

    表題の通りなのですが、 1) ExcelのSheetにテキストボックスを作成する 2) その中に文字(品番・コード名)を入力する 3) そのようなテキストボックスが、Sheet上にたくさんある 4) おなじブックの別Sheetにも同様のテキストボックスがたくさんある このような場合、ブックを開き、テキストボックス内の任意の文字を検索することは可能でしょうか?

  • テキストボックス

    たびたびの質問すみません。 エクセルVBAでテキストボックス等(条件)に入力すると、他のテキストボックスにエクセルシートから照合して表示させる方法で、条件のテキストボックス等を2つ以上にすることは可能でしょうか、あればやり方を教えてください。

  • EXCELでテキストボックスを選べない

    EXCELでのシートで セルにはデータが入っています セルはそれぞれクリックできます シートの真ん中に テキストボックス(四角い図形の中に テキストが入力されているので) があり それをクリックしようとすると ○の中に /が入っている 警告のようなものが出てきて テキストボックスを選べません  シートは保護されていないようです どんな設定がされていますか

  • [VBA]テキストボックスからエクセル反映(複数行)

    始めまして。初めて質問させて頂きます。至らない点があると思いますがよろしくお願い致します。 今テキストボックスよりエクセル(単一セル)に文字を入力するシートを作成しております。 テキストボックスで複数行入力(Enterで改行)の方法と複数行入力した文字をシート(1セル)に反映したいのですが良い方法をご存知でしたらご教授お願いします。 【やりたい事項】 テキストボックス内 (1)○は△です。(Enterで改行) (2)×は●です。 エクセルシート上(A1セルで) (1)○は△です。(ALT+Enter) (2)×は●です。 現状:MultiLineをTRUEにして右端まで文字入力すると2行目に入力可能 エクセルに反映すると「○は△です。×は●です。」と1セルで1行で表示となってます。 言葉足らずかもしれませんが、よろしくお願いします。

  • テキストボックスの大きさを、基準の大きさに戻す(エクセルVBA)

    図形のテキストボックスの大きさを取得して、その値を各テキストボックスの基準の大きさとして記録しておき、テキストボックスの大きさをマウスでドラッグして大きさを変えた後、ボタン1つでもとの大きさに戻したいのですが、どのようにすればよいでしょうか? 1)図形のテキストボックス、大きさの取得方法は? 2)基準の大きさと記録する方法は? 3)記録された大きさに戻すには?(シート上に配置されたボタンで実行) ※ 複数のシートに複数のテキストボックスがあります。 ※ シート毎にセットします。(シート毎にテキストボックスのサイズが違う為) ※ 現在、各テキストボックスには、基準位置がセットしてあり、ボタンで基準位置へ戻る仕組みが組まれています。(これをそのままにして・・・) ※ エクセル97と2000で使えるようにします。(作成は97) 宜しくお願い致します。

  • エクセルの置換について

    エクセルの置換について エクセル2000を使っています。 1シート内に日付(10/1、10/2・・・)が複数セルに入力されています。 このシート内のセルを毎月更新(10/3→10/31、10/4→11/1、10/5→11/2と一定周期で変更)するのですが、ひとつずつのセルに直接入力変換していくと時間が掛かる為、現状は(これも面倒ですが)置換機能で1日ずつ“すべて置換”で更新しています。 ですが、例えば11/1→11/29という置換をすると、先に打ち込んだ11/1を含むセル(11/11、11/13など)全てが置換されてしまうため、“完全に同一なセルだけを検索する”にチェックし、すべて置換をするのですが、『置換対象となる一致するデータが見つかりません。検索範囲にそのデータがないか、または条件に一致するレコードがありません。』というエラーメッセージが出てしまい、置換ができません。 11/1のように(/1)が入力されたセルだけを指定して、別の日付に全て置換する方法はどうすれば良いですか? 宜しくお願いします。

  • Excel 入力して置換するマクロ

    Excel 入力して置換するマクロ 同一書式で作成された表がある複数の書式シートのデータを、同一ブック内にあるデータ集約するための集約シートが「表 あ」にあります。 都合上、集約シートには表は、「表 あ」しかなく、1つの書式シートのデータのみしか表示していません。 書式シートのデータを参照する計算式内のシート名にあたる『Sheet1!』の部分を置換で他の書式シートに変えたいのですが、対象シートが複数あり上、誰でも置換をスムーズに行いたいので、インプットボックスにシート名を記載すれば置換できるマクロが作れないのか試行錯誤しております。 良い方法があればお教え下さい。

  • エクセル テキストボックスについて

    エクセルでテキストボックスへセルからの反映方法 の質問です。 エクセルのセル内の数字や文字を ・いくつかのシートを作成して ・そのシートのセルに反映させ、連動させる 方法はどのようにするのでしょうか。

  • テキストボックス一括編集

    ワードのテキストボックスが複数あり、そこには同じ番号が入っているのですが その番号を毎回印刷毎に変更する必要があり、毎回各テキストボックスを選択して編集しているのですが、一括で変更し手間やミスを無くそうと思っております。 一括での編集のやり方をご存知の方居りましたら、ご教授ください。 ※Ctrl+Hで検索して置換ではテキストボックス内の為か方法が間違っているのか検索にすらひっかかりませんでした。 ワード2013を使用しています。

  • エクセル2010テキストボックスとシートの保護

    テキストボックスとシートの保護について エクセル2010を使用しています。 シートの中には、結合したセルの中に文字が入力してあり、 またテキストボックスを使用して、その中に文字が入力してあるものもあります。 そこで質問なのですが、 (1)テキストボックスの枠(?)のみを固定(保護)し、入力だけを可能にする。 ※サイズの固定ではなく、その場所から動かさないように固定する方法です。 (2)セルを固定(保護)し、入力のみを可能にする。 上記を同時に可能にするためには、どのような操作をしたらよろしいでしょうか? ご教授お願いいたします。

専門家に質問してみよう