• ベストアンサー

エクセルのVBA

エクセルのVBAを教えて頂きたいのですが。 Sheet1にテキストボックスが200個張り付いています。 テキストボックスの番号は1番から200番までです。 1つのテキストボックスに1文字のみ表記されています。 このような状態で、テキストボックスの文字が「(」であるものを見つけたら、以後、「)」を見つけるまでその間の文字の色を赤にするVBAを教えてもらいたいのですが。(「(」「)」も赤にします) あいうえおかきくけ(こさしす)せそたちつてとなにぬねの(はひふ)へほ 上記の場合は (こさしす)(はひふ) が赤になります。 宜しくお願いします。

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

  • ベストアンサー
  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.1

> テキストボックスの番号は1番から200番までです。 この番号って、「名前」の後ろに付加されている番号のことですね。 現在は、デフォルトで付けられる "Text Box 1" のように名前が付いている ものとしています。 違う場合は、コードの7行目で番号より前の部分を指定してください。 括弧は、半角/全角 どちらでも有効で、一応、先頭の文字を検出しています。 何回実行しても、現データで着色し直します。 指定した範囲の番号で、欠番があると、メッセージを出して中止します。 (欠番を無視する方法もありますが・・・) これで如何でしょうか。 Sub StrColoring() Dim Tb As TextBox Dim N As Integer Dim CMode As Boolean On Error GoTo Err_Notfind For N = 1 To 200   Set Tb = ActiveSheet.TextBoxes("Text Box " & CStr(N))     If StrConv(Left(Trim(Tb.Text), 1), vbNarrow) = "(" Then       CMode = True       Tb.Font.ColorIndex = 3     ElseIf StrConv(Trim(Tb.Text), vbNarrow) = ")" Then       If CMode = True Then         Tb.Font.ColorIndex = 3         CMode = False       Else         Tb.Font.ColorIndex = xlAutomatic       End If     Else       If CMode = True Then         Tb.Font.ColorIndex = 3       Else         Tb.Font.ColorIndex = xlAutomatic       End If     End If Next N Err_Notfind: MsgBox "「Text Box " & CStr(N) & " 」が存在しません。" & _     " 終了します。", vbExclamation Set Tb = Nothing End Sub  

その他の回答 (9)

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.10

> ( [ ] ) は出現する。 この場合、"(" と ")" には色を付けないようにしています。 (あ[い]う)は考慮していません。無しですよね。 実行前は、全て黒色であるか、または規定の色とします。 一旦着けた色は、括弧内以外は元に戻しません。 こんなのでどうでしょうか。 あとは適当にいじってください。 Sub Strcoloring() Dim Tb As TextBox Dim N As Integer Dim Coi As Variant Dim CMode As Boolean Coi = xlAutomatic On Error Resume Next For N = 1 To 200   Set Tb = ActiveSheet.TextBoxes("Text Box " & CStr(N))   If Err.Number <> 0 Then GoTo err_noobj     If StrConv(Left(Trim(Tb.Text), 1), vbNarrow) = "(" Then       CMode = True       Coi = 3       If StrConv(Left(Trim(ActiveSheet.TextBoxes("Text Box " & _         CStr(N) + 1).Text), 1), vbNarrow) <> "[" Then         Tb.Font.ColorIndex = Coi       Else         Tb.Font.ColorIndex = xlAutomatic       End If     ElseIf StrConv(Left(Trim(Tb.Text), 1), vbNarrow) = ")" Then       Tb.Font.ColorIndex = Coi       CMode = False       Coi = xlAutomatic     ElseIf StrConv(Left(Trim(Tb.Text), 1), vbNarrow) = "[" Then       Coi = 5       Tb.Font.ColorIndex = Coi       CMode = True     ElseIf StrConv(Left(Trim(Tb.Text), 1), vbNarrow) = "]" Then       Tb.Font.ColorIndex = Coi       CMode = False       Coi = xlAutomatic     Else       If CMode = True Then         Tb.Font.ColorIndex = Coi       End If     End If err_noobj: Err.Number = 0 Next N Set Tb = Nothing End Sub

koala3
質問者

お礼

ご回答ありがとうございました。 >> ( [ ] ) は出現する。 >この場合、"(" と ")" には色を付けないようにしています。 >(あ[い]う)は考慮していません。無しですよね。 いえ、無しではないです(笑) 普通の文では"( )" だけとか"[ ]"だけで用いないのと同じで、"( )"や"[ ]"は文字を囲うために用いていました。 ですので、文字無しで"( [ ] )"というのは出現しません。 作って頂いたものは"(あ[い]う)"のような時は "う)" の色が変わりませんので、自分で改良してみました。 Boolean を二つ用いて何とかうまくいきました。

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.9

> ようするに、文字を並べて絵を作っているという感じです。 なるほどね。 ちょっと、シツコイと言われそうですが、それだったらセルを使っても出来ると 思います。 ただ、テキストボックスのように個々の配置が、バラバラには出来ませんが・・・ 規則正しく並んでいるときは、セルでもいいと思いますが、どうなんでしょう。

koala3
質問者

補足

>規則正しく並んでいるときは、セルでもいいと思いますが、どうなんでしょう。 セルでは表示不可能な形になっています。

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.8

> (テキストボックスの数は実際は1000を超えています) しかし、追加質問を考える前に、テキストボックスをこんなに大量に使って、 こんなことするより方法がないのかと、ちょっと考えてしまいますね。 セルをVBAで操作するのはダメなんですかね。 用途が解らないから、ちょっと疑問でぇ~す。

koala3
質問者

お礼

ご質問にお答えします。 >セルをVBAで操作するのはダメなんですかね。 ようするに、文字を並べて絵を作っているという感じです。

koala3
質問者

補足

No7での説明が不十分でした。 ( ) [ ] は必ず対で用いています。

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.7

Tb.Font.ColorIndex = xlAutomatic の行は、2つありますが、 まず、最初の方が無いと・・・ 今、(abc)de があって、実行結果"(abc)" が、赤になったとします。 今度は ( を "x"等に変更して実行すると、"xabc" までは黒に戻りますが、 残った ) が 赤のままになると思います。 2つ目も同じようにテキストボックスの内容を変更したときに対応させるため には、必要なのです。 そうでないと一旦、括弧の中で赤になったものをデータを変更して括弧の外へ 出たときに、黒に戻らないのです。 まぁ、その辺の機能が不要であれば、削除してもいいのですが、動作は同じでは ありません。 今の所、気が付かないだけと思います。 一応、あらゆる事態を想定しましたので・・・気の使い過ぎ??

koala3
質問者

お礼

ご回答ありがとうございました。 >今度は ( を "x"等に変更して実行すると、"xabc" までは黒に戻りますが、 >残った ) が 赤のままになると思います。 基本的に「今度は」はないです。 実はシート自体も何十も用意しているような状態で、一つのシートを使いまわす環境ではないです。 ですので、処理速度が速ければ速いほど助かることになります。

回答No.6

koala3さん、ja7awuさん補足ありがとうございました。 そんな所にもテキストボックスが・・・ というより私もそちらの方を普段使っていました。 VBAでという事で、コントロール ツールボックスしか 頭にありませんでした。 おかげで何故?とおもっていた事が分かりすっきりしました。 質問者の質問ではないのに補足頂きありがとうございました。

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.5

taisuke555 さんへ 原因は、コントロール ツールボックスのテキストボックスを使用した からですね。 200個もあるのですから、普通は操作性(配置等ほとんど)が悪いので使わない と思いますよ。 オートシェーブを使うのが一般的かと・・・? ツールボックスのテキストボックスにすれば、そのコードで、間違いなく 動作しています。 koala3 さんへ 追加質問、ちょっと待っててね。

koala3
質問者

お礼

ご回答ありがとうございました。 >追加質問、ちょっと待っててね。 続けざまに質問してしまって申し訳なく思ってます。 あと、気づいたことですが、 Else Tb.Font.ColorIndex = xlAutomatic 上記を削除して試してみると、結果は同じでかつ処理速度が格段に早くなりました。 (テキストボックスの数は実際は1000を超えています)

回答No.4

#2です。 やっぱり、できませんでしたか。(私のではこれで動くのですが・・・) 私の方では、#1さんのコードが実行できなかったので、 もしかしたらとは思いましたが・・・ 私の環境は、Windows98 Excel2000 コントロール ツールボックスのテキストボックスを使用しています。 koala3さんはどうですか? (#1さんの回答でできたみたいなので、私のは無視して頂いていいのですが、  できたら今後の為に教えてください。) ja7awuさん、もし何か知っていたら教えてください。 とにかく、間違えたコードを載せてしまい、申し訳ありません。

koala3
質問者

お礼

ご回答ありがとうございました。 >コントロール ツールボックスのテキストボックスを使用しています。 これが原因のようです。 こちらの環境は、図形描画のテキストボックスでした。

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.3

No.1 ですが・・・ ちょっと書き漏らしで~す。 各テキストボックスが1文字ということで、小さいのでリターンコードが 入っていても気が付かないことがあると思いますので、括弧閉じ ")" を検出 する11行目も "(" と同様に先頭の1文字を検出するように下記のようにした方が、 いいと思いますので修正してください。 実際やってみると結構「リターンコード」が入っていますね。 11行目の修正 ElseIf StrConv(Trim(Tb.Text), vbNarrow) = ")" Then     ↓ ElseIf StrConv(Left(Trim(Tb.Text), 1), vbNarrow) = ")" Then あと、テキストボックスの番号に欠番があっても無視する場合は、次のコードを 使ってください。 Sub Strcoloring() Dim Tb As TextBox Dim N As Integer Dim CMode As Boolean On Error Resume Next For N = 1 To 200   Set Tb = ActiveSheet.TextBoxes("Text Box " & CStr(N))   If Err.Number <> 0 Then GoTo err_noobj     If StrConv(Left(Trim(Tb.Text), 1), vbNarrow) = "(" Then       CMode = True       Tb.Font.ColorIndex = 3     ElseIf StrConv(Left(Trim(Tb.Text), 1), vbNarrow) = ")" Then       If CMode = True Then         Tb.Font.ColorIndex = 3         CMode = False       Else         Tb.Font.ColorIndex = xlAutomatic       End If     Else       If CMode = True Then         Tb.Font.ColorIndex = 3       Else         Tb.Font.ColorIndex = xlAutomatic       End If     End If err_noobj: Err.Number = 0 Next N Set Tb = Nothing End Sub

koala3
質問者

お礼

ご回答ありがとうございました。 うまくいきました。 もし以下のように処理内容を追加したら、どんな感じになるでしょうか。 あいうえ[おかき]くけ(こさしす)せそたち[つて]となにぬねの(はひふ)へほ 上記の場合、(こさしす)(はひふ)  は赤に          [おかき][つて]    は青に          それ以外       は黒に        ( [ ) ] ・ [ ( ) ]のようなケースは出現しないが、( [ ] ) は出現する。この場合は[ ] 及びその中の文字は青になる。

回答No.2

#1の方と似たような感じですが 私とは、設定するプロパティが違っていたので 一応、私も記載しておきます。 同じでも芸が無いので、テキストボックスが無くても 続行できるようにしてみました。(EXCEL2000) Sub test()   Dim Tx As Object   Dim wColor As Long   Dim i As Integer   On Error GoTo wErr   '初期値は黒   wColor = &H0   For i = 1 To 200     Set Tx = ActiveSheet.OLEObjects("TextBox" & CStr(i)).Object     If (Not Tx Is Nothing) Then       '(ならば赤色をセット       If (StrConv(Tx.Value, vbNarrow) = "(") Then         wColor = &HFF       End If       'テキストボックスのForeColorを変更する       Tx.ForeColor = wColor       ')ならば黒色をセット       If (StrConv(Tx.Value, vbNarrow) = ")") Then         wColor = &H0       End If     End If   Next i   Set Tx = Nothing   Exit Sub wErr:   If (MsgBox("TextBox" & CStr(i) & "が見つかりません" & Chr(13) & "作業を続けますか?", vbYesNo) = vbYes) Then     Resume Next   End If End Sub 1文字という事でしたのでその部分処理していませんが、 必要ならば追加してください。

koala3
質問者

お礼

ご回答ありがとうございました。 実行させてもらいましたが、いきなり「TextBox1が見つかりません」というメッセージが出現して、作業を続けると以後メッセージが出続けるという状況でした。

関連するQ&A

  • エクセルVBAについて質問です。

    エクセルVBAについて質問です。 シート1のユーザーフォームにコンボボックスとテキストボックスが各1つずつ、 シート2のA列には1行目から順に「あ」「い」「う」と文字が入っていて、B列には「1」「2」「3」と値が入っています。 コンボボックスのリストにはシート2のA列の文字が選択できる状態にあります。 この状態で、例えばコンボボックスで「い」を選んだら、テキストボックスに自動的に「2」と入る、というように、コンボボックスのリストの中から任意の文字を選択したときに、テキストボックスにB列の値が入るようにするにはどのようにすればいいのでしょうか?よろしくお願いします。

  • エクセルVBAのフォームの表示する文字を見やすくしたい

    エクセルVBAでフォームを作りました。 使いやすくするために テキストボックスの文字を大きくしたり、 大きなテキストボックスでは文字を折り返し表示をさせたりしたいのですが、どうすればいいかわかりません。 教えてください。

  • Excelのセル内改行について

    Excelのセル内に改行を含むデータが入力されています。 Excelでコピー&ペーストを行えば問題ないのですが、 メモ帳にペーストすると改行が ↑ と表示されてしまい、 1行になってしまいます。 メモ帳にペーストしてもセル内で改行されているように 改行したままで貼り付けを行うことは可能でしょうか? Sheet1:A1 あいうえおかきくけこ さしすせそ たちつてとなにぬねのはひふへほ メモ帳:貼り付け あいうえおかきくけこ↑さしすせそ↑たちつてとなにぬねのはひふへほ

  • EXCEL VBAについて

    EXCEL VBAに詳しい方よろしくお願いいたします ユーザーからフォルダー指定してもらい そのフォルダー内に入っているすべてのブック、すべてのシートの検索、 (シート内にオートシェイプの中に文字を入れたものもアリ。検索対象。) そして、その検索にヒットしたシート名とブック名を別のテキストファイルに吐き出す。 それとは別に検索に引っかかった文字を青に置き換える(EXCELシート内)事は可能でしょうか? 文字の色は変わるのですがオートシェイプ内の色が変えられません。 何時間がんばりましたが、経験不足のためどうもうまくいきません。 どなたか親切な方、お教えいただけたら幸いです。

  • vba ie操作 テキストボックスをアクティブに

    VBAで三井住友銀行にログインしたいのですが、 どうやらマウスで一度、画面をクリックして、色を反転させないとログインボタンを押下しても文字が入力されたと認識されないようです。 「契約者番号」の部分のテキストボックスが灰色になっていますが、 これは点店番号を入れると灰色になります。 VBAで店番号のテキストボックスに値を入れても、「契約者番号」のテキストは灰色になりません。 こういう場合、vbaでテキストボックスをアクティブにする方法はありますか?

  • excel VBA

    昨日VBAをさわり始めた超初心者です。質問ですが、excelからパワーポイントのシート内を削除の仕方と、テキスト追加方法を教えて下さい。パワーポイントは既存であり、テキスト内容はexcelのセル内の文字で、変数に入れることができました。まだまだ無知なので、ご教授下さいますようよろしくお願いします。

  • エクセル VBA フォーム設定について

    いつもお世話になっています。 エクセル VBAでユーザーフォームについて教えてください。 あるシートのデータをフォームに読み込み、違うシートにそのデータを書き込んでいます。元データの列順と書き込むシートの列順が違うので、VBAで設定して使っています。 書き込みはうまくいっています。ただ、書き込む際にフォーム上で少しデータを修正して書き込みを行うのですが、編集したいフォーム上のテキストボックスをクリックすると、データの最後のほうにカーソルが飛んでしまいます。 テキストボックスをできるだけ大きくして対応していますが、限度があります。テキストボックスをクリックした際にデータの最後(文字データで言うと文章の最後を表示してしまう)まで動かずに、クリックしても先頭のままになるようにするにはどうすればいいのでしょうか。 同じように、コンボボックスもクリックするとリストの最後から表示されます。リストの先頭から表示させる方法を教えてください。

  • エクセルのVBAを使用したときのセル範囲について

    エクセルでVBAを勉強しています。(初歩です。初心者です。) マクロを記述したあと、エクセルシートに表示しますよね。 たとえば、今度は、Visual Basic Editorを使って、「上から3行目が赤」にしていたものを「上から5行目を青にする」という問題があったとします。Visual Basic Editor上でどうやったら、その指定しているセル範囲がわかるのでしょうか?つまり、上から3行を上から5行目にするといことです。 また、Visual Basic Editor上では、「色」を番号で表示しますが、これは覚えておく必要があるのでしょうか?たとえば「赤」は3番とか・・・・。 初心者ですのでご了承ください。

  • Excelのテキストボックスについて

    Excelで文字を打つ時に、テキストボックスを使うのですが、なぜか打ったものを印刷プレビューで見るとズレがあります。 具体的に言うと、文章が自動的に改行されますが、普通に打った時に比べて、印刷プレビューはどうしても早めに改行されてしまっています。 -------------------------------------- |あいうえおかきくけこさしすせそたちつてとさし|     作業画面 --------------------------------------            ↓ -------------------------------- |あいうえおかきくけこさしすせそたちつ| |てとさし                    |       印刷プレビュー -------------------------------- といった感じです。いろいろ試してみましたが、一向に解決方法がわからないので、なにとぞよろしくお願いします。 (そもそもwordを使えよ。といわれそうですがなにとぞよろしくお願いします。ちなみにExcel2003を使っています。)

  • エクセルVBAについて

    エクセルVBA についての質問です。 この問題の答えを教えて頂きたいです。 次の条件を満たすプロシージャを作成してください。 1、ダイアログボックスに最初に市外局番なしの電話番号を入力すると、 先頭に小文字の「a]をつけた電話番号が自動的に、セルB3に入力される。 2、ダイアログボックスでキャンセルを押すと、 電話番号を入力してください、というメッセージボックスが表示される。 3、セルB3の値が「a1234567890」のとき、セルB3が赤の太字になり、 さらにセルC3に「検証用です」と入力される。 この問題の正解となる式を教えてください。 どこが間違っているかがわからず困っております。 よろしくお願いいたします。

専門家に質問してみよう