アプリ版:「スタンプのみでお礼する」機能のリリースについて

ボタン一個で表示非表示切り替えマクロについて教えてください。
長文失礼します。マクロ初心者です。
まず画面は以下の通りです。

ー A B C ・・
1 取引名 区分 費目
2 ◯システム 前期 円
3 空白 後期 円
4 空白 実績
ーーーーーーーーーーーーーーーーーーーーー
5 ▲システム 前期
6 空白 後期
7 空白 実績
ーーーーーーーーーーーーーーーーーーーーー

・ (★3行ずつ×10〜15コ分続く)
・ (★取引名がないとこは3行とも空白)
ーーーーーーーーーーーーーーーーーーー
20 小計 前期計
21 後期計
22 合計
23 実績計 (★小計欄は4行)
ーーーーーーーーーーーーーーーーーーーーーー
ここまでで1項目、(運用、保守などで区切っています)
次は保守の、同じのが。という風に1000行以上続きます。

別のファイルの取引no.と一致したら費目金額を反映させるマクロを取り込みボタンに設定中なので、
このフォーマットは変えられません。

そして、今回作成しなければならないのが、
表示非表示切り替えボタンです。
3行の一番上に取引名が入り、下2行は空白です。
一番上に取引名が入ってなかったら、以下の3行まとめて非表示/表示を切り替えたいんです。
現状、基本は1項目につき3行ずつ×10ですが
取引名が多数あるものはその分増やしているので統一はしていません。

また、各項目1つでも取引名があれば小計欄は非表示しない。
0だったら小計欄も非表示にする。
というルールです。


先方のお願いは
ボタン一個で、表示をクリックしたら表示され、ボタンの名前は非表示に変わり、非表示をクリックしたら非表示になり、名前は表示に、ということなのですが、


全然できてないのですが、
私が今考えていたコードは

If 切り替え.Caption = ”表示” Then
For i = 2 To LastRow Step 3
★まずここで、3行ずつ回すも、小計欄は4行なのでどうしたらいいのか
続き

If Cells(i,1) <> ”” And _
Cells(i,1) <> ”小計” Then
icnt = icnt + 1
EndIf
値があったらカウントし
後に、icnt>=1 Then
小計欄は残す、という流れをイメージしたのですが…


If Cells(i,1)= ”” Then
Rows(i).Hidden

If Cells(i,1) = ”小計” Then
If icnt>=1 Then
という流れにする場合、
もし残すなら、
次の項目からまたスタートとなるにはどうすればいいのか…
非表示の場合まとめて4行はアクティブセル+3という式にしたらいいのか、、
すみませんがもしよろしければコードをご教示ください。

質問者からの補足コメント

  • with 切り替え

    If 切り替え.Caption = ”表示” Then
    .Caption = ”非表示”

    Else
    Rows.Hidden = False
    .Caption = ”表示”

    Endwith
    を追記しました。

    If Cells(i,1) = ”” Then
    Range(Cells(i,1),Cells(i+3,1)).EntireRow.Hidden = True
    としましたが、
    プラス3という記述はダメでしょうか。

      補足日時:2017/03/22 15:21

A 回答 (2件)

こんにちは



ご質問文で一番わからないのが、項目と次の項目の間は隙間なく連続しているのか、空白行や再度タイトルが記されていたりしないのかといったことでしょうか。
空白行がある場合は、きちんと行数が決まっているのか、気まぐれに1行だったり2行だったりするのかということ。


はっきりしないので、コードは示せませんが、少しは考え方のヒントにでもなれば・・・

方法はいろいろあると思いますが、ひとまとまりで考える行数が一定ではないので、ご提示のようにFORループで一律にStep 3としたのではうまくいかないと思います。

一例として、調べる対象の行(先頭行)を変数rwとして、順に見ていくものと考えた場合

 rw = 2 '←対象行の初期値
 Do While rw <= LastRow
  If Cells(rw, 1).Value = "小計" Then
   '小計の場合の処理
   ' ~~~
   rw = rw + 4 '←次の行(4でよいのか不明ですが)
  Else
   '3行セットの場合の処理
   ' ~~~
   rw = rw + 3 '←次の行
  End If
 Loop

のような考え方にすれば、対象の行数が異なる場合でも、条件分けして処理をすることで、次に参照する行までの行数を変えることが可能です。
上の例では、小計欄の4行の1行目には必ず「小計」と記されていて、それで識別しても良いとの保証があるものと仮定しています。(取引名には「小計」というものは絶対に存在しないなど)
    • good
    • 0

>7 空白 実績


> (★3行ずつ×10〜15コ分続く)
>20 小計 前期計

はて?38以上になると思うがなぜに20?


>Range(Cells(i,1),Cells(i+3,1)).EntireRow.Hidden = True
>としましたが、プラス3という記述はダメでしょうか。

文法的に全く問題ないですよ。
ただi,i+1,i+2,i+3 、で四つありますね。
「ダメでしょうか。」だけでは何がダメなのか判らないです。


私が思うに
ボタン設けるよりも取引名の空白最上段のみ残して
以下は隠しておけば入力された時に、その下3行表示して
クリアされたらその下3行消すでいけるんじゃないかと。
ボタン無しで実現できるから。

この最後に小計の処理を入れたらいいんじゃないかな。

以下は取引名が8行目から始まる前提で書いてみました。

動的部分だけなので表示の時、別途
取引名の空白最上段のみ残して以下は隠しておくが必要です。

取引名を入力いただくと判ります。


Const 余り = 2 '0~2 で実体に合わせる
Const 開始行 = 6 + 余り
Const 最終行 = 33 + 余り

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long
If Target.Row Mod 3 = 余り And Target.Column = 1 Then
Application.EnableEvents = False
For i = 最終行 To Target.Row Step -3
If Cells(i, 1) = "" Then
If Cells(i + 1, 1).Height > 0 Then
Cells(i + 1, 1).Resize(3).EntireRow.Hidden = True
End If
Else
Cells(i + 1, 1).Resize(3).EntireRow.Hidden = False
End If
Next
’           小計の処理書くならここ
Application.EnableEvents = True
End If
End Sub
    • good
    • 0

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