こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

回答受付中の質問

1.セルに『無し』と力すれば機能するマクロ

1.セルに『無し』と力すれば機能するマクロの『無し』を例えばA1セルにデータの入力規則でリストを作成して"無し"を選び、C10セルで=A1で無しを表示しましたがC10セルが非表示になりませんでした。どのようにすれば出来るかをお願いします。

投稿日時 - 2018-01-05 18:33:16

QNo.9415228

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

回答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以外のセルで値が変更されたときも表示または非表示の再操作が起り負荷が増えますのでお勧めできません。

投稿日時 - 2018-01-07 15:36:11

ANo.5

 なるほど。何が悪いのかわかりました。
 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度手間は省けました。
 変化したセルがどこかを見る方法はありません。カウントは入れませんでした。

投稿日時 - 2018-01-06 23:10:03

ANo.4

>例えばA1セルにデータの入力規則でリストを作成して"無し"を選び、C10セルで=A1で無しを表示しましたがC10セルが非表示になりませんでした。
意味不明です。
「非表示」は行または列全体を対象に表示/非表示が選択できますがC10セルを単独で表示/非表示を指定できません。

VBAのイベントプロシージャで何れかのセルの値が変化はしたとき実行するプログラムを記述できますが、あなたの要望する内容を第三者が理解できるようにしないと目的に合うコードのサンプルを提示できません。
質問の内容からはA1セルにデータの入力規則でリストから「無し」を選択するとC10セルにはA1と同じ「無し」と言う文字列が代入されます。
C10セルの「無し」を「非表示」にするという状態がどのようなことか説明されていません。
C10セルのフォントの色を白にして見えなくするのか?、10行目の行を非表示にするのか?、またはC列を非表示にするのかを決めてください。
また、A1のセルの値を「無し」以外の値に変更したときはどうするかも提示する必要があります。

投稿日時 - 2018-01-06 08:39:34

ANo.3

上記間違い、こちらをご利用ください。
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

投稿日時 - 2018-01-06 08:37:08

補足

■ セルに『無し』と力すれば機能するマクロ ■です。

'//   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

投稿日時 - 2018-01-06 16:59:32

ANo.2

まず、『無し』と力すれば機能するマクロがどんなマクロか記述がないので、どこが悪いかわかりません。
また、何を非表示にするのかわかりません。
私は、列を非表示ににするプログラムを作ってやってみたらうまく行きました。
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
非表示にするのは行かもしれません。その場合これを参考に作り直して下さい。

投稿日時 - 2018-01-06 08:22:53

ANo.1

>せるに『無し』と力すれば機能するマクロ
エクセルの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
などからはじめるとよい。

投稿日時 - 2018-01-05 21:39:22