• ベストアンサー

エクセル マクロを自動実行

仕事で使っている書式で、A1に「あいうえお」と入力すると、A2「あ」、B2「い」、C2「う」、D2「え」、E2「お」とMID関数で振り分け、入力後、A行を「表示しない」と「再表示」するマクロをボタンで実行するようにしています。 そこで、 この書式には必ず入力しなければならない項目があるので(非表示しない行のセル)、この項目に入力したら行の非表示マクロを実行し、空白なら行の再表示マクロを実行出来るようにしたくて調べているのですが見つかりません。 1クリックの手間を省く方法をご存知の方ご教示ください。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.3

記録マクロで作られた物ですね。 下記のようにしてください。 Sub とじるよ() Range("25:25,32:32,38:38,45:45,52:52,59:59,66:66,70:70,74:74,78:78,85:85") _ .EntireRow.Hidden = True Range("AL15:CE16").Select'選択不要ならこの行を削除 End Sub Sub ひらくよ() Rows("21:87").EntireRow.Hidden = False Range("AL15:CE16").Select'選択不要ならこの行を削除 End Sub '上記は標準モジュール '下記はシート用のモジュールに入れてください。 Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False If Target.Address = "$A$1" Then If Target.Value = "" Then Call ひらくよ Else Call とじるよ End If End If Application.EnableEvents = True End Sub

kanjukukaki
質問者

お礼

記録マクロというのですか。 ずいぶん長いコードだったのがすんごく短くなったのにしっかり結果が出て、すごいです。 別の書式では、列を非表示にする記録マクロをつくって実行したところ結合したセルまで非表示になってしまって諦めていたのですが、最初に教えていただいたコードではそのようなことがなく使えるのでどちらも使わせていただきます。 ありがとうございました。

その他の回答 (3)

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

こんにちは。Wendy02です。 こんな風にしたらどうかな? ただし、$A$1などが複数存在している場合は、 Application.EnableEvents のコメントを外してください。 Private Sub Worksheet_Change(ByVal Target As Range) Dim ur As Range Dim flg As Boolean  ''ここを設定↓  If Target.Address <> "$A$1" Then Exit Sub  'Application.EnableEvents = False  If Target.Value <> "" Then  flg = True  Else  flg = False  End If  rngRows ur  ur.EntireRow.Hidden = flg  Range("AL15:CE16").Select  'Application.EnableEvents = True End Sub Private Function rngRows(ur As Range) Dim myRows As Variant Dim r As Variant  myRows = Array(25, 32, 38, 45, 52, 59, 66, 70, 74, 78, 85)  For Each r In myRows  If ur Is Nothing Then   Set ur = Rows(r)  Else   Set ur = Union(ur, Rows(r))  End If Next r End Function

kanjukukaki
質問者

お礼

ほんとうにすごいです。 要求どおりの結果が出ました。しっかり使わせていただきます。 VBAは神の領域でしたがこれを期に少し勉強してみようかな。 ありがとうございました。

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

こんにちは。 私は、設問を何度も何度も読み返してみましたが、意味が良くわかりません。 それとも、私の読み違えなのかもしれません。 >入力後、A行を「表示しない」と「再表示」するマクロ >A2「あ」、 「A行」? 「A列」振り分けた、文字列まで、表示しないのですか? >この項目(=A1のことだろうと思います)に入力したら行の非表示マクロを実行し、 >空白なら行の再表示マクロを実行出来るようにしたくて & >1クリックの手間を省く方法をご存知の方ご教示ください。 非表示にする側はA1に入れるから、そのイベントのトリガーになるものは分るけれども、A1(または、2行目)が「空白なら、行の再表示」という状態-非表示になったものに対して、再表示させるためのトリガーは分らないですね。(まったく出来ないわけではないけれども、特殊なコードになります。) 通常は、ワークシートのアクション(動作)に対して、トリガーになるのですから、A1の文字を消去した、というなら、ロジックは成り立ちますが、元を非表示にしたり、その消えている状態では、ロジックが成り立たないと思います。もちろん、シートをActivateしたというものに対しては、トリガーになりますが、そうすると、条件とは違ってきます。どこか、設問に間違いがあるのではないでしょうか? 1クリックの手間と言っても、結局は、何かに組み合わせるだけのことなのですね。その元がなくなったら、どうしようもありませんし、目の前から消えたものに対しては、動作しないわけです。   A    B     C    D    E 1 あいうえお 2 あ    い    う    え   お   ↑   この列が非表示になると、残るものは、B2,C2,D2,E2 になります。A1,A2を非表示にするのですか?

kanjukukaki
質問者

補足

書き方を間違っていました 「列」ではなく「行」でした。 実際には、 Sub とじる1() Rows("25:25").Select ActiveWindow.SmallScroll Down:=6 Range("25:25,32:32,38:38").Select Range("A38").Activate ActiveWindow.SmallScroll Down:=6 Range("25:25,32:32,38:38,45:45").Select Range("A45").Activate ActiveWindow.SmallScroll Down:=9 Range("25:25,32:32,38:38,45:45,52:52").Select Range("A52").Activate ActiveWindow.SmallScroll Down:=6 Range("25:25,32:32,38:38,45:45,52:52,59:59").Select Range("A59").Activate ActiveWindow.SmallScroll Down:=12 Range("25:25,32:32,38:38,45:45,52:52,59:59,66:66").Select Range("A66").Activate ActiveWindow.SmallScroll Down:=6 Range("25:25,32:32,38:38,45:45,52:52,59:59,66:66,70:70,74:74").Select Range("A74").Activate ActiveWindow.SmallScroll Down:=12 Range("25:25,32:32,38:38,45:45,52:52,59:59,66:66,70:70,74:74,78:78,85:85"). _ Select Range("A85").Activate ActiveWindow.SmallScroll Down:=3 Selection.EntireRow.Hidden = True ActiveWindow.SmallScroll Down:=-69 Range("AL15:CE16").Select End Sub と Sub ひらく1() ActiveWindow.SmallScroll Down:=3 Rows("21:87").Select Selection.EntireRow.Hidden = False Range("AL15:CE16").Select End Sub をボタンで実行しています。 これを「A1」(仮)に入力すると「とじる」、空白なら「ひらく」にしたいのです。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

シートタブを右クリックして「コードの表示」で開いた画面に下記を記入してください。 Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False 'スイッチに使うセル名を絶対参照($A$1)で記入 If Target.Address = "$C$3" Then If Target.Value = "" Then 'セルが空白の場合、A列を表示 Columns("A:A").EntireColumn.Hidden = False Else Columns("A:A").EntireColumn.Hidden = True End If End If Application.EnableEvents = True End Sub

kanjukukaki
質問者

補足

ご回答有難うございます。 書き方を間違っていたので訂正します。 「列」ではなく「行」でした。 実際には、 Sub とじる1() Rows("25:25").Select ActiveWindow.SmallScroll Down:=6 Range("25:25,32:32,38:38").Select Range("A38").Activate ActiveWindow.SmallScroll Down:=6 Range("25:25,32:32,38:38,45:45").Select Range("A45").Activate ActiveWindow.SmallScroll Down:=9 Range("25:25,32:32,38:38,45:45,52:52").Select Range("A52").Activate ActiveWindow.SmallScroll Down:=6 Range("25:25,32:32,38:38,45:45,52:52,59:59").Select Range("A59").Activate ActiveWindow.SmallScroll Down:=12 Range("25:25,32:32,38:38,45:45,52:52,59:59,66:66").Select Range("A66").Activate ActiveWindow.SmallScroll Down:=6 Range("25:25,32:32,38:38,45:45,52:52,59:59,66:66,70:70,74:74").Select Range("A74").Activate ActiveWindow.SmallScroll Down:=12 Range("25:25,32:32,38:38,45:45,52:52,59:59,66:66,70:70,74:74,78:78,85:85"). _ Select Range("A85").Activate ActiveWindow.SmallScroll Down:=3 Selection.EntireRow.Hidden = True ActiveWindow.SmallScroll Down:=-69 Range("AL15:CE16").Select End Sub と Sub ひらく1() ActiveWindow.SmallScroll Down:=3 Rows("21:87").Select Selection.EntireRow.Hidden = False Range("AL15:CE16").Select End Sub をボタンで実行しています。 これを「A1」(仮)に入力すると「とじる」、空白なら「ひらく」にしたいのです。 ご回答いただいたコードを行に変えてやってみます。

関連するQ&A

専門家に質問してみよう