• 締切済み

Excel VBA のセル内の選択テキストの読み書きは?

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

みんなの回答

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.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

quitequiet
質問者

お礼

ありがとうございました。 >>例えば、ワードに移植して、ワードの方のマクロで、というようなことでもできそうな気はいたしますが これはいいアイデアでした。わたしも初めてワードVBA使いましたが、エクセル上で手動で編集するより便利なので、ワードで編集してエクセルに貼り付ける方法に変えました。Selection.Textだけでできますね。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.2

>やりたいのはセル内のテキストを編集している最中に選択部分のみを選択された部分の内容から決められるある値にボタンひとつで変換することです。  「置換箇所が多い」というような問題でしたら、別シートに「置換文字列対応表」のようなものを作っておいて、マクロで自動的に変えることは簡単かと存じます。  [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 のようなやり方で、「選択部分のみ」を選択してから「*」にでも置き換えて確定、そのタイミングで、元の文字列から変更された部分(選択部分のみ)を割り出して...みたいなことはできないことではありません。 ・・・でも、本当は、実情により、もっと簡単な方法があるような気もいたしますが。。。

quitequiet
質問者

お礼

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

quitequiet
質問者

補足

DOUGLAS_様、ふたたびまことにありがとうございました。 操作としてはセル内の文字列を編集中に、確定させないで、つまりWorksheet_ChangeのEventを発生させないで(させてもキーやマウス操作がなければそれでもよい)選択している部分だけ変換させたいと思います。 たとえばセル内の文字列を編集中に選択部分だけフォントを変える(色を変える)という操作の場合、次のようにします。 1)カーソルをセルの中に入れて文章を編集し、ターゲットを選択。 2)ツールバーのボタンひとつでそのターゲットの部分だけ色が変わる 3) そのまま、そのセル内の文章の編集が続行できる。 4) 最後にセルを移動してそのセルを確定する。 これと同様の操作を 2) のところでフォントを変えるのではなく、選択部分のたとえば "Visual"を"\n{Visual}"のように変換する、というようなことです。実際そのセルの内容を人間が読んで編集するまでは何を変換するのかわかっていないので最初に変換の対応表のようなものを作れません。同じ文字でも別のセルでは変換しないこともあるのでワークシートレベルで一度に置換するというのも難しいです。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.1

>セル内で選択されたテキストについてのインターフェイス  [Characters メソッド] のことでしょうか?  新しいマクロの記録で、セル内のテキストにふりがなを設定してみてください。

quitequiet
質問者

補足

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

関連するQ&A

  • ExcelのVBAで特定のセルのみ選択

    Excel VBAの初心者です。 数式など入ったセルの選択は Selection.SpecialCells(xlFormulas).Select で、出来ましたが単純にセルの値が「1」などの時に選択するには どうすれば良いでしょうか。

  • EXCELのVBA-フィルタ抽出後のセル選択方法

    EXCELのVBAです。  オートフィルタ(Autofilter)で、何らかの条件で抽出をかけた後の部分で、 特定のセル、例えば、2列目の上から5番目のセル、を選択するには、 どうすれば良いでしょう?  言い方を変えれば、可視セルの中だけで、何列目で何行目セルという指定 をするにはどうすれば良いかと。  RangeとかSelectionで、指定する方法が有るのでしょうか? よろしくお願いいたします。

  • Excel、VBA、選択されているセルに値の追加

    最近仕事の事務作業を軽減させるためVBAの勉強を始めました。 現在VBAにて機能実現においてつまずいております。 ご教授いただけると幸いです。 実現したい機能といたしましては、Ctrlとクリックで選択された位置の離れている複数のセルに対し、 リストから参照した値を、選択されているセルの内容に追加したいと考えております。 現在最初に選択したセルの内容が、以降選択したセルに反映されてしまう形になってしまっています。 それぞれのセルに最初に選択したセルの内容を反映させず、リストから選んだ内容を追加しようとすればどのような方法があるでしょうか? ご回答の方、どうぞよろしくお願いいたします。 以下は現在のソースと、実現したい画面イメージになります。 Private Sub Worksheet_Change(ByVal Target As Range) Dim k As String '1,3のセルの内容が変更されたら開始 If Target.Address = "$C$1" Then Application.EnableEvents = False 'セル1,3の内容をkに代入 k = Cells(1, 3).Value '選択されているセルにkの内容を追加 Selection.Value = Selection.Value & k Application.EnableEvents = True End If End Sub

  • エクセルVBAでセル選択

    エクセル2000でリストを作成し、VBAで編集しようとしています。 A列に入力されているコードの先頭に「’」をつけて文字列とするための関数をB2のセルからA列のデータが入力されている最後のセルの隣までコピーしたいと思っています。 A列の最終セルを取得するVBAは分かったのですが、その値をB列の選択範囲として使用する方法がわかりません。 エクセルVBAは全くの初心者です。 どなたか教えてください!

  • VBAで1度実行すると選択したセルに値を入力する方

    VBAで1度マクロを実行すると、止めるまで選択したセルに文字を入れる方法を知りたいです。 今は、selection.value="あ" でやってるのですがこれだとセル選択後に毎回ボタン押さないと入力できないのですが 1度ボタンを押すと毎回押さなくても選択したところに値が入るようにしたいです(伝わって!)

  • Excel(VBA)で1つのセルを選択したときのアドレス

    またまた 誰か教えていただけるとうれしいです エクセルのVBAであるセルを選択したときに そのセルのアドレス(A1)みたいなかんじの ものを取得する方法が知りたいのですが お願いします!

  • エクセルVBAで、ユーザーボックスを開いたときにテキストボックスにセル

    エクセルVBAで、ユーザーボックスを開いたときにテキストボックスにセルの値を自動で表示させたいのですが、うまくいきません。テキストボックスをクリックすると表示されるのですが・・・    Private Sub txt1_Change() Sheets("Sheet1").Range("a1").Value=txt1.Value End Sub としたのですが、やはり間違いなのでしょうか?

  • エクセルVBA・セルを選択して並べ替えたい

    エクセルVBA・セルを選択して並べ替えたい 以下の質問では、たいへんお世話になりありがとうございました。 http://okwave.jp/qa/q6203452.html 少し関連した質問をいたします。 具体的に言いますと、マウスでセル範囲を選択して、その選択した範囲を並べ替える、というようなイメージです。(マウスでセル範囲を選択してから、マクロを実行します) 以下のコードで言うと Range("○●:○●").の部分が、マウスで選択した範囲というような具合です。 Sub sort1() Range("○●:○●").Sort _ Key1:=Range("d1"), _ Order1:=xlDescending, _ Header:=xlYes, _ Orientation:=xlTopToBottom End Sub 以上、よろしくご教示お願いします。

  • VBAでテキストボックスを作成

    エクセルのVBAで、セルに長めの文章を打ち込む時、セルを選択したらテキストボックスなりが開くようなことはできませんか? テキストボックスは別窓じゃなく、同じエクセル内で開くのが望ましいです。

  • エクセル VBA : テキストボックスのグループ化

    エクセル VBAにてテキストボックスをグループ化したいのです。 マクロを記録すると、 ActiveSheet.Shapes.Range(Array("Oval 82", "Text Box 83")).Select Selection.ShapeRange.Group.Select となります。 "Text Box 83"のように常に名前が固定されているわけではないので、セルのA1からC10にある図形を選択してグループ化するようにしたいのです。 ご存知の方、アドバイス願います。

専門家に質問してみよう