- 締切済み
1.セルに『無し』と力すれば機能するマクロ
1.セルに『無し』と力すれば機能するマクロの『無し』を例えばA1セルにデータの入力規則でリストを作成して"無し"を選び、C10セルで=A1で無しを表示しましたがC10セルが非表示になりませんでした。どのようにすれば出来るかをお願いします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- bunjii
- ベストアンサー率43% (3589/8249)
回答No.3の補足に下記の条件が提示されていますが行と列の認識に誤りがあるようです。 「そこで 例えばA1セルで無しと入力したらC10で無しが表示され10列が非表示になりA1セルに有りと入力したらC10が有りの表示になり10列が表示されるようにしようとしています。」の中で「10列」としているのは「C列」の誤りか「10行」の誤りと思います。 「10行」の誤りでしたら次のコードになります。 Private Sub Worksheet_Change(ByVal Target As Range) Dim myRange As String myRange = ActiveCell.Address If ActiveCell.Address = "$A$1" Then Range("C10").Select If Range("c10").Value = "無し" Then Range("C10").EntireRow.Hidden = True MsgBox "C10セルの値は " & Range("c10").Value & " です。" Else Range("C10").EntireRow.Hidden = False End If End If Range(myRange).Select End Sub 「10列」が「C列」の誤りのときは次のように修正してください。 Range("C10").EntireRow.Hidden = True ↓ Range("C10").EntireColumn.Hidden = True Range("C10").EntireRow.Hidden = False ↓ Range("C10").EntireColumn.Hidden = False 尚、MsgBoxで表示している部分は動作確認のためなので不要になればコメントアウトまたは削除してください。 また、質問の内容からA1以外の値変更には最小のチェックでイベントから抜け出すようにしています。 C10セルの内容で確認する方法ではA1以外のセルで値が変更されたときも表示または非表示の再操作が起り負荷が増えますのでお勧めできません。
- SI299792
- ベストアンサー率47% (777/1627)
なるほど。何が悪いのかわかりました。 Worksheet_ChangeのTargetは、変化した場所全てが入るわけでは無く、入力で変化させた1か所しか入りません。つまり、TargetにはA1しか入っておらず、C10 は入っていません。 試しにプログラムの頭に、Debug.Print Target.Countを入れて見て下さい。常に1です。 また、For Eachの後に、Debug.Print rg.Addressを入れれば、このループは1回だけ、A1しか処理されていないのが判ります。 この場合C列全体を見るしかありません。 ' Private Sub Worksheet_Change(ByVal Target As Range) ' If Target.Address <> "$A$1" Then End End If ' 最初に非表示を解除 Cells.EntireRow.Hidden = False Set Target = [C:C].Find("無し", LookIn:=xlValues, LookAt:=xlWhole) ' 「無し」のセルが見つからなくなるまで繰り返す。 Do Until Target Is Nothing Rows(Target.Row).Hidden = True Set Target = [C:C].FindNext Loop End Sub 最初からプログラムを載せていただければ、こんな2度手間は省けました。 変化したセルがどこかを見る方法はありません。カウントは入れませんでした。
- bunjii
- ベストアンサー率43% (3589/8249)
>例えばA1セルにデータの入力規則でリストを作成して"無し"を選び、C10セルで=A1で無しを表示しましたがC10セルが非表示になりませんでした。 意味不明です。 「非表示」は行または列全体を対象に表示/非表示が選択できますがC10セルを単独で表示/非表示を指定できません。 VBAのイベントプロシージャで何れかのセルの値が変化はしたとき実行するプログラムを記述できますが、あなたの要望する内容を第三者が理解できるようにしないと目的に合うコードのサンプルを提示できません。 質問の内容からはA1セルにデータの入力規則でリストから「無し」を選択するとC10セルにはA1と同じ「無し」と言う文字列が代入されます。 C10セルの「無し」を「非表示」にするという状態がどのようなことか説明されていません。 C10セルのフォントの色を白にして見えなくするのか?、10行目の行を非表示にするのか?、またはC列を非表示にするのかを決めてください。 また、A1のセルの値を「無し」以外の値に変更したときはどうするかも提示する必要があります。
- SI299792
- ベストアンサー率47% (777/1627)
上記間違い、こちらをご利用ください。 Cells が付いているかどうかの違いです。上記でも問題なく動くのですが、余計なもの付いているとどうも気になって。 Option Explicit ' Private Sub Worksheet_Change(ByVal Target As Range) ' Dim Col As Integer ' If Target.Address <> "$A$1" Then End End If ' Cells.EntireColumn.Hidden = False Set Target = [B:XFD].Find("無し", LookIn:=xlValues, LookAt:=xlWhole) ' Do Until Target Is Nothing Col = Target.Column Columns(Col).EntireColumn.Hidden = True Set Target = [B:XFD].FindNext Loop End Sub
- SI299792
- ベストアンサー率47% (777/1627)
まず、『無し』と力すれば機能するマクロがどんなマクロか記述がないので、どこが悪いかわかりません。 また、何を非表示にするのかわかりません。 私は、列を非表示ににするプログラムを作ってやってみたらうまく行きました。 Option Explicit ' Private Sub Worksheet_Change(ByVal Target As Range) ' Dim Col As Integer ' If Target = "無し" Then Col = Target.Column Columns(Col).EntireColumn.Hidden = True End If End Sub それとも、C10セルで=A1 を入れた後に、A1を『無し』にしたら、Cが非表示になるということでしょうか。これを実現するには、全てのセルをチェックする必要があります。 A列は有り・無しの切替の為、対象外にしました。 Option Explicit ' Private Sub Worksheet_Change(ByVal Target As Range) ' Dim Col As Integer ' If Target.Address <> "$A$1" Then End End If ' Cells.EntireColumn.Hidden = False Set Target = [B:XFD].Cells.Find("無し", LookIn:=xlValues, LookAt:=xlWhole) ' Do Until Target Is Nothing Col = Target.Column Columns(Col).EntireColumn.Hidden = True Set Target = [B:XFD].FindNext Loop End Sub 非表示にするのは行かもしれません。その場合これを参考に作り直して下さい。
- imogasi
- ベストアンサー率27% (4737/17069)
>せるに『無し』と力すれば機能するマクロ エクセルのVBAのセルのChangeイベントというものを使えば1-2行ぼどのコードで実現します。しかしVBAでも、普通の課題をこなした後に学ぶ仕組みで、経験がすくないのに、使うと弊害も出ると思う。あえてコードを書かない。 しっかり勉強した後に考えるべきです。 素人がエクセルなどのソフトを使うと、しょっちゅう(というかほぼすべて)、出くわす機能(イベントドリブン)なので、簡単に思うかもしれにが、パソコンが出現する前は、個人の使用がメインではなかったので、大変な上級の機能だった。 それで、少なくともVBAの解説書でも読んでからにしたら、と思う。 どうしてもやるなら Gooleで「http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html 」 照会し http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html などからはじめるとよい。
補足
■ セルに『無し』と力すれば機能するマクロ ■です。 '// C列の3行目以降に『無し』を入力すると、その行を非表示にする '// 『無し』をコピーして複数セルに貼り付けても可にするため下記のようにしました。しかし直接セルに無しを入力すると非表示になる為表示するときはマクロを使わずに表示しなければなりません。 そこで 例えばA1セルで無しと入力したらC10で無しが表示され10列が非表示になりA1セルに有りと入力したらC10が有りの表示になり10列が表示されるようにしようとしています。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count > 100 Then Exit Sub '// 多数のセルの修正は無視する Dim rg As Range '// セル For Each rg In Target If rg.Column = "3" Then '// C列なら If rg.Value = "無し" Then Rows(rg.Row).Hidden = True '// 下2行を有効にすると、セルの『無し』をクリアすると行が表示される 'Else ' Rows(rg.Row).Hidden = False End If End If Next End Sub