テキストボックスの色変更

このQ&Aのポイント
  • テキストボックスの色と文字色を自動で変更するためのVBAコードの作成方法を教えてください。
  • VBAコードを使用して、特定の条件に基づいてテキストボックスの色と文字色を自動で変更する方法を教えてください。
  • VBAを使用して、テキストボックスの色と文字色を変更するためのプログラムを作成し、条件に応じた色の設定方法を教えてください。
回答を見る
  • ベストアンサー

テキストボックスの色変更

自動でテクストボックスの色変更をしたいのですが、 前回こちらにて質問をさせていただき大変助かったのですが、 さらに、問題に突き当たりました。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("R8: S341 ")) Is Nothing Then Exit Sub If Cells(Target.Row, "R").Value < -10 Then c = 10 Else Select Case Cells(Target.Row, "S").Value Case Is > -89 c = 17 Case Is < -100 c = 10 Case Else c = 12 End Select End If With Sheets("sheets2").Shapes("テキスト " & Target.Row) .Line.ForeColor.SchemeColor = c .TextFrame.Characters.Font.ColorIndex = c - 7 End With End Sub にて、色と文字色の変更はできたのですが、 R列、S列を関数で読み込んでくると自動では変わりません。 手動で打ち込むと変わるのですが 一緒に文字サイズの指定もできるのでしょうか? 宜しくお願いいたします。

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

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.5

考えたんですが、3つ飛ばしでやるということはテキストボックスの番号も3つ飛ばしで作るんですよね。これ面倒じゃないですか? いっそテキストボックスは1~112と連番で作って、参照するセルを、 テキストボックス 1→8行目 テキストボックス 2→11行目 テキストボックス 3→14行目 にしたらいかがでしょう? n = (i - 1) * 3 + 8 で、1から連番の i を、8から3つおきの n に変換してみます。 ためしていませんがこんな感じかな。 Private Sub Worksheet_Calculate() For i = 1 To 112 n = (i - 1) * 3 + 8 If Cells(n, "R").Value < -10 Then c = 10 Else Select Case Cells(n, "S").Value Case Is > -89 c = 17 Case Is < -100 c = 10 Case Else c = 12 End Select End If With Sheets("Sheet2").Shapes("テキスト " & i) .Line.ForeColor.SchemeColor = c .TextFrame.Characters.Font.ColorIndex = c - 7 End With Next i End Sub

k-kikuchi
質問者

お礼

有難う御座います。 これで今後の作業が大変楽になります。 最後と言いながらもうひとつ質問です。 現在テキストボックスはT列を書式で参照しています。 R・Sどちらかが0ならテキストボックスに「NG」と表示、 それ以外の場合は、Tの数値を表示するようにしたいのですが、 可能でしょうか? テキストボックスの枠・文字は赤にしたいのです。

その他の回答 (5)

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.6

> 現在テキストボックスはT列を書式で参照しています。 「書式で参照」という意味がわかりません。 T列のセルの値を=で参照しているんじゃないんですか? > R・Sどちらかが0ならテキストボックスに「NG」と表示、 > それ以外の場合は、Tの数値を表示するようにしたいのですが、 それなら、Tの数値をR・Sどちらかが0なら「NG」となるように数式を組めばいいのではないですか?マクロでテキストボックスの参照を変えようとするとまた作動時間が増えますよ。T列の数値を数式に変えるのがやっかいなら、別の列にR・Sどちらかが0なら「NG」そうでないならTの数値をもってくるような式をいれてそのセルを参照させればいいのでは? テキストボックスの線や文字の色の変更方法はもうお分かりですよね。

k-kikuchi
質問者

お礼

申し訳ありません。 一応、いろいろと試してみたのですが、 わかりませんでした。 現在、Tに =IF(D8="","",IF(Q8=""," "&G8&" "&S8&"/"&R8,"["&Q8&"]"&G8&" "&S8&"/"&R8)) と、数式が入っています。 3段に分かれている状態です。 いろいろな場所に IF(R8=0,"NG") を入れてみましたが、うまくいきません。 宜しければ、ご教授いただけませんでしょうか?

k-kikuchi
質問者

補足

有難う御座いました。 色々と悩みましたがなんとかなりました。 素人の質問に付き合って頂き感謝しております。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.4

For i = 8 To 341 を For i = 8 To 341 Step 3 に変えてみてください。 3個づつ飛ばすことになります。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

> 実行時エラー'2147024809(80070057); > 指定したアイテムがみつかりません。 > With Sheets("Sheet2").Shapes("テキスト " & i) > がやはり黄色く塗りつぶされています。 "テキスト " & i の i には8~341の数値が代入され、テキスト 8からテキスト 341を指定しています。 指定したアイテムがみつかりませんということは、該当する番号のテキストボックスがたとえひとつでも見当たらないと、そういうエラーになります。 コードが黄色く塗りつぶされているとき、そこのiにカーソルを持っていくと何番かわかると思います。

k-kikuchi
質問者

お礼

有難う御座います。 なんとか動かすことが、できました。 これで最後にできればいいのですが、 実際のR列・S列は3つのセルが結合されています。 R8・R9・R10で1つ、次はR11・R12・R13で1つになっています。 S列も同じです。 テキストボックスを9・10も作っておけばいいのですが、 結構面倒なので、3個づつ飛ばしてといったことはできるのでしょうか? 宜しくお願いいたします。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

> With Sheets("sheets2").Shapes("テキスト " & i) > の部分が黄色く塗りつぶされています。 だからシート名が違うのでは? テスト用で、シートの名前を変えていないのならSheets("Sheet2")じゃないんですか?(sheets2ではsが余分じゃないですか?)

k-kikuchi
質問者

お礼

すいません シート名、今気づきました。 書き込もうと思ったら、返事が来ていました。 すいません。 次は、違うエラーが出ました。 実行時エラー'2147024809(80070057); 指定したアイテムがみつかりません。 と表示されます。 デバッグを押すと With Sheets("Sheet2").Shapes("テキスト " & i) がやはり黄色く塗りつぶされています。 ボケボケですいません。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

http://dospara.okwave.jp/qa4702676.html の続きですね。 前回の前提がわからないと回答はつきにくいと思いますよ。 Sheet1のS列R列の数値によりSheet2のオートシェープのテキストボックスの色を変えるのですね? で、Sheet2のオートシェープのテキストボックスは8~341まであって、この番号が、それぞれSheet1のS列R列の行番号に一致しているのですよね? > R列、S列を関数で読み込んでくると自動では変わりません。 R列、S列の数値をどこかのセルが関数で読み込むのではなく、R列、S列が他のセルを参照しているのですよね?正しく書いてください。 以上の前提で回答します。 Worksheet_Changeイベントですから変わらなくて当然です。 前回の回答はSheet1に手動で打ち込み、Sheet2のテキストボックスに反映させるのですから計算式で読み込んだだけではWorksheet_Changeイベントは生じません。 関数で持ってきた結果を反映させたいなら、Worksheet_Calculateイベントを使うことになります。 ただし、この場合、Targetという概念がなくなるのでSheet1に計算が生じた場合、Sheet2のすべてのテキストボックスにつき一個一個、Sheet1のR列、S列の数値をみていくことになり多少時間がかかります。 Sheet1のモジュールに以下のように記述してみてください。 Private Sub Worksheet_Calculate() For i = 8 To 341 If Cells(i, "R").Value < -10 Then c = 10 Else Select Case Cells(i, "S").Value Case Is > -89 c = 17 Case Is < -100 c = 10 Case Else c = 12 End Select End If With Sheets("sheets2").Shapes("テキスト " & i) .Line.ForeColor.SchemeColor = c .TextFrame.Characters.Font.ColorIndex = c - 7 .TextFrame.Characters.Font.Size = 10 End With Next i End Sub でも、この With Sheets("sheets2").Shapes("テキスト " & i) って、シート名は合ってますか? なお、フォントサイズも変えたいなら .TextFrame.Characters.Font.Size = 10 のようにします。

k-kikuchi
質問者

お礼

何度も有難う御座います。 試してみたのですが、エラー表示が出ます。 実行時エラー'9'; インデックスが有効範囲にありません。 と表示されます。 デバッグを押すと、 With Sheets("sheets2").Shapes("テキスト " & i) の部分が黄色く塗りつぶされています。 ためしにエクセルの新規にて、 R8のセルに =A1、S8のセルに =B1 として参照させ A1のセルに数値を入力したところこうなりました。 シート名は実際のときに変更します。 宜しくお願いいたします。

関連するQ&A

  • 2つのVBAを組み合わせる方法

    お世話になります、2つのVBAを組み合わせる方法で迷っています。 1つ目が Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, k As Long, myNum As Long If Intersect(Target, Range("C1,B9:B39")) Is Nothing Or Target.Count > 1 Then Exit Sub Application.EnableEvents = False With Target If .Column = 3 Then myNum = WorksheetFunction.Max(Range("B9:B39")) If IsDate(.Value) Then For i = 9 To 39 If Cells(i, "A").Value = "" Then Cells(i, "B").Value = "" Else Cells(i, "B") = myNum + i - 8 End If Next i End If Else i = .Row If .Value = "" Then Range(Cells(i + 1, "B"), Cells(39, "B")).ClearContents Else For k = i + 1 To 39 If Cells(k, "A").Value = "" Then Cells(k, "B").Value = "" Else Cells(k, "B") = Cells(k - 1, "B") + 1 End If Next k End If End If End With Application.EnableEvents = True End Sub です。 2つめが Private Sub Worksheet_Change(ByVal Target As Range)  Application.EnableEvents = True If Intersect(Target, Range("R8:R38")) Is Nothing Then Exit Sub Application.EnableEvents = False Range(Cells(Target.Row, 18), Cells(39, 18)).Value = Target.Value Application.EnableEvents = True End Sub です。2つのPrivate Sub Worksheet_Change(ByVal Target As Range)イベントのVBAですが、どのようにして組み合わせれば良いのでしょうか?

  • ワークシートのChangeイベントについて

    シート1のA1セルの値を変更したらシート2のA1・A2・A3と変更内容を順に記録するような以下のようなコードがありますが、うまく動作しません。問題点を指摘していただければ大変助かります。 【Worksheet】 Private Sub Worksheet_Change(ByVal Target As Range) Static r Dim s As Range Set s = Sheets("sheet1").Range("$a$1").Value If s Is Nothing Then Else If r = "" Then r = 1 Sheets("sheet2").Cells(r, 1) = Sheets"sheet1").Range("$a$1").Value r = r + 1 End If End Sub

  • 日付の自動表示がうまくできません。

    VBAを使って、EXCELで日付を自動表示するマクロを作ったのですが、うまく動作しません。 設定の条件は、(対象の行は6~31行目で) D列に入力があった場合、G列に日付を表示、 M列に入力があった場合、N列に日付と時間を表示 です。 Private Sub Worksheet_Change(ByVal Target As Range) Dim r As Integer, c As Integer 'r 行番号 'C 列番号 r = Target.Row c = Target.Column If Target.Count > 1 Then Exit Sub If c <> 13 Or r < 6 Or r > 31 Then End If Cells(r, c) <> "" Then If c = 13 Then Cells(r, c + 1) = Format(Now, "m/d hh:mm") Else Cells(r, c + 1) = "" End If If Target.Count > 1 Then Exit Sub If c <> 4 Or r < 6 Or r > 31 Then End If Cells(r, c) <> "" Then If c = 4 Then Cells(r, c + 3) = Format(Now, "m/d hh:mm") Else Cells(r, c + 3) = "" End If End Sub 作っているうちに、どこがおかしいのかわからなくなってしまいました。 助けて頂ければと思います。

  • 連続データのVBAの質問

    お世話になります。 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, k As Long, myNum As Long If Range("C1") <= Date - Day(Date) Then Exit Sub If Not Intersect(Target, Range("C1,B9:B39")) Is Nothing And Target.Count = 1 Then Application.EnableEvents = False With Target If .Column = 3 Then myNum = WorksheetFunction.Max(Range("B9:B39")) If IsDate(.Value) Then For i = 9 To 39 If Cells(i, "A").Value = "" Then Cells(i, "B").Value = "" Else Cells(i, "B") = myNum + i - 8 End If Next i End If Else i = .Row If .Value = "" Then Range(Cells(i + 1, "B"), Cells(39, "B")).ClearContents Else For k = i + 1 To 39 If Cells(k, "A").Value = "" Then Cells(k, "B").Value = "" Else Cells(k, "B") = Cells(k - 1, "B") + 1 End If Next k End If End If End With Application.EnableEvents = True ElseIf Not Intersect(Target, Range("R8:R38")) Is Nothing Then Application.EnableEvents = False Range(Cells(Target.Row, 18), Cells(39, 18)).Value = Target.Value Application.EnableEvents = True End If End Sub これはセルC1に年月を表記させ、そのC1セルの年月を変更した場合B9~B39のセルが自動で連続データの数字を記入し、B9~B39のどこかのセルを空白にすると、そのセル以降も空白になります。 そこで質問ですが、例えばB14の数字を消すとB15~39まで空白のセルになります。そして、B20に1と入力するとB21~39に連続データの数字が自動記入されます。 そしてC1の年月を次の月に更新した際は、B39で示された数字以降の連続データをB9に表示させるには、どうすれば良いでしょうか?

  • 連続データのVBAの質問

    お世話になります。 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, k As Long, myNum As Long If Not Intersect(Target, Range("C1,B9:B39")) Is Nothing And Target.Count = 1 Then Application.EnableEvents = False With Target If .Column = 3 Then myNum = WorksheetFunction.Max(Range("B9:B39")) If IsDate(.Value) Then For i = 9 To 39 If Cells(i, "A").Value = "" Then Cells(i, "B").Value = "" Else Cells(i, "B") = myNum + i - 8 End If Next i End If Else i = .Row If .Value = "" Then Range(Cells(i + 1, "B"), Cells(39, "B")).ClearContents Else For k = i + 1 To 39 If Cells(k, "A").Value = "" Then Cells(k, "B").Value = "" Else Cells(k, "B") = Cells(k - 1, "B") + 1 End If Next k End If End If End With Application.EnableEvents = True ElseIf Not Intersect(Target, Range("R8:R38")) Is Nothing Then Application.EnableEvents = False Range(Cells(Target.Row, 18), Cells(39, 18)).Value = Target.Value Application.EnableEvents = True End If End Sub これはセルC1に年月を表記させ、そのC1セルの年月を変更した場合B9~B39のセルが自動で連続データの数字を記入し、B9~B39のどこかのセルを空白にすると、そのセル以降も空白になります。 そしてR8~R38は、指定範囲のセルに数字を入力したら、そのセル以降の指定した範囲のセルに同じ数字を自動入力するVBAです。 そこで質問ですが、質問した現在は2013年12月ですが、日本時間の現在の年月以前の年月(今で言うと2013年11月以前)をC1に記入した場合はB9~B39の連続データの数字が切り替わらない様にするには、どうすれば宜しいでしょうか?

  • エクセルVBAで最小値を求めたいのですが

    下記はある表の最大値を求めるものですが 同様の条件で最小値を求めようと思い 「MAX」の箇所を「MIN」差し替えてできると思っていたのですが 最小値がのかわりに「0」が表示されてしまいます。 そのように修正すればよいでしょうか? private sub worksheet_change(byval Target as excel.range)  if target.cells(1) = "" then exit sub  if target.address = "$A$1" then   Range("C10:C65536").ClearContents   With Range(Cells(9 + Range("A1").Value, "C"), Cells(Range("A65536").End(xlUp).Row, "C"))    .FormulaR1C1 = "=MAX(RC2:R[" & -Range("A1").Value + 1 & "]C2,FALSE)"    .Value = .Value   End With  elseif target.address = "$E$1" then   Range("G10:G65536").ClearContents   With Range(Cells(9 + Range("E1").Value, "G"), Cells(Range("E65536").End(xlUp).Row, "G"))    .FormulaR1C1 = "=MAX(RC6:R[" & -Range("A1").Value + 1 & "]C6,FALSE)"    .Value = .Value   End With  end if end sub

  • QNo.2826776の質問の続き 表から別シートに一覧表を作成したいのですが

    質問の続きになってしまうのですが sheet1からsheet2へ転記するVBA Private Sub Worksheet_Change(ByVal Target As Range) Sheets("Sheet2").Cells.ClearContents Sheets("Sheet2").Cells(1, 1).Value = "日付" Sheets("Sheet2").Cells(1, 2).Value = "応援に行く人" Sheets("Sheet2").Cells(1, 3).Value = "応援をもらう店舗" r2 = 1 For r = 2 To Range("A65536").End(xlUp).Row For c = 2 To 256 If Cells(r, c) <> "" Then r2 = r2 + 1 Sheets("Sheet2").Cells(r2, 1).Value = Sheets("Sheet1").Cells(r, 1) Sheets("Sheet2").Cells(r2, 2).Value = Sheets("Sheet1").Cells(1, c) Sheets("Sheet2").Cells(r2, 3).Value = Sheets("Sheet1").Cells(r, c) End If Next c Next r End Sub と教えていただきました。 もうひとつ条件を入れたいのですが「"休"を無視する」 座標やシート名の入れ替えは理解できたのですが、やはり難しく ここを頼ってしまいました。教えてください。よろしくお願いします。

  • ドラッグした際のエラー回避

    以下のようなVBAを組んだのですが、オートフィルタでV列をリストのいずれかを選択中にドラッグすると「型が一致しません」というエラーを起こします。 最悪、オートフィルタ中はドラッグ不可でもかまいません。 ご教授ください。 (WinXp/Access2003) Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) '列の色変更 Dim myColor As Variant Dim myFontColor As Variant If Target.Column = 1 Then GoTo S If Target.Column = 9 Then GoTo K If Target.Column = 25 Then GoTo Y If Target.Column = 22 Then GoTo A If Selection.Cells.Count > 1 Then Exit Sub Exit Sub S: 'A列入力時 If Not Intersect(Target, Range("A1:A10")) Is Nothing Then Exit Sub Application.EnableEvents = False If Target.Value <> "" And Target.Offset(0, 4) = "" And Target.Offset(0, 2) = "" Then Target.Offset(0, 2) = "TypeA" Target.Offset(0, 5) = "未" Target.Offset(0, 6) = Date Target.Offset(0, 1).Select End If Application.EnableEvents = True Exit Sub K: '故障入力時 If Not Intersect(Target, Range("K1:K10")) Is Nothing Then Exit Sub Application.EnableEvents = False If Target.Value = "Y" Then Target.Offset(0, 13) = "故障" Cells(Target.Row, 1).Resize(1, 28).Interior.ColorIndex = 7 Target.Offset(0, 1).Select Else End If Application.EnableEvents = True Exit Sub Y: 'Y列入力時 If Not Intersect(Target, Range("Y1:Y10")) Is Nothing Then Exit Sub Application.EnableEvents = False If Target.Value <> "" And Target.Offset(0, 1) = "" And Target.Offset(0, 2) = "" Then Target.Offset(0, -3) = "売却済" Target.Offset(0, 1) = Date Target.Offset(0, 2) = "未" Cells(Target.Row, 1).Resize(1, 28).Interior.ColorIndex = 16 Else End If Application.EnableEvents = True Exit Sub A: If Not Intersect(Target, Range("A1:AB10")) Is Nothing Then Exit Sub Application.EnableEvents = False Select Case Target.Value Case "故障" myColor = 7 'ピンク myFontColor = 1 Case "修理中" myColor = 37 '薄い水色 myFontColor = 1 Case "担当出(1)" myColor = 3 '赤 myFontColor = 1 Case "担当出(2)" myColor = 8 '水色 myFontColor = 1 Case "担当出(3)" myColor = 4 '蛍光緑 myFontColor = 1 Case "担当出(4)" myColor = 6 '黄色 myFontColor = 1 Case "担当出(5)" myColor = 5 '青 myFontColor = 1 Case "担当出(6)" myColor = 10 '深緑色 myFontColor = 1 Case "売却済" myColor = 16 '濃灰色 myFontColor = 1 Case "廃棄", "修理不可能" myColor = 47 '群青 myFontColor = 2 '白 Case "保守用" myColor = 49 '群青 myFontColor = 2 '白 Case Else myColor = xlNone End Select Cells(Target.Row, 1).Resize(1, 28).Interior.ColorIndex = myColor Cells(Target.Row, 1).Resize(1, 28).Font.ColorIndex = myFontColor Application.EnableEvents = True End Sub Private Sub AFall() If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData End If End Sub

  • エクセルVBAについて

    http://okwave.jp/qa/q7236213.html 上記質問の発展形なのですが 同様のことを E列に日付 F列に売上 G列に結果 でやりたいのですが この時A列~C列のマクロも残したままでしたいのですが 下記のように同様のプロシージャーを下段に書けばできると思ったのですが うまくいきません。 Private Sub worksheet_change(ByVal Target As Excel.Range) If Target.Address <> "$A$1" Then Exit Sub If Target = "" Then Exit Sub Range("C10:C65536").ClearContents With Range(Cells(9 + Range("A1").Value, "C"), Cells(Range("A65536").End(xlUp).Row, "C")) .FormulaR1C1 = "=MAX(RC2:R[" & -Range("A1").Value + 1 & "]C2,FALSE)" .Value = .Value End With End Sub Private Sub worksheet_change(ByVal Target As Excel.Range) If Target.Address <> "$E$1" Then Exit Sub If Target = "" Then Exit Sub Range("G10:G65536").ClearContents With Range(Cells(9 + Range("E1").Value, "G"), Cells(Range("E65536").End(xlUp).Row, "G")) .FormulaR1C1 = "=MAX(RC6:R[" & -Range("A1").Value + 1 & "]C6,FALSE)" .Value = .Value End With End Sub どなたかお知恵を拝借できませんでしょうか?

  • アクティブセルの右側にユーザーフォームから入力したい。

    アクティブセルの右側にユーザーフォームから入力したい。 すいません初心者で困ってます。 Private Sub Worksheet_Change(ByVal Target As Range) With Target If .Column = 7 Then '色付けをColumn=??に限定 Select Case .Value '反応させる文字列の入力と(.Row ?)~(.Row?)で色塗り範囲指定 Case "完了" Range(Cells(.Row, 3), Cells(.Row, 13)).Interior.ColorIndex = 0 UserForm2.Show Case "提出中" Range(Cells(.Row, 3), Cells(.Row, 13)).Interior.ColorIndex = 6 Case Else Range(Cells(.Row, 3), Cells(.Row, 13)).Interior.ColorIndex = 0 End Select End If End With End Sub 台帳を作ってるんですが、リストから選択して”完了”と入力されるとUserForm2が開いて完了日を入力したいと思っております。 UserForm2はスピンボタンでそこそこ完成したんですが、”完了”に切り替えたセルの隣のセルに入力の方法が分からなくて困っております。 どなたか御教授ください。

専門家に質問してみよう