- 締切済み
Excel VBA のセル内の選択テキストの読み書きは?
Excel VBAで、選択されたセルではなくセル内の選択された部分のテキストの読み書きはできるのでしょうか? つまり、選択されたセルのテキストは Selection.Value を使って OldText = Selection.Value Selection.Value = "NewText" と読み書きができますが、セル内で選択されたテキストについてのインターフェイスはあるんでしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- DOUGLAS_
- ベストアンサー率74% (397/534)
>VBAを使わないで直接編集することにしました それがよいかと存じます。 例えば、ワードに移植して、ワードの方のマクロで、というようなことでもできそうな気はいたしますが、私はワードを使わない人なので全然解りません。 <(_ _)> ちなみに、前回答の >書くべからざるような無理矢理な力業 というのは、下記のようなマクロです。 荒削り、かつ、編集モードから抜け出す処理もしておりませんが、Sheet2 A列に「置換前の言葉」、B列に「置換後の言葉」を並べておけば、 >「選択部分のみ」を選択してから「*」にでも置き換えて確定 あるいは、「選択部分のみ」を削除するなど(変化)した途端に、「選択部分のみ」を「置換後の文字列」に変換し、その後ろにカーソルが入った状態で編集モードに戻ります。 何かの不具合で「型が一致しません。」エラーも起こりますし、全然イケテないコードですのでご参考までに、ということで。。。 なお、便宜上、変数の宣言は都度行なっております。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count <> 1 Then Exit Sub Application.EnableEvents = False Dim strAfter As String Dim strBefore As String strAfter = Target.Value Application.Undo strBefore = Target.Value Dim i As Byte Dim j As Byte For i = 1 To Len(strBefore) If Left(strBefore, i) <> Left(strAfter, i) Then Exit For Next For j = 1 To Len(strBefore) If Right(strBefore, j) <> Right(strAfter, j) Then Exit For Next Dim strSelected As String strSelected = Mid(strBefore, i, Len(strBefore) - j - i + 2) Dim strReplace As String On Error Resume Next strReplace = Application.VLookup(strSelected, Sheets("Sheet2").Range("A:B"), 2, False) If Err.Number = 0 Then Target.Value = Application.Replace(strBefore, i, Len(strSelected), strReplace) End If On Error GoTo 0 Target.Activate SendKeys "{F2}{LEFT " & j - 1 & "}" Application.EnableEvents = True End Sub
- DOUGLAS_
- ベストアンサー率74% (397/534)
>やりたいのはセル内のテキストを編集している最中に選択部分のみを選択された部分の内容から決められるある値にボタンひとつで変換することです。 「置換箇所が多い」というような問題でしたら、別シートに「置換文字列対応表」のようなものを作っておいて、マクロで自動的に変えることは簡単かと存じます。 [REPLACE 関数] や [SUBSTITUTE 関数] のようなワークシート関数や [検索と置換] ではいかない複雑な理由があってのことでしょうね。 書くべからざるような無理矢理な力業ですが、敢えて書いてみます。有用なご回答がなかった場合のみ、ご参考になさってみてください。 Private Sub Worksheet_Change(ByVal Target As Range) strAfter = Target.Value Application.EnableEvents = False Application.Undo strBefore = Target.Value ・・・・・・・・・・・・・・・・・・・・・ Target.Replace(・・・・・・・) Application.EnableEvents = True End Sub のようなやり方で、「選択部分のみ」を選択してから「*」にでも置き換えて確定、そのタイミングで、元の文字列から変更された部分(選択部分のみ)を割り出して...みたいなことはできないことではありません。 ・・・でも、本当は、実情により、もっと簡単な方法があるような気もいたしますが。。。
お礼
DOUGLAS_様、VBAを使わないで直接編集することにしましたので解答は締め切りたいと思います。ただ技術的には関心があるのでスレッドはオープンにしたままにしておきます。まことにありがとうございました。
補足
DOUGLAS_様、ふたたびまことにありがとうございました。 操作としてはセル内の文字列を編集中に、確定させないで、つまりWorksheet_ChangeのEventを発生させないで(させてもキーやマウス操作がなければそれでもよい)選択している部分だけ変換させたいと思います。 たとえばセル内の文字列を編集中に選択部分だけフォントを変える(色を変える)という操作の場合、次のようにします。 1)カーソルをセルの中に入れて文章を編集し、ターゲットを選択。 2)ツールバーのボタンひとつでそのターゲットの部分だけ色が変わる 3) そのまま、そのセル内の文章の編集が続行できる。 4) 最後にセルを移動してそのセルを確定する。 これと同様の操作を 2) のところでフォントを変えるのではなく、選択部分のたとえば "Visual"を"\n{Visual}"のように変換する、というようなことです。実際そのセルの内容を人間が読んで編集するまでは何を変換するのかわかっていないので最初に変換の対応表のようなものを作れません。同じ文字でも別のセルでは変換しないこともあるのでワークシートレベルで一度に置換するというのも難しいです。
- DOUGLAS_
- ベストアンサー率74% (397/534)
>セル内で選択されたテキストについてのインターフェイス [Characters メソッド] のことでしょうか? 新しいマクロの記録で、セル内のテキストにふりがなを設定してみてください。
補足
大変ありがとうございました。すこし近づきました。 そうなると問題は 1 ふりがな設定のように選択している部分のポジションをどのように得るか。 2 セル内のテキストを選択をしているときマクロが動かせない(マクロのメニューは無効化されている。ツールバーボタンにしても効かない) ということのようですね。 やりたいのはセル内のテキストを編集している最中に選択部分のみを選択された部分の内容から決められるある値にボタンひとつで変換することです。
お礼
ありがとうございました。 >>例えば、ワードに移植して、ワードの方のマクロで、というようなことでもできそうな気はいたしますが これはいいアイデアでした。わたしも初めてワードVBA使いましたが、エクセル上で手動で編集するより便利なので、ワードで編集してエクセルに貼り付ける方法に変えました。Selection.Textだけでできますね。