「教えて!ピックアップ」リリース!

はじめまして
エクセルでちょっと困っているので、質問させていただきます。
お答えいただけましたら幸いです。

「S4」のセルが空欄("")ならば42の行を非表示
「V4」のセルならば43、「Y4」ならば44の行を非表示にしたいです。

これがセットになっており、
「S5」「V5」「Y5」はそれぞれ48,49,50の行
「S6」「V6」「Y6」では54,55,56の行を

このまま同間隔で「S29」「V29」「Y29」の192,193,194までを非表示にしたいです。

なにか手立てはないものでしょうか。
ぜひともお願いします。

A 回答 (2件)

必ずバックアップを取ってからお試しください。



1.エクセル上で、Alt+F11 (Visual Basic For Applicationsの画面が開く)
2.左端のほうにある「プロジェクトウィンドウ」の中で、当該ファイル名の「VBA Project」
 みたいなところを見つける
3.当該シート(たとえばSheet1)のところをダブルクリックする
4.真っ白な画面が開くので、以下をそこにコピペ

'----------------------------------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)

Dim r As Integer, c As Integer, p As Integer
Dim k As Integer, Gyo(75) As Variant, Flg As Boolean
p = 0

Application.ScreenUpdating = False

For c = 19 To 25 Step 3
For r = 4 To 29
If Cells(r, c).Value = "" Then
Select Case c
Case 19
k = 6 * r + 18
Case 22
k = 6 * r + 19
Case 25
k = 6 * r + 20
End Select
Gyo(p) = k
p = p + 1
End If
Next r
Next c


For r = 194 To 42 Step -1
For p = LBound(Gyo) To UBound(Gyo)
If Gyo(p) = r Then
Flg = True
Exit For
End If
Next p

If Flg = True Then
Rows(r).Hidden = True
ElseIf Flg = False Then
Rows(r).Hidden = False
End If
Flg = False
Next r

Application.ScreenUpdating = True

End Sub
'---------------------------------------------------------

5. エクセル画面に戻り、どこか空欄にして試してみてください。

ご意向にそぐっていますか。

念のため概要を。
・このシート内のセルに変化が起きたら実行されるマクロです。
・4行目~29行目までの、S、U、Y列のセルを見に行き、
・空欄だったら、それに該当する行(非表示にしたい行)を、
・配列Gyoに格納。(非表示にする行の、いわば一覧表を作ってます)
・そのあと、非表示にする対象の行(42~194行)ごとに、配列Gyoに居るかどうかを
確認し、居たら非表示、居なかったら表示 
としています。
    • good
    • 2
この回答へのお礼

残念ながらまだ試せてはいませんが、迅速な回答をいただけた「soixante」さんをベストアンサーとさせていただきました。
ありがとうございました。

お礼日時:2015/08/27 21:02

こんばんは!


一例です。

画面左下の操作したいSheet見出し上で右クリック → コードの表示 → VBE画面のカーソルが点滅しているところに
↓のコードをコピー&ペースト → Excel画面に戻り(VBE画面を閉じて)マクロを実行してみてください。
(Alt+F8キー → マクロ → マクロ実行です)

Sub 非表示() 'この行から//
Dim i As Long, k As Long, myRow As Long
Dim myRng As Range, myAry As Variant
myAry = Array(19, 22, 25) '←S・V・Y列の列番号を格納//
For k = 0 To UBound(myAry)
For i = 4 To 29
If Cells(i, myAry(k)) = "" Then
Select Case k
Case 0
myRow = 1
Case 1
myRow = 3
Case Else
myRow = 5
End Select
If myRng Is Nothing Then
Set myRng = Cells(i * 6 + myAry(k) - myRow, myAry(k))
Else
Set myRng = Union(myRng, Cells(i * 6 + myAry(k) - myRow, myAry(k)))
End If
End If
Next i
Next k
If Not myRng Is Nothing Then
myRng.EntireRow.Hidden = True
End If
End Sub 'この行まで//

※ 再表示のコードも必要だと思いますので、
同じVBE画面のコードが記載されている下側に↓のコードを追加し、
行を再表示したい場合は「表示」のマクロを実行してください。

Sub 表示()
ActiveSheet.Rows.Hidden = False
End Sub

※ Changeイベントではありませんので、データ変更があるたびに
手作業でマクロを実行してください。

こんな感じではどうでしょうか?m(_ _)m
    • good
    • 5
この回答へのお礼

Thank you

データ変更のにも対応できるやり方まで教えていただき本当にありがとうございました。
明日、使用してみたいと思います!

お礼日時:2015/08/27 20:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング