アプリ版:「スタンプのみでお礼する」機能のリリースについて

Excel VBAで、選択されたセルではなくセル内の選択された部分のテキストの読み書きはできるのでしょうか?
つまり、選択されたセルのテキストは
Selection.Value を使って
OldText = Selection.Value
Selection.Value = "NewText"
と読み書きができますが、セル内で選択されたテキストについてのインターフェイスはあるんでしょうか?

A 回答 (3件)

>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
    • good
    • 0
この回答へのお礼

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


>>例えば、ワードに移植して、ワードの方のマクロで、というようなことでもできそうな気はいたしますが

これはいいアイデアでした。わたしも初めてワードVBA使いましたが、エクセル上で手動で編集するより便利なので、ワードで編集してエクセルに貼り付ける方法に変えました。Selection.Textだけでできますね。

お礼日時:2009/05/07 00:39

>やりたいのはセル内のテキストを編集している最中に選択部分のみを選択された部分の内容から決められるある値にボタンひとつで変換することです。



 「置換箇所が多い」というような問題でしたら、別シートに「置換文字列対応表」のようなものを作っておいて、マクロで自動的に変えることは簡単かと存じます。

 [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_様、ふたたびまことにありがとうございました。
操作としてはセル内の文字列を編集中に、確定させないで、つまりWorksheet_ChangeのEventを発生させないで(させてもキーやマウス操作がなければそれでもよい)選択している部分だけ変換させたいと思います。

たとえばセル内の文字列を編集中に選択部分だけフォントを変える(色を変える)という操作の場合、次のようにします。
1)カーソルをセルの中に入れて文章を編集し、ターゲットを選択。
2)ツールバーのボタンひとつでそのターゲットの部分だけ色が変わる
3) そのまま、そのセル内の文章の編集が続行できる。
4) 最後にセルを移動してそのセルを確定する。

これと同様の操作を 2) のところでフォントを変えるのではなく、選択部分のたとえば "Visual"を"\n{Visual}"のように変換する、というようなことです。実際そのセルの内容を人間が読んで編集するまでは何を変換するのかわかっていないので最初に変換の対応表のようなものを作れません。同じ文字でも別のセルでは変換しないこともあるのでワークシートレベルで一度に置換するというのも難しいです。

補足日時:2009/04/18 07:42
    • good
    • 0
この回答へのお礼

DOUGLAS_様、VBAを使わないで直接編集することにしましたので解答は締め切りたいと思います。ただ技術的には関心があるのでスレッドはオープンにしたままにしておきます。まことにありがとうございました。

お礼日時:2009/04/18 08:38

>セル内で選択されたテキストについてのインターフェイス


 [Characters メソッド] のことでしょうか?

 新しいマクロの記録で、セル内のテキストにふりがなを設定してみてください。

この回答への補足

大変ありがとうございました。すこし近づきました。
そうなると問題は
1 ふりがな設定のように選択している部分のポジションをどのように得るか。
2 セル内のテキストを選択をしているときマクロが動かせない(マクロのメニューは無効化されている。ツールバーボタンにしても効かない)
ということのようですね。
やりたいのはセル内のテキストを編集している最中に選択部分のみを選択された部分の内容から決められるある値にボタンひとつで変換することです。

補足日時:2009/04/17 20:00
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!