Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


11540 / 13645 ツリー ←次へ | 前へ→

【15477】不要な列を非表示 経理課支払担当 04/6/26(土) 21:20 質問[未読]
【15479】Re:不要な列を非表示 IROC 04/6/26(土) 23:00 回答[未読]
【15484】Re:不要な列を非表示 kein 04/6/26(土) 23:35 回答[未読]
【15486】Re:不要な列を非表示 経理課支払担当 04/6/27(日) 0:13 発言[未読]
【15487】Re:不要な列を非表示 kein 04/6/27(日) 0:26 回答[未読]
【15488】Re:不要な列を非表示 kein 04/6/27(日) 0:35 回答[未読]
【15545】Re:不要な列を非表示 経理課支払担当 04/6/28(月) 23:18 お礼[未読]
【15558】Re:不要な列を非表示 kein 04/6/29(火) 12:13 回答[未読]
【15576】Re:不要な列を非表示 経理課支払担当 04/6/29(火) 22:59 お礼[未読]

【15477】不要な列を非表示
質問  経理課支払担当  - 04/6/26(土) 21:20 -

引用なし
パスワード
   久しぶりに投稿します。経理課支払担当です。

エクセルで支払予定表を作って管理をしています。
A列には会社名が入っていて、B1から右へ4月、5月、6月・・・と月が入っています。
エクセルの表は右に長いため、例えば12月の列までもってくるのにスクロールさせていて面倒です。ということなので、不要な月は「右クリックして非表示」というような作業を自動化するマクロを作ってみたいと思いました。

userformには、月が表示されるlistboxがあり、
「(listboxで選択した月)よりも以前の月は表示しない」または、
「(listboxで選択した月)だけを表示して他は表示しない」というオプションボタンを押した瞬間に、非表示の動作がされるようにしたいのですがうまくいきませんでした。
どうしたらよいでしょうか?

【15479】Re:不要な列を非表示
回答  IROC  - 04/6/26(土) 23:00 -

引用なし
パスワード
   どのように作って上手く行かなかったのか
教えて頂けませんか?

【15484】Re:不要な列を非表示
回答  kein  - 04/6/26(土) 23:35 -

引用なし
パスワード
   それだけのためにユーザーフォームを用意するのは、ちょっと大げさだしファイルも
重くなってメリットが少ないですね。私ならセル右クリックイベントを使って、
フォームのリストボックスを出す仕組みにします。

↓対象シートのシートモジュールへ

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, _
Cancel As Boolean)
  Dim Lp As Single, Wp As Single, Hp As Single

  With Target
   If .Count > 1 Then Exit Sub
   If .Row > 1 Then Exit Sub
   Lp = .Left: Wp = .Width: Hp = .Height
  End With
  Cancel = True
  Columns("B:M").Hidden = False
  With ActiveSheet.Buttons.Add(Lp, 0.1, Wp, Hp)
   .Caption = "月を選択"
   .Font.Size = 9
   .OnAction = "Scl_MyM"
  End With
  With ActiveSheet.ListBoxes.Add(Lp, Hp + 2, Wp, Hp * 8)
   .AddItem Array("1月", "2月", "3月", "4月", "5月", _
   "6月", "7月", "8月", "9月", "10月", "11月", "12月")
   .MultiSelect = xlSimple
  End With
End Sub

↓標準モジュールへ

Sub Scl_MyM()
  Dim i As Integer

  If VarType(Application.Caller) <> 8 Then Exit Sub
  ActiveSheet.Buttons(1).Delete
  With ActiveSheet.ListBoxes(1)
   If IsError(Application.Match(True, .Selected, 0)) Then
     .Delete: Exit Sub
   End If
   For i = 1 To .ListCount
     If .Selected(i) Then
      Columns(i + 1).Hidden = True
     End If
   Next i
   .Delete
  End With
End Sub 

*使い方
対象シートの「1行目のみ」「1個のセルを選択して」右クリックしてみて下さい。
ボタンとリストボックスが出てきます。リストボックスはマルチセレクト出来ます
から、非表示にしたい月を複数選択してボタンを押すだけです。選択解除したい
場合は、もう一度その月をクリックします。何も選択しないでボタンを押すと、
非表示になっている月の列が全て表示され、終わります。一回の処理ごとにボタンと
リストボックスを削除しますから、ブック内に残らずファイルサイズを肥大させる
こともありません。とても軽いシステムになってます。

【15486】Re:不要な列を非表示
発言  経理課支払担当  - 04/6/27(日) 0:13 -

引用なし
パスワード
   ボタンを押して、userformを立ち上げてという作業が省かれているというところがとってもいいですね。
ここで非常に申し訳ないことを言ってしまいますが、実は、月数は最初述べたような感じではなくて、4/10支払、4月末支払、4月末手形振出、5/10支払、5月末支払、5月末手形振出・・・と細かくあって本当に右に長いのです。
そして、自分が表示したい列はいつも1〜3列程度で、表示したくないのがほとんどです。
となると、keinさんがおっしゃったやりかただと、まだ大変なような気がするかもしれません。説明が足りなくてすみません・・・。

>IROCさん
申し訳ないですが、会社に自分が作ったの置いてきてしまいました。
遅れてしまいますが、あとで持ってきます。

【15487】Re:不要な列を非表示
回答  kein  - 04/6/27(日) 0:26 -

引用なし
パスワード
   >4/10支払、4月末支払、4月末手形振出、5/10支払、5月末支払、5月末手形振出
>・・・と細かくあって本当に右に長いのです
ならば、イベントマクロの方で

Dim C As Range

と、変数宣言を追加し

Wp = .Width * 2

とコントロールの幅を広げ

>With ActiveSheet.ListBoxes.Add(Lp, Hp + 2, Wp, Hp * 8)
>  .AddItem Array("1月", "2月", "3月", "4月", "5月", _
>  "6月", "7月", "8月", "9月", "10月", "11月", "12月")
>  .MultiSelect = xlSimple
>End With


With ActiveSheet.ListBoxes.Add(Lp, Hp + 2, Wp, Hp * 8)
  For Each C In Range("B1", Range("B1").End(xlToLeft))
   .AddItem C.Value
  Next
  .MultiSelect = xlSimple
End With

と、変更してみて下さい。

【15488】Re:不要な列を非表示
回答  kein  - 04/6/27(日) 0:35 -

引用なし
パスワード
   あー・・非表示にする列の方が、多かったんですね。それも考慮するなら、表示する
項目だけを選択する形にした方が、より能率的ですね。
というわけで書き直してみました。

↓対象シートのシートモジュールへ

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, _
Cancel As Boolean)
  Dim Lp As Single, Wp As Single, Hp As Single
  Dim C As Range

  With Target
   If .Count > 1 Then Exit Sub
   If .Row > 1 Then Exit Sub
   Lp = .Left: Wp = .Width * 2: Hp = .Height
  End With
  Cancel = True
  Columns("B:M").Hidden = False
  With ActiveSheet.Buttons.Add(Lp, 0.1, Wp, Hp)
   .Caption = "月を選択"
   .Font.Size = 9
   .OnAction = "Scl_MyM"
  End With
  With ActiveSheet.ListBoxes.Add(Lp, Hp + 2, Wp, Hp * 8)
   For Each C In Range("B1", Range("B1").End(xlToRight))
     .AddItem C.Value
   Next
   .MultiSelect = xlSimple
  End With
End Sub

↓標準モジュールへ

Sub Scl_MyM()
  Dim i As Integer

  If VarType(Application.Caller) <> 8 Then Exit Sub
  ActiveSheet.Buttons(1).Delete
  With ActiveSheet.ListBoxes(1)
   If IsError(Application.Match(True, .Selected, 0)) Then
     .Delete: Exit Sub
   End If
   For i = 1 To .ListCount
     If .Selected(i) = False Then
      Columns(i + 1).Hidden = True
     End If
   Next i
   .Delete
  End With
End Sub

【15545】Re:不要な列を非表示
お礼  経理課支払担当  - 04/6/28(月) 23:18 -

引用なし
パスワード
   回答いただきましてありがとうございます!
早速試してみました。よりよくなってますね!

また質問してしまいますが、A列は会社名、月が始まるのはB1から右へ、ということにしていますが、
今後、B列は振込口座、C列は口座番号という情報を入れることにして、月が始まるのはD1から右へ、ということにしたとしたら、どこを直したらよいのでしょう?
必死で自分で考えてみたもののうまくいきませんでした。かなり初心者なので、申し訳ないです。

【15558】Re:不要な列を非表示
回答  kein  - 04/6/29(火) 12:13 -

引用なし
パスワード
   >月が始まるのはD1から右へ

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, _
Cancel As Boolean)
  Dim Lp As Single, Wp As Single, Hp As Single
  Dim C As Range

  With Target
   If .Count > 1 Then Exit Sub
   If .Row > 1 Then Exit Sub
   Lp = .Left: Wp = .Width * 2: Hp = .Height
  End With
  Cancel = True
  Range("D1", Range("D1").End(xlToRight)) _
  .EntireColumn.Hidden = False
  With ActiveSheet.Buttons.Add(Lp, 0.1, Wp, Hp)
   .Caption = "表示する項目を選択"
   .Font.Size = 9
   .OnAction = "Scl_MyM"
  End With
  With ActiveSheet.ListBoxes.Add(Lp, Hp + 1, Wp, Hp * 8)
   For Each C In Range("D1", Range("D1").End(xlToRight))
     .AddItem C.Value
   Next
   .MultiSelect = xlSimple
  End With
End Sub

Sub Scl_MyM()
  Dim i As Integer

  If VarType(Application.Caller) <> 8 Then Exit Sub
  ActiveSheet.Buttons(1).Delete
  With ActiveSheet.ListBoxes(1)
   If IsError(Application.Match(True, .Selected, 0)) Then
     .Delete: Exit Sub
   End If
   For i = 1 To .ListCount
     If .Selected(i) = False Then
      Columns(i + 3).Hidden = True
     End If
   Next i
   .Delete
  End With
End Sub

どこが変更されたか、よく見て理解してください。

【15576】Re:不要な列を非表示
お礼  経理課支払担当  - 04/6/29(火) 22:59 -

引用なし
パスワード
   返信遅れてしまいました。すみません。
どこが変更されたかわかりました。う〜ん、難しいですね。
私も、もっと勉強せねば。

ここまで作っていただきまして、ありがとうございました。

11540 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free