
先日EXCELの質問をさせて頂きました。
https://oshiete.goo.ne.jp/qa/8944333.html
EXCELマクロで、ある列の値が0の場合、非表示/表示ボタンで該当列を非表示切り替えしたいんです。
行ではできましたが、列ではできませんでした。またボタンのワンクリックで同時に表示切り替えできれば最高です。
ちなみに行は物件名、列は業者名で入出金のあった物件以外は非表示、使用しなかった業者以外は非表示にしたいのです。
つまり業者別計で0あるいは、物件別計で0であった行あるいは列は非表示にしたいのです。
逆に考えれば計が0以外である行または列は表示でもよいのかもしれません。
何卒諸先輩方のお知恵を拝借したく存じます。宜しくお願いいたします。
No.5ベストアンサー
- 回答日時:
たびたびごめんなさい。
前回のコードではセルの表示形式は「数値」ではなく「通貨」になってしまいますね。
見た目は同じのようですが、どうしても「数値」で桁区切りにしたい場合は
あらかじめ設定してある表示形式を使った方が良いみたいなので↓のコードに変更してみてください。
Private Sub CommandButton1_Click()
Dim c As Range, myFlg As Boolean
Dim myFirst As Range, myFound As Range, myRng As Range
Dim myArea1 As Range, myArea2 As Range
Dim str1 As String, str2 As String '//☆新たに追加
Set myArea1 = Range("BM3:BM749")
Set myArea2 = Range("E750:ML750")
Application.ScreenUpdating = False
str1 = myArea1(1).NumberFormatLocal '//☆
str2 = myArea2(1).NumberFormatLocal '//☆
myArea1.NumberFormatLocal = "G/標準" '//★追加
myArea2.NumberFormatLocal = "G/標準" '//★追加
For Each c In myArea1
If c.EntireRow.Hidden = True Then
myFlg = True
Exit For
End If
Next c
If myFlg = True Then
ActiveSheet.Rows.Hidden = False
Else
Set myFound = myArea1.Find(what:=0, LookIn:=xlValues, lookat:=xlWhole)
If Not myFound Is Nothing Then
Set myFirst = myFound
Set myRng = myFound
Do
Set myFound = myArea1.FindNext(after:=myFound)
If myFound.Address = myFirst.Address Then Exit Do
Set myRng = Union(myRng, myFound)
Loop
myRng.EntireRow.Hidden = True
End If
End If
myFlg = False
For Each c In myArea2
If c.EntireColumn.Hidden = True Then
myFlg = True
Exit For
End If
Next c
If myFlg = True Then
ActiveSheet.Columns.Hidden = False
Else
Set myFound = myArea2.Find(what:=0, LookIn:=xlValues, lookat:=xlWhole)
If Not myFound Is Nothing Then
Set myFirst = myFound
Set myRng = myFound
Do
Set myFound = myArea2.FindNext(after:=myFound)
If myFound.Address = myFirst.Address Then Exit Do
Set myRng = Union(myRng, myFound)
Loop
myRng.EntireColumn.Hidden = True
End If
End If
myArea1.NumberFormatLocal = str1 '//☆
myArea2.NumberFormatLocal = str2 '//☆
Application.ScreenUpdating = True
End Sub
何度も失礼しました。m(_ _)m
何度も何度もご協力頂ありがとうございました。おかげでうまく行きました\(^O^)/
一つ肩の荷が取れとてもHappyです(☆。☆)
m(_ _)m
No.4
- 回答日時:
はぁ~~~!
そういうコトだったのですね。
それでは一旦セルの表示形式を「標準」にしてマクロを実行 → セルの表示形式をもとに戻す
といった感じではどうでしょうか?
もう一度コードを載せてみます。(★の行が追加です)
Private Sub CommandButton1_Click()
Dim c As Range, myFlg As Boolean
Dim myFirst As Range, myFound As Range, myRng As Range
Dim myArea1 As Range, myArea2 As Range
Set myArea1 = Range("BM3:BM749")
Set myArea2 = Range("E750:ML750")
Application.ScreenUpdating = False
myArea1.NumberFormatLocal = "G/標準" '//★追加
myArea2.NumberFormatLocal = "G/標準" '//★追加
For Each c In myArea1
If c.EntireRow.Hidden = True Then
myFlg = True
Exit For
End If
Next c
If myFlg = True Then
ActiveSheet.Rows.Hidden = False
Else
Set myFound = myArea1.Find(what:=0, LookIn:=xlValues, lookat:=xlWhole)
If Not myFound Is Nothing Then
Set myFirst = myFound
Set myRng = myFound
Do
Set myFound = myArea1.FindNext(after:=myFound)
If myFound.Address = myFirst.Address Then Exit Do
Set myRng = Union(myRng, myFound)
Loop
myRng.EntireRow.Hidden = True
End If
End If
myFlg = False
For Each c In myArea2
If c.EntireColumn.Hidden = True Then
myFlg = True
Exit For
End If
Next c
If myFlg = True Then
ActiveSheet.Columns.Hidden = False
Else
Set myFound = myArea2.Find(what:=0, LookIn:=xlValues, lookat:=xlWhole)
If Not myFound Is Nothing Then
Set myFirst = myFound
Set myRng = myFound
Do
Set myFound = myArea2.FindNext(after:=myFound)
If myFound.Address = myFirst.Address Then Exit Do
Set myRng = Union(myRng, myFound)
Loop
myRng.EntireColumn.Hidden = True
End If
End If
myArea1.NumberFormatLocal = "#,##0" '//★追加
myArea2.NumberFormatLocal = "#,##0" '//★追加
Application.ScreenUpdating = True
End Sub
※ セルの表示形式で小数点以下は表示させないようにしていますが、
実際のデータに合わせて、小数点以下第1位まで表示させたい場合は
>.NumberFormatLocal = "#,##0.0"
といった感じで適宜応用してみてください。m(_ _)m
No.3
- 回答日時:
続けてお邪魔します。
なかなかご希望通りの動きにならないようで・・・
>当方はなんとExcel2011を使用しており
Mac版のExcelなのですね?
Mac版は手元にないので検証はできませんが、おそらくコードそのものは問題ないと思います。
前回のコードでは↓の画像(小さくて判り難いと思いますが、見た目だけで!)
数値が入っているのはBM列と750行目だけで、
黄色のセルの部分に「0」が入っています。
コマンドボタンをクリックするたびに、黄色の列・行が表示/非表示になります。
前回のコードと同じ内容ですが、少し手を加えてみました。
Private Sub CommandButton1_Click()
Dim c As Range, myFlg As Boolean
Dim myFirst As Range, myFound As Range, myRng As Range
Dim myArea1 As Range, myArea2 As Range
Set myArea1 = Range("BM3:BM749")
Set myArea2 = Range("E750:ML750")
Application.ScreenUpdating = False
For Each c In myArea1
If c.EntireRow.Hidden = True Then
myFlg = True
Exit For
End If
Next c
If myFlg = True Then
ActiveSheet.Rows.Hidden = False
Else
Set myFound = myArea1.Find(what:=0, LookIn:=xlValues, lookat:=xlWhole)
If Not myFound Is Nothing Then
Set myFirst = myFound
Set myRng = myFound
Do
Set myFound = myArea1.FindNext(after:=myFound)
If myFound.Address = myFirst.Address Then Exit Do
Set myRng = Union(myRng, myFound)
Loop
myRng.EntireRow.Hidden = True
End If
End If
myFlg = False
For Each c In myArea2
If c.EntireColumn.Hidden = True Then
myFlg = True
Exit For
End If
Next c
If myFlg = True Then
ActiveSheet.Columns.Hidden = False
Else
Set myFound = myArea2.Find(what:=0, LookIn:=xlValues, lookat:=xlWhole)
If Not myFound Is Nothing Then
Set myFirst = myFound
Set myRng = myFound
Do
Set myFound = myArea2.FindNext(after:=myFound)
If myFound.Address = myFirst.Address Then Exit Do
Set myRng = Union(myRng, myFound)
Loop
myRng.EntireColumn.Hidden = True
End If
End If
Application.ScreenUpdating = True
End Sub
※ 今回は上記コードで検証してみました。
こちらではちゃんと動くみたいです。m(_ _)m

No.2
- 回答日時:
No.1です。
>具体的にはBM3:BM749(縦列)の集計値列、そしてE750:ML750(横列)の集計値行でどちらか1つでも0があった該当列または行に関して非表示としたいのです。
はぁ~~~!そういうコトだったのですね。
コマンドボタンを押下するたびに、
BM3~BM749セル内のが「0」の行とE750~ML750セル内の「0」の列を
コマンドボタンを押下するたびに 非表示/再表示 となれば良い訳ですね。
↓のコードに変更してみてください。
Private Sub CommandButton1_Click()
Dim i As Long, j As Long, myFlg As Boolean
Dim FirstCell As Range, FoundCell As Range, myArea As Range
Dim myRng1 As Range, myRng2 As Range
Set myRng1 = Range("BM3:BM749")
Set myRng2 = Range("E750:ML750")
Application.ScreenUpdating = False
For i = 3 To 749 '//3行目~749行目まで
If Rows(i).Hidden = True Then
myFlg = True
Exit For
End If
Next i
If myFlg = False Then
Set FoundCell = myRng1.Find(what:=0, LookIn:=xlValues, lookat:=xlWhole)
If Not FoundCell Is Nothing Then
Set FirstCell = FoundCell
Set myArea = FoundCell
Do
Set FoundCell = myRng1.FindNext(after:=FoundCell)
If FoundCell.Address = FirstCell.Address Then Exit Do
Set myArea = Union(myArea, FoundCell)
Loop
myArea.EntireRow.Hidden = True
End If
Else
ActiveSheet.Rows.Hidden = False
End If
myFlg = False
For j = 5 To 350 '//E列~ML列まで
If Columns(j).Hidden = True Then
myFlg = True
Exit For
End If
Next j
If myFlg = False Then
Set FoundCell = myRng2.Find(what:=0, LookIn:=xlValues, lookat:=xlWhole)
If Not FoundCell Is Nothing Then
Set FirstCell = FoundCell
Set myArea = FoundCell
Do
Set FoundCell = myRng2.FindNext(after:=FoundCell)
If FoundCell.Address = FirstCell.Address Then Exit Do
Set myArea = Union(myArea, FoundCell)
Loop
myArea.EntireColumn.Hidden = True
End If
Else
Columns.Hidden = False
End If
Application.ScreenUpdating = True
End Sub
※ じっくり考えればもっと簡単になるかもしれませんが、
とりあえずはこの程度で・・・m(_ _)m
No.1
- 回答日時:
こんばんは!
前回はオートフィルタで処理していましたが、列方向に関してのオートフィルタは使えませんので
ループさせる方法です。
今回は特定の列を指定せず
A列~1行目のデータがある最終列までで、その列に一つでも「0」があればその列を非表示としています。
Private Sub CommandButton1_Click()
Dim j As Long, lastCol As Long, c As Range, myFlg As Boolean
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
Application.ScreenUpdating = False
For j = 1 To lastCol
If Columns(j).Hidden = True Then
myFlg = True
Exit For
End If
Next j
If myFlg = True Then
Columns.Hidden = False
Else
For j = 1 To lastCol
Set c = Columns(j).Find(what:=0, LookIn:=xlValues, lookat:=xlWhole)
If Not c Is Nothing Then
Columns(j).Hidden = True
End If
Next j
End If
Application.ScreenUpdating = True
End Sub
※ もっとスマートに出来るかもしれませんが
とりあえずはこの程度で・・・m(_ _)m
早速のそして連日のご回答大変感謝いたします。
さて、当方はなんとExcel2011を使用しており、もしかしたら互換性の問題があるのかもしれません。。。
tom04様のスクリプトを入力してみたのですが、なぜか動作しません。
具体的にはBM3:BM749(縦列)の集計値列、そしてE750:ML750(横列)の集計値行でどちらか1つでも0があった該当列または行に関して非表示としたいのです。
難しい質問とは重々承知ですが、何卒ご教示のほどよろしくおねがいいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【マクロ】マクロが保存されているエクセルとは、別のエクセルブックの全シートの非表示列を再表示したい 1 2022/12/24 20:48
- Excel(エクセル) 【マクロ】リボン、行列、数式・ステータスバを非表示に 4 2022/12/12 07:32
- Visual Basic(VBA) Excel VBA キーワードから列を取得して、さらに空欄行を非表示にする 3 2022/10/21 22:49
- Visual Basic(VBA) VBAで列の再表示設定 1 2023/04/25 10:19
- Visual Basic(VBA) 【Excel VBA】条件に合った行の表示・非表示を行う方法 3 2023/03/18 12:31
- Excel(エクセル) 関数を教えてください。 2 2023/08/01 10:59
- Excel(エクセル) Excelのテーブルについて 6 2023/07/07 08:37
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/17 11:59
- Visual Basic(VBA) VBAで早押しゲームを作りたい 4 2022/05/12 13:46
- Visual Basic(VBA) VBA 複数のブックに同じ列を表示させる方法 2 2022/07/20 23:49
このQ&Aを見た人はこんなQ&Aも見ています
-
エクセルで特定の列が0表示の場合、その行を非表示にしたい
Excel(エクセル)
-
EXCELマクロで、ある列の値が0の場合、非表示/表示ボタンで該当列を非表示切り替えしたいんです。
Excel(エクセル)
-
エクセルで特定の値を含む列のみVBAで非表示にしたい
Excel(エクセル)
-
-
4
列の数値が0の場合、行を非表示もしくは削除したい
財務・会計・経理
-
5
エクセル~空白のセルのある行を非表示に。
Excel(エクセル)
-
6
EXCEL VBA 指定範囲内で特定の列に空白セルを含む行を非表示
Excel(エクセル)
-
7
あるセルに特定の文字列を打つと、他のセルに決められた文字が自動入力するように
Excel(エクセル)
-
8
エクセル:条件付の行非表示
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで二つの数字の小さい...
-
PowerPointで表の1つの列だけ...
-
2つのエクセルのデータを同じよ...
-
Excelで半角の文字を含むセルを...
-
EXCELで 一桁の数値を二桁に
-
オートフィルターをかけ、#N/A...
-
エクセル(勝手に太字になる)
-
エクセルで文字が混じった数字...
-
エクセルで最初のスペースまで...
-
Excel、市から登録している住所...
-
Excel 文字列を結合するときに...
-
エクセルの並び変えで、空白セ...
-
「B列が日曜の場合」C列に/...
-
エクセルの項目軸を左寄せにしたい
-
エクセルで一行毎、一枚づつ自...
-
エクセル 文字数 多い順 並...
-
エクセル 時間帯の重複の有無
-
エクセルマクロ:複数列 重複...
-
エクセルの表から正の数、負の...
-
エクセル 同じ値を探して隣の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで二つの数字の小さい...
-
PowerPointで表の1つの列だけ...
-
EXCELで 一桁の数値を二桁に
-
エクセルで最初のスペースまで...
-
2つのエクセルのデータを同じよ...
-
エクセルで文字が混じった数字...
-
エクセル(勝手に太字になる)
-
エクセル 文字数 多い順 並...
-
Excelで半角の文字を含むセルを...
-
「B列が日曜の場合」C列に/...
-
エクセルで、列の空欄に隣の列...
-
Excel 文字列を結合するときに...
-
Excel、市から登録している住所...
-
【VBA】特定列に文字が入ってい...
-
エクセルのセル内の文字の一部...
-
エクセル 同じ値を探して隣の...
-
お店に入るために行列に並んで...
-
エクセルの並び変えで、空白セ...
-
文字列に数字を含むセルを調べたい
-
エクセルの項目軸を左寄せにしたい
おすすめ情報
ご回答ありがとうございます。ヽ(´ー`)ノ
うーん、うまくいかない…。クリックしても何も起きず…。
試行錯誤しても…、やっぱり私の勉強不足です、ついて行けてない自分がくやしい(涙)
早速のご回答有り難うございます。
そしてご丁寧にとてもわかりやすかったです。
マクロが動かなかった原因がわかりました。
セルの書式が"数値"だったためでした。試しに"標準"にしてみたところ0の列が消えてヽ(´ー`)ノ
Windows8のExcelでやってみましたが同様でした。
なぜ数値にしたかというと、やはり1000区切りのコンマが欲しかったからです。
セルの書式を数値にしても動くようにするにはどうすればよいのか、こちらもできればご教示願えれば幸いです。度々申し訳ございませんが何卒宜しくお願いいたします。
ちなみに…。
こちらも可能であればお力添えをいただければ幸いです。(ToT)
https://oshiete.goo.ne.jp/qa/8946913.html