- ベストアンサー
(VBA)TextBox記入文字を分かりやすく表示
- みんなの回答 (32)
- 専門家の回答
質問者が選んだベストアンサー
> コードを追加して思っていた事が出来るようになりました。 よかったです。うまくいくかなとちょっとドキドキしてました。 一点忘れてました Change()なので Application.EnableEvents = False Application.EnableEvents = True で囲っておかないと、問題が起こる可能性がありますので以下に変更しておいてください。 Private Sub Target_Change() Application.EnableEvents = False With Target If InStr(.Text, " ") Then .BackColor = RGB(176, 196, 222) Else .BackColor = &H80000005 End If End With Application.EnableEvents = True End Sub クラスはエクセルでは殆ど使う事は無いと思いますが、ひな形みたいなものだと思うといいかもしれません。
その他の回答 (31)
- kkkkkm
- ベストアンサー率66% (1721/2591)
Fontsizeが12で 半角スペースが2個までとして Image1とImage2が半角スペースの所だけに表示されるとか とりあえず半角スペースの位置と有無はわかります。 最初の位置合わせが面倒ですが Private Sub TextBox1_Change() Dim i As Long i = 0 i = InStr(Me.TextBox1.Text, " ") If i <> 0 Then Me.Image1.Visible = True Me.Image1.Left = 58 + (i * 6) Me.Image1.Width = 6 If InStr(i + 1, Me.TextBox1.Text, " ") > 0 Then Me.Image2.Visible = True Me.Image2.Left = 60 + (InStr(i + 1, Me.TextBox1.Text, " ") * 6) Me.Image2.Width = 6 Else Me.Image2.Visible = False End If Else Me.Image1.Visible = False Me.Image2.Visible = False End If End Sub
- kkkkkm
- ベストアンサー率66% (1721/2591)
> TextBoxに記入した文字(文字列)を見やすくするアイデアを求めています。 人によって見やすいとかは色々だと思いますがFontのサイズを大きくし、太字にして下線とかつけたら半角スペースとかも判断しやすくなるかもですね。 あと、半角スペースがあったらバックをグリーンにするとか(笑) Private Sub TextBox1_Change() If InStr(Me.TextBox1.Text, " ") Then Me.TextBox1.BackColor = vbGreen Else Me.TextBox1.BackColor = &H80000005 End If End Sub
- kkkkkm
- ベストアンサー率66% (1721/2591)
もしかして「 - 」が入力されたらバックの画像を出す、無ければ出さないとか。 Private Sub TextBox1_Change() If InStr(Me.TextBox1.Text, " - ") Then Me.Image1.Visible = True Else Me.Image1.Visible = False End If End Sub
お礼
>セキュリティ関連かもしれませんね。 個人的には、Defenderしか利用していませんが 試しに、リアルタイム保護をオフにして試してみましたが 問題のアイコンは非表示のままでした。 >もしかして「 - 」が入力されたらバックの画像を出す、無ければ出さないとか。 いいえ。 そう言う事では無く、TextBoxに記入した文字(文字列)を見やすくするアイデアを求めています。 TextBoxの記入する文字列は、最大3文字を想定していて 半角スペース+半角ハイフォン+半角スペースなど ちょっと見た目では、半角スペースは判断が付きにくい場合も想定しています。 単純に1文字で半角のハイフォンだけの場合とかもあります。 どうもアイコンが出ないのは、私のPCの環境にあるようなので諦めます。 (多分、導入して個人用マクロ ブック (personal.xlsb)やアドイン等が 関係していると思います) せっかく、アイデアを出していただき解決しなかったのは残念ですが お付き合い願い感謝いたします。
- kkkkkm
- ベストアンサー率66% (1721/2591)
> やはり、Microsoft InkEdit Contorol用にアイコンが出ないのは > 普通ではないようですね。 セキュリティ関連かもしれませんね。検索してみましたが出ないという情報は見つかりませんでした。 > なお、ユーザーフォームでコードを記載する方法ですが、 > 今回kkkkkmさんの説明にある内容(事項)は理解できています。 となると、何が不明だったのかがわからないです。
- HohoPapa
- ベストアンサー率65% (455/693)
最初の質問文の冒頭に記述された >UserFormにTextBoxを配置した場合、 と コメントされた >個人的にユーザーフォームを利用しないで >標準モジュールに記載したコードのみを利用してきたので との兼ね合いがよくわかりません。 UserFormは使う、 UserFormに配置したコントロールは標準モジュール内に記述するコードで行うという話であれば、 後記のようなコードとなります。 https://imgur.com/hRZ8Jzk この画像で示す①は、 「3文字(スペース、ハイフォン、スペース)」を埋めるTextBoxで 名前は、TextBox1です。 >LineTate1~4、LineTop、Linebottomは、3つのTextBox これらは、3つではなく、6つのTextBoxです。 見掛け上、罫線擬きとなるTextBoxです。 それぞれ、 配置場所や大きさは、適当でかまいません。 後記コードで、表示位置、高さ、幅、長さを設定していますから。 Sub Sample1() 'UserForm1のコントロールを初期設定 With UserForm1 .LineTate1.Width = 2 .LineTate2.Width = 2 .LineTate3.Width = 2 .LineTate4.Width = 2 .LineTate1.Top = .TextBox1.Top .LineTate2.Top = .TextBox1.Top .LineTate3.Top = .TextBox1.Top .LineTate4.Top = .TextBox1.Top .LineTate1.Height = .TextBox1.Height .LineTate2.Height = .TextBox1.Height .LineTate3.Height = .TextBox1.Height .LineTate4.Height = .TextBox1.Height .LineTate1.Left = .TextBox1.Left .LineTate2.Left = .TextBox1.Left + .TextBox1.Width / 3 * 1 .LineTate3.Left = .TextBox1.Left + .TextBox1.Width / 3 * 2 .LineTate4.Left = .TextBox1.Left + .TextBox1.Width .LineTop.Height = 2 .LineTop.Top = .TextBox1.Top .LineTop.Left = .TextBox1.Left .LineTop.Width = .TextBox1.Width .LineBottom.Height = 2 .LineBottom.Top = .TextBox1.Top + .TextBox1.Height .LineBottom.Left = .TextBox1.Left .LineBottom.Width = .TextBox1.Width .Show End With End Sub Sub Sample2() '罫線を非表示 With UserForm1 .LineTate1.Visible = False .LineTate2.Visible = False .LineTate3.Visible = False .LineTate4.Visible = False .LineTop.Visible = False .LineBottom.Visible = False End With End Sub Sub Sample3() '罫線を表示 With UserForm1 .LineTate1.Visible = True .LineTate2.Visible = True .LineTate3.Visible = True .LineTate4.Visible = True .LineTop.Visible = True .LineBottom.Visible = True End With End Sub
お礼
HohoPapaさん、疑問点に関して追加のアドバイスありがとうございます。 >コメントされた >>個人的にユーザーフォームを利用しないで >>標準モジュールに記載したコードのみを利用してきたので >との兼ね合いがよくわかりません。 素人ながらVBAで利用するのは、標準モジュールのみで ユーザーフォームは、今まで全くと利用してきませんでした。 今回ユーザーフォームならシート上に画像ソフトのレイヤーみたいに 自由な位置に表示できるので今検討中の他のVBAで利用できないかと考えています。 ユーザーフォームは、さわってこなかったので手探り状態です。 ①UserFormに配置したコントロールは標準モジュール内に記述するコードで行うのが良いのか? それとも ②UserFormに配置したコントロールはユーザーフォーム内のコードで処理すべきか? この辺の情報も知識も現在は皆無な状態です。 >UserFormに配置したコントロールは標準モジュール内に記述するコードで行う 今回①が前提ですが 思うにド素人が最初からかなりレベルの高そうな事をアドバイスれているようで 付いていける判りませんが、頑張ってみます。 少しお時間をください。
補足
HohoPapaさん、すこしずつ理解できてきました。 一番最初にいただいたコードが ②UserFormに配置したコントロールをユーザーフォーム内のコードで処理したケース ですね。 おかげさまで ①UserFormに配置したコントロールは標準モジュール内に記述するコードで行う場合 ②UserFormに配置したコントロールはユーザーフォーム内のコード処理した場合 での最終形が見えました。 最終形 https://imgur.com/rphshOe ここまでは、たどり着きましたが 新たな疑問が出ました。 現在TextBoxのフォントサイズを12としているのが原因だと思いますが 3個に区切ったマス毎に1文字ずつフィットさせるには フォントサイズをマス目に合うように目で確認しながら調整する方法しかありませんか?
- kkkkkm
- ベストアンサー率66% (1721/2591)
たとえばの例です。 フォームにテキストボックスを作成してとりあえず左端の画像だけをテキストボックスの下にします。テキストボックスのFontをMSゴシックのサイズ12にします で、テキストボックスをダブルクリックして 画像は.Image1という名前だとします。画像をダルクリックしてできた Private Sub Image1_Click() End Sub のところからコピペすると間違いがありません。 Private Sub TextBox1_Change() Me.Image1.Width = Len(Me.TextBox1) * 7 End Sub とすれば入力した文字数分画像の幅が追従します。 同じような制御を後の二つの画像にも施せば希望のような感じになるのでしょうか。
- kkkkkm
- ベストアンサー率66% (1721/2591)
> Microsoft InkEdit Contorol 1.0 を追加しても > 私の場合、ツールボックスに以下のURLにある > それらしきアイコンが現れません。 変ですね・・・Microsoft InkEdit Contorolの左の四角をクリックして四角の中に×が入ってますよね。 1.0ってエクセルで見えるのでしょうか。Visual Studioではライブラリまで見ると見えたのですが・・・。 ただこのコントロールを使うとフォームを開いた時とかVBAを編集した時に 「このアプリケーションは、安全でない可能性のあるActiveXコントロールを初期化しようとしています。・・・」 というメッセージが出てしまいます。最初だけ出るのかと思ったら毎回出ました。 それでよければになりますね。 > 標準モジュールに記載したコードを利用してきたので > 記載されたコードの関連が全くつかめていません。 > > > Private Sub InkEdit1_Change() ユーザーフォームのコントロールはすべてなにがしかのイベントをもっています。 シートモジュールで Worksheet_Change というイベントがあるのはご存じだと思いますが、そいうのがコントロールごとにあるということです。 テキストボックスを作成してダブルクリックすると Private Sub TextBox1_Change() End Sub がフォームモジュールにできます。 その時にエディタの上にあるドロップダウンでそのコントロールのイベントが一覧が見れます。 > UserForm1.InkEdit1.Text 該当のフォームモジュール以外からフォームのコントロールの値などを参照したい場合は(UserForm1とした場合)上記のように記載して参照します。 該当のフォームモジュールに記載するのでしたら Me.TextBox1.Text で参照できます。 基本的にユーザーフォームで何かをするときはボタンを押したりして動作を始めると思いますから、ほとんどは該当のフォームモジュールにイベントとしてコードを記載すると思いますよ。 NuboChanさん自身がそのあたり不明だったので質問の添付画像のようなことができないと思ったのだとしたら、たとえばバックの色の画像を文字の有無のよって表示非表示を切り替えるとかはサイズが一定なら簡単だと思いますよ。
補足
>1.0ってエクセルで見えるのでしょうか。 この「見えてる」の意味が良くわかりませんが、 office_2021のVBAでツール>参照設定の中に Microsoft InkEdit Contorol 1.0 があります。 (ver無しの「Microsoft InkEdit Contorol」 はありません。) 以下のURLと同じ https://colab.research.google.com/drive/11sza7vcBJU_sL-diVOLXlMMEUEazzsTH やはり、Microsoft InkEdit Contorol用にアイコンが出ないのは 普通ではないようですね。 これが解決しないと現状先に進めそうにありません。 なお、ユーザーフォームでコードを記載する方法ですが、 今回kkkkkmさんの説明にある内容(事項)は理解できています。
- HohoPapa
- ベストアンサー率65% (455/693)
>標準モジュールで値を利用 >表示だけを見せるは希望しません これがどのような要求なのかよくわかりませんが TextBoxであることが必須で、かつ、 デフォルトで用意しているコントロールしか使わないで。 という条件であれば、 TextBoxの高さを1~2にすれば横線になり TextBoxの幅を1~2にすれば縦線になりますので 後記コードのような使い方をすれば、 文字列の埋まるTextBoxに罫線を引くことができます。 言わずもがなですが、 LineTate1~4、LineTop、Linebottomは、それぞれ、TextBoxです。 Option Explicit Private Sub BtnLineOff_Click() LineTate1.Visible = False LineTate2.Visible = False LineTate3.Visible = False LineTate4.Visible = False LineTop.Visible = False Linebottom.Visible = False End Sub Private Sub BtnLineOn_Click() LineTate1.Visible = True LineTate2.Visible = True LineTate3.Visible = True LineTate4.Visible = True LineTop.Visible = True Linebottom.Visible = True End Sub Private Sub BtnLineSet_Click() LineTate1.Width = 2 LineTate2.Width = 2 LineTate3.Width = 2 LineTate4.Width = 2 LineTate1.Top = TextBox1.Top LineTate2.Top = TextBox1.Top LineTate3.Top = TextBox1.Top LineTate4.Top = TextBox1.Top LineTate1.Height = TextBox1.Height LineTate2.Height = TextBox1.Height LineTate3.Height = TextBox1.Height LineTate4.Height = TextBox1.Height LineTate1.Left = TextBox1.Left LineTate2.Left = TextBox1.Left + TextBox1.Width / 3 * 1 LineTate3.Left = TextBox1.Left + TextBox1.Width / 3 * 2 LineTate4.Left = TextBox1.Left + TextBox1.Width LineTop.Height = 2 LineTop.Top = TextBox1.Top LineTop.Left = TextBox1.Left LineTop.Width = TextBox1.Width Linebottom.Height = 2 Linebottom.Top = TextBox1.Top + TextBox1.Height Linebottom.Left = TextBox1.Left Linebottom.Width = TextBox1.Width End Sub
お礼
HohoPapaさん、アドバイスありがとうございます。 個人的にユーザーフォームを利用しないで 標準モジュールに記載したコードのみを利用してきたので 記載されたユーザーフォームのコードが理解できません。 >言わずもがなですが、 この辺もあやふやです。 参考のユーザーフォームの画像には以下が配置されている理解ですよね ? LineSet、LineOn,LineOff の3つのコマンドボタン LineTate1~4、LineTop、Linebottomは、TextBoxの3つのTextBox LineTopは、添付した画像で理解できたのですが 添付画像の 他のLineTate1~4が②で Linebottomが①と言う理解 ? 参考画像 https://imgur.com/hRZ8Jzk マクロを実行できればそれぞれがどういう挙動をするか理解できるのでしょうが 現状、実行以前の問題でつまづいているので停滞状態です。 他のLineTate1~4が②、Linebottomが①とすれば それぞれ全く同じようにユーザーフォームに作画する必要がありますか? 初歩的なところでの質問ですがアドバイスお願いします。
- kkkkkm
- ベストアンサー率66% (1721/2591)
「-」の前後で色を変えたい場合はたとえば(「-」とその前だけ変更します) Changeイベントで Private Sub InkEdit1_Change() Dim i As Long With InkEdit1 .Font.Size = 10 i = InStr(.Text, "-") If i <> 0 Then .SelStart = 0 .SelLength = i - 1 .SelColor = vbGreen .SelStart = i - 1 .SelLength = 1 .SelColor = vbRed .SelFontSize = 15 .SelBold = True End If .SelStart = Len(.Text) + 1 End With End Sub
お礼
kkkkkmさん、追加のアドバイスありがとうございます。 個人的にユザーフォームを利用しないで 標準モジュールに記載したコードを利用してきたので 記載されたコードの関連が全くつかめていません。 Private Sub InkEdit1_Change() UserForm1.InkEdit1.Text ユーザーフォームには、TextBoxではなくツールボックスから InkEdit Contorolを利用するのだと思うのですが Microsoft InkEdit Contorol 1.0 を追加しても 私の場合、ツールボックスに以下のURLにある それらしきアイコンが現れません。 https://jizilog.com/vba-inkeditop どこかに思い間違いがあると考えられますが 現在思考が停止状態です。 ツールボックスの参考画像 https://imgur.com/CyUVZCF
- kkkkkm
- ベストアンサー率66% (1721/2591)
標準モジュールで値を利用するには UserForm1.InkEdit1.Text で取得できます。
お礼
追加のコードをありがとうございます。 今回は、これで失礼します。