- 締切済み
ある操作後に自動的にセルに斜線を入れるには?
Excelで、管理表、対応表という2つのシートを作成していますが、T列に処理という欄を設けて、ここに入力規制のリストで○か×かを選択するようにしているのですが、ここの処理のある行のセルに○が入ると、その行にあるM列からU列までのセルに斜線もしくは-が、自動的に入るようにしたいのですが、マクロ処理でできますでしょうか?できるのであれば、教えて下さい。
- みんなの回答 (11)
- 専門家の回答
みんなの回答
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。KenKen_SP です。 一応下記のようなコードで動くと思います。 シートのコピーなどのシート操作の部分と、その後のハイパーリンク を張る辺りの部分についてですが、、 意図がよく理解できませんので、ほとんどそのままになっています。 また、Wendy02 さんがコメントされてますが、確かに Worksheet_Change イベント向きの処理内容ではありません。 ちょっとした操作で不用意にシートがコピーされたりする内容ですよね。 操作に不慣れなユーザーの場合、特に混乱の原因になりそうですし、 エラーが頻発しそうです。 On Error Resume Next でエラー対処されてますが、この方法は「とにかく エラーは無視」というやり方ですから、データの正確性も疑問が残ります。 失礼を承知でお聞きしますが、#9 の補足で書いていただいたコードは 期待したとおり正確に動作していますか? Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row = 1 Or IsEmpty(Target.Value) Then Exit Sub Select Case Target.Column Case Is = 1 Call WC_AddLink(Target) Exit Sub Case Is = 20 Call WC_SubProc(Target) Exit Sub End Select End Sub Sub WC_AddLink(ByVal Target As Range) Dim Sh As Worksheet Dim flag As Boolean If Target.Count > 1 Then Exit Sub For Each Sh In ThisWorkbook.Worksheets If Sh.Name = Target.Value Then MsgBox "同じ名前のデータがあります", vbCritical Application.EnableEvents = False Target.ClearContents Application.EnableEvents = True flag = True Exit For End If Next Sh If flag Then Exit Sub Application.ScreenUpdating = False Sheets("対応表").Copy After:= _ Sheets(WorksheetFunction.CountA(Range(Cells(1, 2), Cells(Target.Row, 2)))) ActiveSheet.Name = Target.Value ActiveSheet.Range("B3") = Target.Value Sheets(Target.Value).Range("C3").Select ActiveSheet.Visible = True ActiveSheet.Hyperlinks.Add _ Anchor:=Selection, _ SubAddress:="管理表!B1", _ TextToDisplay:=Target.Value Sheets("管理表").Activate ActiveSheet.Hyperlinks.Add _ Anchor:=Target, _ SubAddress:=Target.Value & "!B3", _ TextToDisplay:=Target.Value Application.ScreenUpdating = True End Sub Private Sub WC_SubProc(ByVal Target As Range) Dim C1 As Range Dim C2 As Range Dim rngBC As Range Application.ScreenUpdating = False For Each C1 In Target Set rngBC = Me.Range(Cells(C1.Row, "M"), Cells(C1.Row, "R")) With rngBC On Error Resume Next Application.EnableEvents = False If C1.Value = "○" Then For Each C2 In rngBC If IsEmpty(C2.Value) Then C2.Value = "―" End If Next C2 Else .Value = "" End If Application.EnableEvents = True On Error GoTo 0 End With Next C1 Set C1 = Nothing: Set C2 = Nothing Set rngBC = Nothing End Sub
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #9 の回答に対する補足 コードを見せていただきましたが、それは、とても、Worksheet_Changeイベントの内容ではありません。Worksheet_Changeで可能であっても、そのものが持つイベントの使い方が違います。 コマンドボタンやフォーム・ボタンなどに変えたほうがよいです。 その後に、Worksheet_Changeで、新たな「-」を付けるコードを作ったほうがよいですね。
お礼
ご回答ありがとうございます。 どういうふうに作成してよいかも なかなか分からないので、すみません。
- KenKen_SP
- ベストアンサー率62% (785/1258)
> ...1つは、M列とP列は入力規制で○、×、△、―の選択をする > ようになってます。 入力規制のリストに「―」が含まれているので問題ないと思いますが、 M 列または R 列に例えば「×」が既に入力されていたら、そこには 「―」を自動入力しない、、ということですか? また、 T 列の値を消去した場合はどうします?その行のM~R列も消去 する必要がありますか? > 管理表シートで別のマクロ処理をしていることです。 その「別のマクロ処理」をコピー&ペーストで補足して下さい。
補足
M 列または R 列に例えば「×」が既に入力されてい たら、そこには「―」を自動入力しない、、ということですか? ⇒ はい、M、R列に入力されている場合は「―」の自動入力はしません。 T 列の値を消去した場合はどうします?その行のM~R列も消去する必要がありますか? ⇒ はい、そのほうがいいです。 その「別のマクロ処理」をコピー&ペーストで補足して下さい。 Private Sub Worksheet_Change(ByVal Target As Range) Dim i On Error Resume Next If Target.Column <> 1 Then Exit Sub If Target.Row = 1 Then Exit Sub If Target.Value = "" Then Exit Sub For i = 1 To Sheets.Count If Sheets(i).Name = Target.Value Then MsgBox "同じ名前のデータがあります" Target.ClearContents Target.Select Exit Sub End If Next Application.ScreenUpdating = False Sheets("対応表").Copy After:=Sheets(WorksheetFunction. _ CountA(Range(Cells(1, 2), Cells(Target.Row, 2)))) ActiveSheet.Name = Target.Value ActiveSheet.Range("B3") = Target.Value Sheets(Target.Value).Range("C3").Select ActiveSheet.Visible = True ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="", _ SubAddress:="管理表!B1", TextToDisplay:=Target.Value Sheets("管理表").Activate ActiveSheet.Hyperlinks.Add Anchor:=Target, Address:="", _ SubAddress:=Target.Value & "!B3", TextToDisplay:=Target.Value Application.ScreenUpdating = True End Sub 以上です、よろしくお願いします。
- KenKen_SP
- ベストアンサー率62% (785/1258)
このサイトのように文字のみのコミュニティーでは、「実現したい こと」を正確にかつ具体的に表現するのは、なかなか難しいものです。 しかし、応援しますので、「実現したいこと」をもう一度整理し、 なるべく具体的に、補足願います。 まず、根本的なことの確認からです。 ご質問文を拝見したときに、Wendy02 さんがコメントされてますが、 > ...そのT列の上も斜線が通過して引かれるようになるけれども... という疑問が私にもありました。しかし > 管理表、対応表という2つのシートを作成しています... という記述があり、2つのシートで構成されたものであることを明示 されているわけですから、「連動させる」、、、と解釈し、#6 の コードを書きました。 この点で Wendy02 さんのコードと私のもので動作が異なるわけですが、 どちらなのでしょう? > MとPの列は入力規制(リストで○、×、△、-)... > ...これは、影響がありませんでしょうか? 最初のご質問文と違ってきてます。T 列、M 列、P 列のどれが正しい のでしょう? また、#6 のコードは T 列が○の時は斜線を、それ以外のときは斜線 を消去する仕組みになっていますが、果たしてどのように動作させた いのでしょうか? 影響があるか無いかは、あなたにしか「分からないこと」ですが、 少なくともこの点を明確にしていただければ、ある程度は推測できる かもしれません。 > ...その下に追加ペーストでいいのでしょうか? これは試してみて、その結果をお知らせ下さい。追加ペーストする ことで、問題が発生したら、そのコード全体を補足して下さい。
お礼
たびたび、すみません。 文字のみでは、なかなか伝えにくいことを実感しています。もう一度質問の内容を整理しますと Excelで、管理表、対応表という2つのシートを作成しています。管理表シートのT列に「処理」という欄を設けて、このT列のある行のセルに○(○以外は入力できないようにする)が入ると、その行にあるM列からR列までのセルに「―」(斜線にしようかと思いましたが、各列のセルの大きさが違うので、見た目が均一でなかったので・・)が、自動的に入るようにしたいのです。ただし、注意点が2つあり、1つは、M列とP列は入力規制で○、×、△、―の選択をするようになってます。 2つめは、管理表シートで別のマクロ処理をしていることです。そのため、追加編集か、新規編集になると思うのですが、マクロが全然分からないので、どうでしょうか?
補足
補足ですが、対応表はまったく関係ありません。 連動させる必要はないです。 管理表のシートだけのことです。 まぎらわしくてすみません。
- Wendy02
- ベストアンサー率57% (3570/6232)
>これは、影響がありませんでしょうか? どうも、影響でる・出ないということではないのですが、 KenKen_SPさんのコードを読んでいて、 「管理表」のT列に処理して、「対応表」で斜線の対応を入れるということかしらね。 もし、そうでしたら、直感的に、Worksheet_Change イベントではできても、それは、わたし流ではないというか、基本的な部分で違うような気がします。ですから、そのまま、私のコードを手直ししたりするのはやめておきます。 もう少し、正確で詳しいシートの情報が分かれば続けますが、今の状態では、不具合がでそうですし、私としては不満が残るだけになりそうです。少し、様子をみさせていただきます。
お礼
すみません。 ありがとうございました。
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。KenKen_SP です。 【手順】 1. シート選択タブで「管理表」をクリックし、続いて右クリック メニューから[コードの表示]をクリック Visual Basic Editor(以下VBE)が起動します。 2. 下記のコードを1.で開いたVBEのスペースにコピー&ペースト 3. VBEを閉じる 4. シート「管理表」のT列に○を書き込み、シート「対応表」に 反映されているか確認して下さい Private Sub Worksheet_Change(ByVal Target As Range) Dim Sh As Worksheet Dim C As Range If Target.Column <> 20 Then Exit Sub Set Sh = Sheets("対応表") For Each C In Target With Sh.Range(Sh.Cells(C.Row, "M"), Sh.Cells(C.Row, "U")) _ .Borders(xlDiagonalUp) If C.Value = "○" Then .LineStyle = xlContinuous Else .LineStyle = xlNone End If End With Next C Set Sh = Nothing Set C = Nothing End Sub
お礼
ご回答ありがとうございます。 早速、やってみようと思ったんですが、 よくよくシートを見ると、うっかりしてました。 MとPの列は入力規制(リストで○、×、△、-) を使用するようにしていました。 これは、影響がありませんでしょうか? それと、別にマクロ処理があるのですが、その下に追加 ペーストでいいのでしょうか? すみませんが、よろしくおねがいします。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 T列に= ○を入れるようにするなら、 >その行にあるM列からU列までのセルに斜線 当然、そのT列の上も斜線が通過して引かれるようになるけれども、それでよいのでしょうか? 本当に斜線でいいのですよね? なお、'Application.EnableEvents = False 'Application.EnableEvents = True は、不都合があれば、外してください。 '<シートモジュールに登録> Private Sub Worksheet_Change(ByVal Target As Range) With Target If .Column <> 20 Then Exit Sub 'T列 If .Count > 1 Then Exit Sub '複数のセル選択 If InStr(.Value, "○") > 0 Then Application.ScreenUpdating = False 'Application.EnableEvents = False With .Offset(, -7).Resize(, 9).Borders(xlDiagonalUp) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With 'Application.EnableEvents = True End If End With Application.ScreenUpdating = True End Sub
お礼
ご回答ありがとうございます。 後の方と同じになってますが、 早速、やってみようと思ったんですが、 よくよくシートを見ると、うっかりしてました。 MとPの列は入力規制(リストで○、×、△、-) を使用するようにしていました。 これは、影響がありませんでしょうか? それと、別にマクロ処理があるのですが、その下に追加 ペーストでいいのでしょうか? すみませんが、よろしくおねがいします。
- shigech
- ベストアンサー率11% (2/17)
続きです。 例えば、T1に○が入った場合、M1にカーソルを合わせて、書式-条件付書式をクリック! 「セルの値が」「次の値に等しい」「=T1="×"」にして、書式(F)でパターンを全体斜線とかにすれば、T1が○になった時に斜線が入ります。 あとは全部コピーすれば出来ます。
お礼
ありがとうございます。 IF関数で、試してみたいとおもいます。
- kamejiro
- ベストアンサー率28% (136/479)
IF関数で 列 … M … T 1 行 2 =IF(T2="","","-") … ○ 3 =IF(T3="","","-") … × 4 =IF(T4="","","-") … というふうに入れておけば、 T2のセルが空白以外("○"や"×")なら、 M2のセルには、"-"の値が入ります。 T4のセルのように空白なら、M4のセルは空白です。 マクロ指定でしょうか。その場合は、T列に○、×を入れてから、マクロの実行でM列に"-"を入れるプログラムを作ることは可能です。 For i=2 to 100 if Cells(i,13)<>"" Then Cells(i,20)="-" End If Next i ※2行目から100行目まで指定
お礼
ご回答ありがとうございます。 早速、やってみようと思ったんですが、 よくよくシートを見ると、うっかりしてました。 MとPの列は入力規制(リストで○、×、△、-) を使用するようにしていました。 これは、影響がありませんでしょうか? 質問の内容が違ってしまってすみません。
- rx_78_2
- ベストアンサー率35% (16/45)
M列からU列までに関数IFを使用するのはだめなんでしょうか? T列が○なら-にすればできる気がします。 斜線については書式→条件付書式でできるかと思っていましたが、斜めの線は条件付書式には指定できないみたいですね。
お礼
ご回答、ありがとうございます。 マクロ処理ではなくても、関数でも、 できればかまいません。もちろん、斜線でなくても -でもかまいませんので、実際にどういうふうに しないといけないのか、教えて下さい。 関数もあまり、理解していませんので。
- 1
- 2
補足
ありがとうございます。 早速試してみましたが、実行時エラー450で引数の値が一致していません。または不正なプロパティを指定しています。と出て、 ActiveSheet.Hyperlinks.Add _ Anchor:=Selection, _ SubAddress:="管理表!B1", _ TextToDisplay:=Target.Value この部分をデバックするよう言ってきます。 やはり、難しいのでしょうか? マクロが全然、分からないので。 すみません。