• 締切済み

ある操作後に自動的にセルに斜線を入れるには?

Excelで、管理表、対応表という2つのシートを作成していますが、T列に処理という欄を設けて、ここに入力規制のリストで○か×かを選択するようにしているのですが、ここの処理のある行のセルに○が入ると、その行にあるM列からU列までのセルに斜線もしくは-が、自動的に入るようにしたいのですが、マクロ処理でできますでしょうか?できるのであれば、教えて下さい。

みんなの回答

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.11

こんにちは。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

f-skale
質問者

補足

ありがとうございます。 早速試してみましたが、実行時エラー450で引数の値が一致していません。または不正なプロパティを指定しています。と出て、 ActiveSheet.Hyperlinks.Add _ Anchor:=Selection, _ SubAddress:="管理表!B1", _ TextToDisplay:=Target.Value この部分をデバックするよう言ってきます。 やはり、難しいのでしょうか? マクロが全然、分からないので。 すみません。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.10

こんにちは。 #9 の回答に対する補足 コードを見せていただきましたが、それは、とても、Worksheet_Changeイベントの内容ではありません。Worksheet_Changeで可能であっても、そのものが持つイベントの使い方が違います。 コマンドボタンやフォーム・ボタンなどに変えたほうがよいです。 その後に、Worksheet_Changeで、新たな「-」を付けるコードを作ったほうがよいですね。

f-skale
質問者

お礼

ご回答ありがとうございます。 どういうふうに作成してよいかも なかなか分からないので、すみません。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.9

> ...1つは、M列とP列は入力規制で○、×、△、―の選択をする > ようになってます。 入力規制のリストに「―」が含まれているので問題ないと思いますが、 M 列または R 列に例えば「×」が既に入力されていたら、そこには 「―」を自動入力しない、、ということですか? また、 T 列の値を消去した場合はどうします?その行のM~R列も消去 する必要がありますか? > 管理表シートで別のマクロ処理をしていることです。 その「別のマクロ処理」をコピー&ペーストで補足して下さい。

f-skale
質問者

補足

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)
回答No.8

このサイトのように文字のみのコミュニティーでは、「実現したい こと」を正確にかつ具体的に表現するのは、なかなか難しいものです。 しかし、応援しますので、「実現したいこと」をもう一度整理し、 なるべく具体的に、補足願います。 まず、根本的なことの確認からです。 ご質問文を拝見したときに、Wendy02 さんがコメントされてますが、 > ...そのT列の上も斜線が通過して引かれるようになるけれども... という疑問が私にもありました。しかし > 管理表、対応表という2つのシートを作成しています... という記述があり、2つのシートで構成されたものであることを明示 されているわけですから、「連動させる」、、、と解釈し、#6 の コードを書きました。 この点で Wendy02 さんのコードと私のもので動作が異なるわけですが、 どちらなのでしょう? > MとPの列は入力規制(リストで○、×、△、-)... > ...これは、影響がありませんでしょうか? 最初のご質問文と違ってきてます。T 列、M 列、P 列のどれが正しい のでしょう? また、#6 のコードは T 列が○の時は斜線を、それ以外のときは斜線 を消去する仕組みになっていますが、果たしてどのように動作させた いのでしょうか? 影響があるか無いかは、あなたにしか「分からないこと」ですが、 少なくともこの点を明確にしていただければ、ある程度は推測できる かもしれません。 > ...その下に追加ペーストでいいのでしょうか? これは試してみて、その結果をお知らせ下さい。追加ペーストする ことで、問題が発生したら、そのコード全体を補足して下さい。

f-skale
質問者

お礼

たびたび、すみません。 文字のみでは、なかなか伝えにくいことを実感しています。もう一度質問の内容を整理しますと Excelで、管理表、対応表という2つのシートを作成しています。管理表シートのT列に「処理」という欄を設けて、このT列のある行のセルに○(○以外は入力できないようにする)が入ると、その行にあるM列からR列までのセルに「―」(斜線にしようかと思いましたが、各列のセルの大きさが違うので、見た目が均一でなかったので・・)が、自動的に入るようにしたいのです。ただし、注意点が2つあり、1つは、M列とP列は入力規制で○、×、△、―の選択をするようになってます。 2つめは、管理表シートで別のマクロ処理をしていることです。そのため、追加編集か、新規編集になると思うのですが、マクロが全然分からないので、どうでしょうか?

f-skale
質問者

補足

補足ですが、対応表はまったく関係ありません。 連動させる必要はないです。 管理表のシートだけのことです。 まぎらわしくてすみません。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

>これは、影響がありませんでしょうか? どうも、影響でる・出ないということではないのですが、 KenKen_SPさんのコードを読んでいて、 「管理表」のT列に処理して、「対応表」で斜線の対応を入れるということかしらね。 もし、そうでしたら、直感的に、Worksheet_Change イベントではできても、それは、わたし流ではないというか、基本的な部分で違うような気がします。ですから、そのまま、私のコードを手直ししたりするのはやめておきます。 もう少し、正確で詳しいシートの情報が分かれば続けますが、今の状態では、不具合がでそうですし、私としては不満が残るだけになりそうです。少し、様子をみさせていただきます。

f-skale
質問者

お礼

すみません。 ありがとうございました。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.6

こんにちは。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

f-skale
質問者

お礼

ご回答ありがとうございます。 早速、やってみようと思ったんですが、 よくよくシートを見ると、うっかりしてました。 MとPの列は入力規制(リストで○、×、△、-) を使用するようにしていました。 これは、影響がありませんでしょうか? それと、別にマクロ処理があるのですが、その下に追加 ペーストでいいのでしょうか? すみませんが、よろしくおねがいします。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんにちは。 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

f-skale
質問者

お礼

ご回答ありがとうございます。 後の方と同じになってますが、 早速、やってみようと思ったんですが、 よくよくシートを見ると、うっかりしてました。 MとPの列は入力規制(リストで○、×、△、-) を使用するようにしていました。 これは、影響がありませんでしょうか? それと、別にマクロ処理があるのですが、その下に追加 ペーストでいいのでしょうか? すみませんが、よろしくおねがいします。

  • shigech
  • ベストアンサー率11% (2/17)
回答No.4

続きです。 例えば、T1に○が入った場合、M1にカーソルを合わせて、書式-条件付書式をクリック! 「セルの値が」「次の値に等しい」「=T1="×"」にして、書式(F)でパターンを全体斜線とかにすれば、T1が○になった時に斜線が入ります。 あとは全部コピーすれば出来ます。

f-skale
質問者

お礼

ありがとうございます。 IF関数で、試してみたいとおもいます。

  • kamejiro
  • ベストアンサー率28% (136/479)
回答No.3

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行目まで指定

f-skale
質問者

お礼

ご回答ありがとうございます。 早速、やってみようと思ったんですが、 よくよくシートを見ると、うっかりしてました。 MとPの列は入力規制(リストで○、×、△、-) を使用するようにしていました。 これは、影響がありませんでしょうか? 質問の内容が違ってしまってすみません。

  • rx_78_2
  • ベストアンサー率35% (16/45)
回答No.2

M列からU列までに関数IFを使用するのはだめなんでしょうか? T列が○なら-にすればできる気がします。 斜線については書式→条件付書式でできるかと思っていましたが、斜めの線は条件付書式には指定できないみたいですね。

f-skale
質問者

お礼

ご回答、ありがとうございます。 マクロ処理ではなくても、関数でも、 できればかまいません。もちろん、斜線でなくても -でもかまいませんので、実際にどういうふうに しないといけないのか、教えて下さい。 関数もあまり、理解していませんので。

関連するQ&A