Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(指定なし : 指定なし)
条件による行の非表示について
投稿日時: 19/07/11 16:03:05
投稿者: HAL22

B列が空白の場合は、その行を非表示にしたいのですが
宜しくお願い致します。
※B列は結合しています。
 
例として
セル番地B6(6/7行目) セル番地B8(8/9行目)を非表示に
したいと考えています。
  
   
   
     B列
----------------------
4行目
5行目 2019年8月1日 →セル番地B4
 ----------------------
6行目
7行目        →セル番地B6
 ----------------------
8行目
9行目        →セル番地B8
----------------------  
 
また、現在この様に作成していますので
印刷時に行を非表示設定を行いたいと思います。
 
 
Sub 印刷()
 
Dim Result As Long
 Result = MsgBox("印刷しますか?", vbYesNo + vbExclamation, "印刷確認")
     
    If Result = vbYes Then
 
  
 
 ''[はい]がクリックされたときの処理
    Sheets("表-1").PrintOut
 
 
 
  Else
        ''[いいえ]がクリックされたときの処理
         
 'MsgBox "処理を中止します", vbCritical
  Result = MsgBox("処理を中止しました。", vbOKOnly + vbCritical, "印刷確認")
    End If
   
End Sub
 
 
宜しく、お願い致します。

回答
投稿日時: 19/07/11 16:44:49
投稿者: Suzu

Excel表の行の非表示について
https://www.moug.net/faq/viewtopic.php?t=78434
 
閉じたんだから納得されたのではないのでしょうか?
 
オートフィルターの部分を、マクロの記録をしてみてはいかがですか?
 
あるいは、こうやりたい けど、ここの部分 の考え方やコードが判りません
 
ってのなら積極的に、アドバイスしようと思いますが
 
 
このご質問の仕方は、コード作成依頼にしか見えません。
 
 
複数行にわたってセルの結合を行った場合、
今回の様に、B4 値なし、B5値あり のだと、B4に値が引き継がれ、B5には値なし になります。
     → 連結解除をしてみれば判ります。

投稿日時: 19/07/11 17:27:32
投稿者: HAL22

本当に、噂通りサイトは正確の悪い集団です。
 
 
 
>閉じたんだから納得されたのではないのでしょうか?
→ダメがから再度でしょ。
  
>オートフィルターの部分を、マクロの記録をしてみてはいかがですか?
→オートフィルター 使えなかったのですから、無意味です。

回答
投稿日時: 19/07/11 18:16:20
投稿者: sk

引用:
B列が空白の場合は、その行を非表示にしたい

引用:
※B列は結合しています。

Dim ws As Excel.Worksheet
Dim rngColumn As Excel.Range
Dim rngCell As Excel.Range
Dim lngFirstRow As Long
Dim lngLastRow As Long
 
Set ws = ActiveSheet
 
lngFirstRow = 1
With ws.UsedRange
    lngLastRow = .Cells(.Rows.Count, .Columns.Count).Row
End With
 
Set rngColumn = ws.Range(ws.Cells(lngFirstRow , 2), _
                         ws.Cells(lngLastRow, 2))
 
rngColumn.EntireRow.Hidden = False
 
For Each rngCell In rngColumn
    With rngCell
        If .Address = .MergeArea.Cells(1, 1).Address Then
            If .Value = "" Then
                .MergeArea.EntireRow.Hidden = True
            End If
        End If
    End With
Next
 
Set rngColumn = Nothing
Set ws = Nothing
 
---------------------------------------------------------------
 
先頭行/最終行の指定は適当にどうぞ。
 
引用:
印刷時に行を非表示設定を行いたいと思います。

印刷が完了したら非表示化された行を再表示するように
なさればよろしいでしょう。

投稿日時: 19/07/11 18:41:07
投稿者: HAL22

sk さん
 
ありがとうございます。
レベルが高くて、理解出来ません。
 
質問です。
 
>先頭行/最終行の指定は適当にどうぞ。
→先頭行/最終行の指定はどれですか?
 
 
>印刷が完了したら非表示化された行を再表示するように
>なさればよろしいでしょう。
→はい、問題ありません。
 
 
今、私が使用している
コードとどの様に組合わせて(どこへ記載)使用したらいいのでしょうか?
Sub 印刷()
   
Dim Result As Long
  Result = MsgBox("印刷しますか?", vbYesNo + vbExclamation, "印刷確認")
       
     If Result = vbYes Then
   :
   :
 
申し訳別けありませんが、宜しくお願い致します。

回答
投稿日時: 19/07/11 23:32:58
投稿者: simple

前のスレッドのダミー列の数式は、開始行が偶数ならそれでよいし、
もし奇数なら、
=(INDEX(B:B,ROW()-MOD(ROW()+1,2))<>"")*1
とすればきちんと機能するはずです。
不明点を放置せず、再質問したほうが良かったと思います。
 
そう言うまっとうな指摘に対して、
> 本当に、噂通りサイトは正確の悪い集団です。
という言葉を使うのなら、残念ながら自ら退出されたほうがよいのではないですか?
その後の言葉からしても、とても人にものを尋ねる態度とは思えません。

回答
投稿日時: 19/07/12 09:36:32
投稿者: sk

HAL22 さんの引用:
先頭行/最終行の指定はどれですか?

引用:
lngFirstRow = 1
With ws.UsedRange
    lngLastRow = .Cells(.Rows.Count, .Columns.Count).Row
End With

HAL22 さんの引用:
今、私が使用している
コードとどの様に組合わせて(どこへ記載)使用したらいいのでしょうか?

HAL22 さんの引用:
''[はい]がクリックされたときの処理
Sheets("表-1").PrintOut

あとは以下の箇所をそれぞれ修正なさればよいでしょう。
 
引用:
Set ws = ActiveSheet

Set ws = Worksheets("表-1")
 
HAL22 さんの引用:
Sheets("表-1").PrintOut

引用:
Set rngColumn = Nothing
Set ws = Nothing

ws.PrintOut
 
rngColumn.EntireRow.Hidden = False
 
Set rngColumn = Nothing
Set ws = Nothing

回答
投稿日時: 19/07/12 12:56:02
投稿者: どら

誤)正確の悪い集団です。
 
正)性格の悪い集団です。

回答
投稿日時: 19/07/13 10:58:47
投稿者: mattuwan44

>性格の悪い集団です。
 
別に集団ではないのですが^^;
それぞれ回答側は、
面白い情報がないか見に来たついでに、
困っている人がいれば、知っていることを書いてあげてるだけかと思います。
まぁ、言葉尻をとらえて、
性格が悪い
意地が悪い
かき乱している
とか、、、、
まぁ、そういう一面もあるかも知れませんが、
何もコメントが貰えないよりは全然ましかとおもうのですが。。。
(とりあえず気にしてもらえてるのは解るでしょ?)
まぁ、こちらは、もうそういう言葉にも慣れているので、なんとも思わないのですが。。
質問しても、2日経っても3日経っても回答がつかない方が悲しいです><
 
文字だけでやり取りするのは、ニュアンスが伝わらないので難しいです。
そんなこんなも含めて、いちいち腹を立てずに、慣れていかなければ、
ネット上でコミュニケーションは難しいかなと思います。
回答に悪意がないのは、他の質問の回答を見れば解るはずです。
 
で、本題。
 
やりたいことは、
0)特定のシートを印刷するとき、
1)シート上の表のうち、
2)シートのB列のセルの(結合セル有)値が空白の場合、
3)非表示にして印刷
4)印刷後は、元に戻す
 
ですか?
 
問題に取り組む前に、前提条件の対象のセル範囲を明確にする必要があります。
B列の4行目から、9行目の説明はありますが、A列やC列または、1〜3行目はどういう状況ですか?
それから、
表の範囲はどこからどこまでで、
その中に元々の空白行などはありませんか?
 
回答側にはそちらのパソコンが見えないので、
お手数ですが、詳しく説明していただけませんか?
色々考えてみても、こちらの想定外の状況が後からボロボロ出てくる可能性があるなら、
こちらの考える時間が無駄になりますから。
よろしくお願いします。

投稿日時: 19/07/14 13:16:30
投稿者: HAL22

mattuwan44 さま
 
下記の様に、回答致しますので、こちらこそ宜しくお願い致します。
 
 
〉0)特定のシートを印刷するとき、
〉1)シート上の表のうち、
〉2)シートのB列のセルの(結合セル有)値が空白の場合、
〉3)非表示にして印刷
〉4)印刷後は、元に戻す
〉ですか?
はい、その通りです。
これプラス、Excelにも出力も行う事も検討しています。
 
 
・シート名:表-1
・セル範囲について
B列には
=IFERROR((I$7&"/"&I$8&"/"&ROW(A1))*1,"")
で、日付を表示しています。
(セル:I7 に年  H7に月をしていしています。)
 
カレンダー表です。
例で言えば、2019年2月28日迄ですので、29日、30日、31日 3行を非表示に行う
 
 
B17〜B77 (結合セル有)
→値が空白の可能性のあるセルはB73、B75、B77だけです。
表自体はB17〜X77  (タイトル行を入れるとB13〜です。)
A列は使用していません。
C列は他のシートを参照して、文字を参照していますが
B列が空白の場合は、C列も空白となります。
 
 
これで、情報たりますか?
 
宜しくお願い致します。

回答
投稿日時: 19/07/16 08:01:36
投稿者: mattuwan44

すみません。
口出しておいて、その後なかなかぱそこんの前に座れてません。
情報はほぼ足りてますが、
詳しくコメントできません。
 
気にはなってちょいちょい見てますし、
質問者さんがいじいじしている気持も重々承知してますが、
合間にコメント出来るようなことではないので、
夜にでも、こちらの時間が取れたらにさせてください。

投稿日時: 19/07/16 11:37:27
投稿者: HAL22

mattuwan44 さま
お気遣い、ありがとうございます。
 
>合間にコメント出来るようなことではないので、
>夜にでも、こちらの時間が取れたらにさせてください。
→宜しくお願い致します。

回答
投稿日時: 19/07/17 09:52:11
投稿者: mattuwan44

おはようございます。
 
昨日は早く帰って家から回答を書こうと思ったんですが、、、、、
 
 
営業電話に引っかかって
同伴出勤→オープン〜ラスト
と飲んでしまい、書き込みができませんでした^^;
失礼しました。
 
本題に入る前に、用語として認識を回答側と同じにして欲しいんですが、
「空白のセル」と「空白に見えるセル」は違うので、
表現の方法を気を付けて下さい。
 
今回の件の場合、
セルに「数式」が入っていて、その返り値が「""」なので、
「空白に見えるセル」が操作の対象になるのですね。
しかも、それを見るのは、
B73:B74、B75:B76、B77:B78
の3箇所だけで、それそれが空白に見えたら、
それぞれを「行全体を非表示」にしたいということですよね?
 
ならば、例えば対象がB77:B78セルのときの作業(=エクセルの操作)は、
 
もし、B77のセルの表示されている文字列が、長さ0の文字列ならば、
その時は、B77セルを含む結合されたセル範囲の行全体を非表示に設定する。

 
と命令したいのですよね?
 
ここで、エクセルVBAではどのように書くかというと、
B77のセルの表示されている文字列 → Range("B77").Text
長さ0の文字列 → ""
B77セルを含む結合されたセル範囲 → Range("B77").MergeArea
の行全体 → .EntireRow
非表示と設定する → .Hidden = True
と表現できるので、
 
If Range("B77").Text = "" Then Range("B77").MergeArea.EntireRow.Hidden = True
 
と、このようになります。
 
このような説明で理解できますでしょうか?
わからなければ、どんどん聞いて下さい。
(とはいえ、個人的には3〜4日に1回位の頻度でしか書き込みできないので、
特定の回答者に頼るのではなく広く回答してもらえるように、質問してください。
結構負担になります^^;)
 
たったこれだけ書くにしても、回答側も個人の時間と労力をそれなりに使っているんだということを
認識して、質問していただけるとありがたいです。
それから、不満や愚痴を言いたい場面もあるとは思いますが、
反発せず、うまくいろんな人から必要な情報を引き出さないと、
結局質問者側が損をします。
回答者は、業務としてや義務として回答しているわけではないので、
書かなくてもいいわけですから。
 
みなさん、本気でVBAに取り組んでいることがわかれば、
親切・丁寧な回答をしてもらえます。
(そのためには、「サンプル書いてもらって、出来た」で終わらず、
1行1行、1単語1単語を読み解こうとしている努力を見せることです。)
掲示板はここだけではないですが、
どこにいってもそんなに変わらないと思います。
回答者が回答したくなるような、文が書ければ、
勉強が捗ると思いますので、以後気を付けていただければ良いかなと思いました。

投稿日時: 19/07/17 14:43:16
投稿者: HAL22

お疲れの所、本当に、ありがとうございます。
非常に勉強になりました。
考えも含めて。
 
コードはだいぶ理解を深めてきましたが、
1点お教え下さい。
 
宜しくお願い致します。
 
If Range("B77").Text = "" Then Range("B77").MergeArea.EntireRow.Hidden = True
で、問題無く、行全体を非表示に設定する事が出来ましたがシート名を指定しないと
目的のシート以外が行全体を非表示に設定されます。
 
シート名の指定方法をお教え下さい。

回答
投稿日時: 19/07/17 16:59:58
投稿者: mattuwan44

引用:
If Range("B77").Text = "" Then Range("B77").MergeArea.EntireRow.Hidden = True
で、問題無く、行全体を非表示に設定する事が出来ましたがシート名を指定しないと
目的のシート以外が行全体を非表示に設定されます。
  
シート名の指定方法をお教え下さい

 
お分かりだと思いますが、
Range("B77").MergeArea.EntireRow.Hidden = True
セルB77結合された範囲行全体非表示の設定を真にする
 
ピリオドが日本語の「の」の意味になっています。
 
例えば、
Sheet1シートのB77セル
と指示したければ、
Sheets("Sheet1").Range("B77")
と書きます。
Sheetsは、ブックの中のそれぞれのシート全体を示します。
で、その中で特定のシートを示す場合は、
後ろのカッコにシート名を文字列で書き示します。
Rangeの方も同じ要領ですよね?
 
ところで、
他人の手を煩わせるうえに、
いつ回答がもらえるかわからない掲示板で、
待ちの姿勢だと、なかなか勉強が捗らないとおもいます。
VBAの情報はネット上にたくさんあるので、ぜひ、ご自分で調べるようにしてみてください。
検索が上手くなるのも必要なスキルになります。
https://sugoikaizen.com/excelvba/89-2/
 
もし、調べていたらごめんなさい。
しかし回答側には説明してくれないと、あなたがどんな努力をしたかが見えないのです。
その辺もご考慮願います。

投稿日時: 19/07/18 10:02:51
投稿者: HAL22

ありがとうございます。
下記の様にしてみました。
行全体を非表示を戻す迄です。
 
問題無く作動しましたが、チェックください。
 
引き続き Excel出力も作成してみますので、宜しくお願い致します。
 
 
Sub 印刷()
   
Dim Result As Long
  Result = MsgBox("印刷しますか?", vbYesNo + vbExclamation, "印刷確認")
       
     If Result = vbYes Then
   
    
   
  ''[はい]がクリックされたときの処理
'行全体を非表示 B77
 If Sheets("表-1").Range("B77").Text = "" Then Sheets("表-1").Range("B77").MergeArea.EntireRow.Hidden = True
    Sheets("表-1").PrintOut
 
 '行全体を非表示を戻す B77
 If Sheets("表-1").Range("B77").Text = "" Then Sheets("表-1").Range("B77").MergeArea.EntireRow.Hidden = False
   
   
   
   Else
         ''[いいえ]がクリックされたときの処理
          
  'MsgBox "処理を中止します", vbCritical
   Result = MsgBox("処理を中止しました。", vbOKOnly + vbCritical, "印刷確認")
     End If
     
 End Sub

回答
投稿日時: 19/07/18 16:39:26
投稿者: mattuwan44

>問題無く作動しましたが、チェックください。
 
問題ないと思います。
が、次の点に注意してコードを書いてみてください。
 
1)同じことを何度も書かない
メンテナンス性や場合によっては処理速度に影響します。
同じことを書くなら、変数を利用しましょう。
そのためには、
「オブジェクト」という概念と、「オブジェクト変数」についても理解しておく必要があります。
ネットで検索して理解を深めてください。
 
2)インデントを揃えましょう
インデントが揃ってないと読みにくいです。
なので、掲示板に提示しても読んでもらえなくて、回答が付きにくくなります。
あと、1年後の自分は他人なので、自分のためにも、
他人が読んでわかりやすいコードを心がけましょう。
ネットで調べてみたり、他の質問の回答も参考にしてみてください。
 
3)変数の数を出来るだけ減らしましょう
変数の種類が多いと後で読んで分かり難いです。
今回の件の場合は、そもそも変数が少ないですが、
値を保持する必要がないものまで、変数を用意して保持する必要がないと思います。
関数の返り値は、絶対利用しなければならないということでもないので、
臨機応変に対応してください。
 
4)解りきったことをコメントで書かない
初心者のときは、意図的にいろいろ書いておいた方が後でわかりやすいかも知れませんが、
慣れてくるとうるさいだけです。
うるさくない程度に、1年後の自分に引き継げるようコメントを残しておきましょう。
 
ぼくなりに書いたら以下のようになります。(動作確認してないので、上手く動かないかも知れません)
ベストではないと思いますが、参考になれば。
 

Option Explicit

Sub test()
    Dim rngTarget As Range
    Set rngTarget = Sheets("表-1").Range("73:74,75:76,77:78")

    If MsgBox("印刷しますか?", vbYesNo + vbExclamation, "印刷確認") = vbYes Then
        set行の表示非表示切り替え rngTarget, "B2", ""

        'rngTarget.Worksheet.Printout       '本番用
        rngTarget.Worksheet.PrintPreview    '動作確認用

        set行の表示非表示切り替え rngTarget, "B2", ""
    Else
        MsgBox "処理を中止しました。", vbOKOnly + vbCritical, "印刷確認"
    End If
End Sub


'第1引数のrngRowsには、行全体を渡します
'複数のセル範囲を渡す場合は、続いたセル範囲でも、分けて指定をしてください。
'例)Range("73:74,75:76,77:78")
Sub set行の表示非表示切り替え(ByRef rngRows As Range, _
                            ByVal strAddress As String, _
                            ByVal strKeyWord As String)
    Dim r As Range

    For Each r In rngRows.Areas
        With r
            If .Range(strAddress).Text = strKeyWord Then
                .Hidden = Not .Hidden
            End If
        End With
    Next
End Sub

 
詳しくは説明しません。
ご自分で調べてみて、解らないことや理解できなかったところを、
ピンポイントで聞いて下さい。
たったこれだけのマクロでも知っておかなければいけないことは、
沢山有りそうです。
やりたいことけに集中して勉強するのではなく、
基礎も合わせて勉強しましょう。
 
参考URL>>
http://www.ken3.org/vba/excel-help.html
http://home.att.ne.jp/zeta/gen/excel/c03p06.htm
 

2回目の
>set行の表示非表示切り替え rngTarget, "B2", ""
のところで、引数の指定なしで、前回の指定を引き継ぎたいところですが、
僕の知識では、書き方が分かりませんでした。
どなたか、「こうしたらできる」と教えていただけるとありがたいのですが。。。。
まぁ、暇ができたら、別途質問してもいいのですが^^;

トピックに返信