- ベストアンサー
セルの値によって隣のセルに斜線を自動で引く方法
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>あるセルに数値を入力する ご相談のサンプルで「金額」列に,「生数字を入力している」のか実は他のセルの数字で「計算する数式が記入されている」のかで,具体的なヤリ方は違ってきます。 ご相談ではあなたの実際のエクセルの状況に基づいて,情報提供してください。 一応ご相談は正しくて,B列に「実際に生数字を記入している」とすると。 手順: シート名タブを右クリックしてコードの表示を選ぶ 現れたシートに下記をコピー貼り付ける private sub Worksheet_Change(byval Target as excel.range) dim h as range on error resume next for each h in application.intersect(target, range("B:B")) h.offset(0, 1).resize(1, 2).borders(xldiagonalup).linestyle = iif(h.value = 0, xlcontinuous, xlnone) next end sub ファイルメニューから終了してエクセルに戻る B列に実際に数字を記入したり削除したりすると,その行のC,D列に斜線が入ったり消えたりする。 #参考 上述の手順はこれからB列に数字を書いたり消したりする用です。 既に記入済みのB列に対して斜線を入れたいときは,オートフィルタで絞ってC,D列に斜線を設定した方がカンタンです。
その他の回答 (3)
- tsubu-yuki
- ベストアンサー率46% (179/386)
多少強引ですが、VBAを使わない方向で。 見たところ、シートの表示形式から「枠線」を非表示にしているようですので都合よいです(笑) 下準備として、印刷範囲外に ・空白のセル(塗りつぶしも罫線も無し、仮にF1セルとします) ・斜線を引いたセル(塗りつぶし無し、斜線。仮にG1セルとします) を作ります。もちろん、違うシートでもOKですよ。 とりあえずここでは「Sheet1」に作ったものとして進めます。 これで下準備完了。 2007でも同じだったと思うのですが、 リボンの数式タブ⇒名前の定義 で「新しい名前」ダイアログを出します。 「名前」に PIC (お好きな文字列でどうぞ。数値はNGです) 「範囲」は ブック のまま。 「コメント」は適宜どうぞ。 「参照範囲」には =IF(Sheet1!$A$2="",Sheet1!$G$1,Sheet1!$F$1) という式を入力し、「OK」します。 どこでも良いので、適当な空白セルをコピー、 適当な場所に形式を選択して貼り付け⇒リンクされた図 で貼り付けます。 罫線も塗りつぶしも無いセルがベストです。 貼られた図にフォーカスを合わせ、 数式バーに「=PIC (←先程つけた名前)」と入力、Enterします。 この図を表示したいセルに合わせて移動してやって、完了です。 数が多いとコレは逆に不便ですね。 失礼しました。
- kagakusuki
- ベストアンサー率51% (2610/5101)
既に記入済みのB列に対して斜線を入れる事が出来る方法です。 (但し、A列に何らかの値が入力されている最後の行の処までに限ります) まず、VBEのウィンドウを開いて、「プロジェクト - VBAProject」欄の中に並んでいるシートモジュールの中から、御質問の様な設定をしたいシートを選択してダブルクリックして下さい。 次に、VBEのウィンドウの右側にある広い欄に下記のVBAの構文を入力して下さい。 Private Sub Worksheet_Change(ByVal Target As Range) Const FirstRow = 2 'データの入力欄の中で最も上にあるセルの行番号 Const NameColumn = "A" '「名称」が入力されている列の列番号 Const AmountColumn = "B" '「金額」が入力されている列の列番号 Const BorderColumn = "C:D" '罫線を入れたり消したりする列の列番号 Dim myRange As Range, c As Range, LastRow As Long LastRow = Range(NameColumn & Rows.Count).End(xlUp).row If LastRow < FirstRow Then Exit Sub With Application .ScreenUpdating = False .Calculation = xlManual End With For Each c In Range(AmountColumn & FirstRow & ":" & AmountColumn & LastRow) With Intersect(Rows(c.row), Range(BorderColumn)).Borders(xlDiagonalUp) .ColorIndex = RGB(0, 0, 0) .TintAndShade = 0 .Weight = xlThin If c.Value = 0 Or c.Value = "" Then .LineStyle = xlContinuous Else .LineStyle = xlNone End If End With Next c With Application .Calculation = xlAutomatic .ScreenUpdating = True End With End Sub 次に、VBEのウィンドウの[上書き保存]ボタンをクリックするか、又は[Ctrl]キーを押しながら[S]キーを押して、そのVBAの構文を保存して下さい。 その上で、そのマクロを登録したシート上にあるセル(B列でなくとも良い)の内どれか1つの値を変更しますと、B列の値に応じてC列~D列の2行目以下のセルの斜線が引かれたり、消去されたりします。 尚、 >0、または、空欄だった場合、そのセルの右隣の2セルに右上りの斜線を自動的に引かれる設定にしたい という条件でしたので、B列に数値データではない文字列データが入力された場合には、「0でも空欄でもない」ため斜線が消える様にしております。 又、今回は >B列へは生数字を入力します。 との事ですが、上記のVBAのマクロはB列にワークシート関数が入力されていて、そのシート内のセルのデータが手入力によって変更された場合には、ワークシート関数の出力結果によってB列の値が変わった場合においても、斜線の引き直しが行われる様になっております。
お礼
どうもありがとうございます。 こちらも一度試してみたいと思います。
- imogasi
- ベストアンサー率27% (4737/17069)
確かに条件付き書式は、罫線のセル囲い資格はあるものの、車線がグレイアウトして使えない。 ーー それでVBAしかないと思いやってみた。 ==>勘違いに注意 すでにデータが入力済みの場合の処理ではない。 ーー Sheet1のWorksheet1のChangeイベントとして下記を張り付ける。(標準モジュールに貼りつけるのではない) Private Sub Worksheet_Change(ByVal Target As Range) EnableEvents = False If Application.Intersect(Target, Range("A3:A100")) Is Nothing Then Else If Target = "欠席" Or Target < 20 Then Target.Offset(0, 1).Borders(xlDiagonalUp).LineStyle = xlContinuous Target.Offset(0, 2).Borders(xlDiagonalUp).LineStyle = xlContinuous Else Target.Offset(0, 1).Borders(xlDiagonalUp).LineStyle = xlNone Target.Offset(0, 2).Borders(xlDiagonalUp).LineStyle = xlNone End If End If EnableEvents = True End Sub ーーーーー 使用制約 (!)A列の一部に限る (2)これからA列にデータを入れる場合に限る。 すでにデータが入力済みの場合の処理ではない。 (3)車線を引くのは「欠席」と入れた場合と「20以下の数値」を入れた場合とDeleteで空白に戻した場合など。よくチェックしてみる必要は残っているとおもう。 (4)即時反応する (5)「出席」の文字があって、上から「欠席」に入力しなおすと、車線を引く。 ーーー すでに出ている回答と違いがあればよいが。 小生は、日ごろからシートのイベントを使うのは、むつかしいと思っている(ユーザーが思わぬ入力操作をするかもしれない。Canceキーや複数セル選択など。) ある程度テストをよくして使うべきとおもう。
お礼
どうもありがとうございます。 こちらも一度試してみます。
お礼
ご教授ありがとうございます。 私の質問の説明が足らなくてすみません。 B列へは生数字を入力します。 教えて頂いたコードを設定したところ、斜線が出る様になりました。 助かりました。 ありがとうございました。