Excel VBA質問箱 IV

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

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


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

【10538】いらない項目列を全て削除するには? ギン 04/1/30(金) 19:38 質問
【10544】Re:いらない項目列を全て削除するには? Asaki 04/1/30(金) 20:24 回答
【10547】いらない項目列を全て削除するには? ギン 04/1/30(金) 20:52 お礼
【10551】いらない項目列を全て削除するには? ギン 04/1/31(土) 9:34 質問
【10552】Re:いらない項目列を全て削除するには? Asaki 04/1/31(土) 14:53 回答
【10559】いらない項目列を全て削除するには? ギン 04/2/1(日) 20:33 お礼
【10560】Re:いらない項目列を全て削除するには? Asaki 04/2/1(日) 22:47 回答
【10577】いらない項目列を全て削除するには? ギン 04/2/2(月) 19:39 お礼
【10580】Re:いらない項目列を全て削除するには? Asaki 04/2/2(月) 21:32 回答
【10582】全て解決しました。有難うございました。 ギン 04/2/2(月) 22:40 お礼

【10538】いらない項目列を全て削除するには?
質問  ギン  - 04/1/30(金) 19:38 -

引用なし
パスワード
   こんにちは。
また、質問させて下さい。
大きなデータベースを加工しようとしています。
項目列が約50列、データ行が1000くらいあります。
この列数は毎年少し変わってしまいますが
必要な項目列のみ(10列で項目名は判っています)を残し
いらない列を全て削除するマクロを作成したいのです。
いらない列名は増えたり減ったりしますので
判っている列名を残して列削除させる場合をお教え下さいませ。

【10544】Re:いらない項目列を全て削除するには?
回答  Asaki  - 04/1/30(金) 20:24 -

引用なし
パスワード
   こんばんは。

1行目に項目名がA列から入っているとして、その項目名と消したくない項目名が
一致しない列を削除します。

Sub test()

  Dim rngFind   As Range
  Dim rngLoop   As Range

  For Each rngLoop In Range("A1", Cells(Columns.Count).End(xlToLeft))
    Select Case rngLoop.Value
      Case "col1", "col3", "col4", "col8"   '←とりあえず 消したくない項目名を羅列
      Case Else
        If rngFind Is Nothing Then
          Set rngFind = rngLoop
        Else
          Set rngFind = Union(rngFind, rngLoop)
        End If
    End Select
  Next rngLoop

  If Not rngFind Is Nothing Then
    rngFind.EntireColumn.Delete Shift:=xlToLeft
    Set rngFind = Nothing
  End If

End Sub

【10547】いらない項目列を全て削除するには?
お礼  ギン  - 04/1/30(金) 20:52 -

引用なし
パスワード
   Asaki さん
すばやい回答有難うございました。

私にはちょっと高度なやり方みたいですが
当てはめて試してみます。
わからない時はまた質問いたしますので
宜しくお願いします。

今回は有難うございました。

【10551】いらない項目列を全て削除するには?
質問  ギン  - 04/1/31(土) 9:34 -

引用なし
パスワード
   出来ました。
有難うございます。

>      Case Else
>        If rngFind Is Nothing Then
>          Set rngFind = rngLoop
>        Else
>          Set rngFind = Union(rngFind, rngLoop)
>        End If
>    End Select
>  Next rngLoop
このrngFindについての説明をお願いします。
最後にrngFindに格納された変数を見ると
消したい文字の最初だけなのに
どうしていくつもの列が削除できるのでしょうか?
お手数ですが御願い致します。

【10552】Re:いらない項目列を全て削除するには?
回答  Asaki  - 04/1/31(土) 14:53 -

引用なし
パスワード
   こんにちは。

コードにコメント付けてみます。
あまり上手く説明できていないかもしれませんが。。。

Sub test()

  Dim rngFind   As Range
  Dim rngLoop   As Range

  '1行目のA列から値が入っている最後の列までループ
  For Each rngLoop In Range("A1", Cells(Columns.Count).End(xlToLeft))
    Select Case rngLoop.Value
      Case "col1", "col3", "col4", "col8"   '←とりあえず 消したくない項目名を羅列
      
      'セルの値が、上の消したくない項目名に一致しない場合
      Case Else
        'Range型の変数に1行目のセルのRangeを格納
        If rngFind Is Nothing Then
          'まだ1つも消す項目を変数に格納していない場合は
          'ループしているセルの情報をそのまま変数に格納
          Set rngFind = rngLoop
        Else
          '既に消す項目を変数に格納している場合は
          'Unionを使って変数に格納
          Set rngFind = Union(rngFind, rngLoop)
        End If
    End Select
  Next rngLoop

  'rngFindが空でない場合は消差なければならない列がある
  If Not rngFind Is Nothing Then
    'EntireColumn を使って、rngFindに格納されたセルの列全体を削除
    rngFind.EntireColumn.Delete Shift:=xlToLeft
    '念の為オブジェクト変数を開放
    Set rngFind = Nothing
  End If

End Sub

【10559】いらない項目列を全て削除するには?
お礼  ギン  - 04/2/1(日) 20:33 -

引用なし
パスワード
   Asaki さま

重ね重ね質問にお答え下さり有難うございました。
よくわかりました。
わからなかったのはUnionで格納しているのに
変数自体を見ると最初の値のままで
見た目は変わらないものなのですね。
もっと勉強します。
有難うございました。

【10560】Re:いらない項目列を全て削除するには?
回答  Asaki  - 04/2/1(日) 22:47 -

引用なし
パスワード
   >変数自体を見ると最初の値のままで

何を疑問に思っていらっしゃるのか、漸く解りました。
ループを出たあと、
>If Not rngFind Is Nothing Then
あたりにブレークポイントを設定して、イミディエイトウィンドウに
?rngFind.Address
と入力してEnterを押してみてください。
rngFind に格納されているセルのアドレスが表示されます。

【10577】いらない項目列を全て削除するには?
お礼  ギン  - 04/2/2(月) 19:39 -

引用なし
パスワード
   Asaki さん

なるほど、RANGE変数の場合は
アドレスを表示させれば良いのですね。
また一つ勉強になりました。
有難うございます。

実はもう一つお聞きしたいことがあります。
rEnd = Range("A65536").End(xlUp).Row
としてrENDと言う変数にA列の一番下の
入力行数を表示させていますが
これがもし列が変動する場合はどの様に
記入すれば良いのでしょうか?
c = ActiveCell.Column
rEnd = Range(Cells(65536,c)).End(xlUp).Row
などの様にいろいろ試してみましたが
エラーになってしまいます。
調子にのってすみませんが
宜しく御願い致します。

【10580】Re:いらない項目列を全て削除するには?
回答  Asaki  - 04/2/2(月) 21:32 -

引用なし
パスワード
   >列が変動する場合
Activeセルのある列の最終行で良ければ、
rEnd = Cells(65536,ActiveCell.Column).End(xlUp).Row
では如何でしょうか?

#すみません。間違いに気付いて、一度削除しました。m(__)m

【10582】全て解決しました。有難うございました。
お礼  ギン  - 04/2/2(月) 22:40 -

引用なし
パスワード
   Asaki 様

何度も質問にお答え下さり
有難うございました。

全て解決しました。
すばらしいです。

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