質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

2415閲覧

VBAにてボタン+-で行を隠したり表示させるようにしたい

nissanngtr34

総合スコア24

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2015/10/02 02:45

+や-ボタンを押した数だけ1行分隠れたり表示するというプログラミングをしたいのですがアルゴリズムが思いつかず悩んでいます。

隠す行の範囲の上限は決まっていて、79から108行です。
-ボタンの行を隠す機能は、1度押すと108行目が隠れ、さらにもう一度押すと107行目が隠れ・・・という感じにしたいです。

しかし下のプログラミングだとボタン一つですべての行が消えてしまい困っています。
押した数だけ一番下の行から隠していくにはどうすればよろしいでしょうか?

アドバイスよろしくお願いします。

Sub Sample1() Dim takasa As Integer takasa = 79 For i = takasa To 108 If Rows(i).Hidden = False Then Rows(i).Hidden = True End If Next

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

for文でまわしてしまうと、全部を対象にして実施してしまうので、
結局全部非表示にしてしまっているのではないかと思います。
for文は不要だと思います。

-ボタンが押された時点で一番下にある行が非表示になっていればいいのですよね?
変数をsubの外側に宣言してあげれば、値を保ち続けてくれるので、
その値をsubの中で参照して計算すればいいと思います。


追記:
「各ボタンを押す回数=subを実行する回数」
だと解釈しているので、for文を使わないというのは、Row()で指定するときに
Row(○:△) のように指定すればいいと思ったからです。
(※○と△は数値です)

隠す行の範囲の上限は決まっていて、79から108行です。

ということなので、計算してがっつり指定して非表示にしたほうが効率もいいし
処理も早いと思います。

for文なしでつくってみました↓

Private Const max As Integer = 108 Private Const min As Integer = 79 Private Const limits As Integer = 30 'max-min+1 Private hideRowsCnt As Integer '消している行数 '「-」ボタンから実行 Sub minus() '消している行数分非表示にする Dim hideStart As Integer hideStart = max - hideRowsCnt Rows(hideStart & ":" & max).Hidden = True '消している行数を1増やす hideRowsCnt = hideRowsCnt + 1 '範囲チェック If hideRowsCnt > limits Then hideRowsCnt = limits End If End Sub

minus()を「-」ボタンから呼び出します。
押された分実行されるので、グローバル変数の値が変わります。
「+」ボタンから呼び出すほうも、同じ感じで作れると思います。

いかがでしょう?
もちろん、範囲が決まってなくて・・・という場合でしたら、
for文でまわして一番最後の行から探すとかしなくてはならないかと思います。

投稿2015/10/02 03:01

編集2015/10/02 06:31
kaputaros

総合スコア1844

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nissanngtr34

2015/10/02 04:13

ご返答ありがとうございます。 for文無しで作れるのですか?すみません。よくわらなくて。
kaputaros

2015/10/02 06:29 編集

すいません。 > 全部隠したあとに、前の行までを表示してあげるのはどうでしょう?? というのは忘れてください。 私の勘違いです。 ちょっと作ってみたのを↑の回答に追記しました。 (ここに書いたら見づらかったので。。。すいません。)
Tak1wa

2015/10/02 06:34

メンバに保持するのも一案かと思いますが、Excelということなので手動で行の非表示を行うケースを考慮する必要があり得るかもしれません。そういった場合は念の為表示されている非表示かを舐めたほうが良いかなという気もします。 ※ただ手動をどこまで考慮できるか、という問題もありますかね…。
kaputaros

2015/10/02 07:21

> Tak1waさん なるほど、手で直接消されたりするのは想定外でした。 そういう場合だと狂ってしまいますね^^;
Tak1wa

2015/10/02 07:25

手で意図的に消されるのはイレギュラーですが、一部の行を今回のマクロで非表示→ファイルを保存→再度開いてマクロを実行、とか正常系でもあり得るかもしれませんね。
nissanngtr34

2015/10/04 11:03

お返事ありがとうございます。 先ほど気が付きまして、遅くなりました。 なるほど。具体的にソースを書いて頂き、ありがとうございます。 とても参考になります。 こちらの手法でも作ってみます。
kaputaros

2015/10/05 01:29

> Tak1waさん ご指摘ありがとうございます! そうか、一度閉じてしまうと変数に設定した値がクリアされてしまうんですね。。。 ファイルを再度開くときに全部表示させるとか、どこまで隠しているかを調べるとか、 別の処理が必要になってきそうですね^^; > nissanngtr34 解決できそうで何よりです^^ ただ、Tak1waさんのご指摘にもありますように、 きちんと動作させるためには前提条件があるので、その辺を考慮してくださいね。
guest

0

こんにちは。

下の行から処理したいのであればループの回し方を逆にしましょう。
そして単一行に対して隠す処理を適用したらExit Forでループを終了することです。

投稿2015/10/02 03:01

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nissanngtr34

2015/10/02 03:09

ご返答ありがとうございます。 逆ということは108から始めるということでしょうか? なるほど。隠したらすぐExit Forでループを終了するのですね。
nissanngtr34

2015/10/02 03:22

教えて頂いたとおりにすると動きました。ありがとうございます。 Sub Sample1() For i = 108 To 79 Step -1 If Rows(i).Hidden = False Then Rows(i).Hidden = True Exit For End If Next End Sub
guest

0

一行HiddenをいじったらすぐにExit Subするとか。

投稿2015/10/02 03:01

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nissanngtr34

2015/10/02 03:08

ご返答ありがとうございます。 隠したらループを抜けるという感じですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問