条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で作成する。

この講座は有料講座です。
講座の購入後ご覧になれます。

ログインアカウントの新規作成

解説

演習問題テーマ:条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で作成する。

条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で作成します。マクロ中~上級者の視点ではあまりイケてる方法とは言えませんが、手法のひとつとして紹介します。

この教材についての過去の質問・感想

13042 : 小川慶一の回答 (2021-06-22 18:47:48)

凜さん:

わざわざありがとうございます。
ひきつづき、よろしくお願いいたします (^^*


13041 : 凜さんのコメント (2021-06-22 18:45:13)

小川慶一さん:
ありがとうございます。
社内で長く使い続ける事が出来るシステムを作る為にも可読性という視点を大事にしていきたいと思います。
実務に合わせたご指導に大変感謝しております。
今後もよろしくお願いします。

> 凜さん:
>
> おはようございます。
>
> 「動作の結果、期待どおりの状態になるか」ということでしたらこれでも良いと言えばよいです。
>
> が、くり返し作業のカウンターに使う変数の値をループの中で手動で変更するのは、避けたほうが無難です。
> 処理が複雑になること、可読性が落ちてメンテナンスに手間がかかるようになることが理由です。
>
> ひきつづき、よい学びを☆
>


13039 : 小川慶一の回答 (2021-06-20 08:18:43)

凜さん:

おはようございます。

「動作の結果、期待どおりの状態になるか」ということでしたらこれでも良いと言えばよいです。

が、くり返し作業のカウンターに使う変数の値をループの中で手動で変更するのは、避けたほうが無難です。
処理が複雑になること、可読性が落ちてメンテナンスに手間がかかるようになることが理由です。

ひきつづき、よい学びを☆


13038 : 凜さんのコメント (2021-06-19 22:54:41)

いつもお世話になっております。
教えて頂いた事を復習しつつ、下記のようなマクロを書いてみました。
いちお動作結果は問題ないようでしたが、気付かない不具合があるのかと不安になりました。ご教示頂けますでしょうか。
よろしくお願いします。

Sub hanako()

Dim gyo
For gyo = 10 To 35
    If Range("D" & gyo).Value = "ぬいぐるみ" Then
    
    Else
        If Range("C" & gyo).Value = "" Then
         Exit For
        Else
         Rows(gyo & ":" & gyo).Select
         Selection.Delete shift:=xlUp
         gyo = gyo - 1
        End If
    End If
    
Next

End Sub


11113 : 田中 宏明さんのコメント (2019-02-10 17:12:59)

ひろしさん:

基礎編に出てこないやり方になりますが、引き出しを増やすという意味で、以下手順で処理できる方法を紹介します。
 [1] 削除対象行をRngオブジェクトに入れる
 [2] 削除は最後にまとめて行う

Sub gyo_sakujo()
 
    Dim gyo As Long
    Dim gmax As Long
    gmax = Range("A" & Rows.Count).End(xlUp).Row
    
    Dim Rng As Range 'Rngオブジェクト変数
     
    For gyo = gmax To 2 Step -1
        If Range("A" & gyo).Value = "行削除" Then
            If Rng Is Nothing Then
                'Rngオブジェクト変数に行設定(最初に見つかった行)
                Set Rng = Rows(gyo)
            Else
                'Rngオブジェクト変数に行追加(以降に見つかった行)
                Set Rng = Union(Rng, Rows(gyo))
            End If
        End If
    Next

    If Not Rng Is Nothing Then
        'Rngオブジェクト変数に入れた行を一括削除
        Rng.Delete
    End If

End Sub 


> 下記のように、A列に"行削除"と文字が発見されたら、
> 対象の列を削除させるマクロを作成しました。
> しかし、データ数が膨大になると(20,000行以上とか)
> 処理時間が、かなり掛かってしまうようです。
>
> データ数が、多い場合は別の方法が良いのでしょうか?


11082 : 小川慶一の回答 (2019-02-06 15:18:31)

ひろしさん:

他の動画で学んだことにヒントはないか?と考える習慣をつけましょう!

> ありがとうございます。
> 早速、教えて頂いた手順で実行してみます。
>
> 基本をベースとして、色々アレンジする習慣をつけます。
> また、講座を復習し実践を重ね、引き出しを増やしていきたいと思います。
>
> 小川慶一さん:
>
> > ひろしさん:
> >
> > たとえば、以下の要領で複数行をまとめて削除することもできます。
> >
> >

Sub hoge()
> >     Dim cFm As Long
> >     Dim cTo As Long
> >     cFm = 3
> >     cTo = 17
> >     Range("A" & cFm & ":A" & cTo).EntireRow.Delete
> > End Sub

> >
> > なので、以下の流れになるかと思います。
> >
> > [1] 削除対象行に印をつけていく
> > [2] 印のある列で並べ替える
> > [3] 上述の要領で削除する
> >
> > あとは、削除じゃなくてオートフィルタでも十分なら、オートフィルタしてしまうとか。
> > オートフィルタのマクロについては発展編1で取り扱っています。
> >
> > 本動画でもそういうアレンジを紹介すればできたのですが、あまりいろいろ脱線していると本論がおろそかになるので、触れずにいました。
> >
> >
> >
> > > いつもお世話になっております。
> > > 行の削除について、質問があります。
> > >
> > > 下記のように、A列に"行削除"と文字が発見されたら、
> > > 対象の列を削除させるマクロを作成しました。
> > > しかし、データ数が膨大になると(20,000行以上とか)
> > > 処理時間が、かなり掛かってしまうようです。
> > >
> > > データ数が、多い場合は別の方法が良いのでしょうか?
> > > ご教授頂けると幸いです。
> > >
> > >
Sub gyo_sakujo()
> > > 
> > >     Dim gyo As Long
> > >     Dim gmax As Long
> > >     gmax = Range("A" & Rows.Count).End(xlUp).Row
> > >     
> > >     For gyo = gmax To 2 Step -1
> > >         If Range("A" & gyo).Value = "行削除" Then
> > >             Range("A" & gyo).EntireRow.Delete
> > >         End If
> > >     Next
> > > End Sub

> > >
> > > よろしくお願いします。
> >


11079 : ひろしさんのコメント (2019-02-05 19:52:02)

ありがとうございます。
早速、教えて頂いた手順で実行してみます。

基本をベースとして、色々アレンジする習慣をつけます。
また、講座を復習し実践を重ね、引き出しを増やしていきたいと思います。

小川慶一さん:

> ひろしさん:
>
> たとえば、以下の要領で複数行をまとめて削除することもできます。
>
>

Sub hoge()
>     Dim cFm As Long
>     Dim cTo As Long
>     cFm = 3
>     cTo = 17
>     Range("A" & cFm & ":A" & cTo).EntireRow.Delete
> End Sub

>
> なので、以下の流れになるかと思います。
>
> [1] 削除対象行に印をつけていく
> [2] 印のある列で並べ替える
> [3] 上述の要領で削除する
>
> あとは、削除じゃなくてオートフィルタでも十分なら、オートフィルタしてしまうとか。
> オートフィルタのマクロについては発展編1で取り扱っています。
>
> 本動画でもそういうアレンジを紹介すればできたのですが、あまりいろいろ脱線していると本論がおろそかになるので、触れずにいました。
>
>
>
> > いつもお世話になっております。
> > 行の削除について、質問があります。
> >
> > 下記のように、A列に"行削除"と文字が発見されたら、
> > 対象の列を削除させるマクロを作成しました。
> > しかし、データ数が膨大になると(20,000行以上とか)
> > 処理時間が、かなり掛かってしまうようです。
> >
> > データ数が、多い場合は別の方法が良いのでしょうか?
> > ご教授頂けると幸いです。
> >
> >
Sub gyo_sakujo()
> > 
> >     Dim gyo As Long
> >     Dim gmax As Long
> >     gmax = Range("A" & Rows.Count).End(xlUp).Row
> >     
> >     For gyo = gmax To 2 Step -1
> >         If Range("A" & gyo).Value = "行削除" Then
> >             Range("A" & gyo).EntireRow.Delete
> >         End If
> >     Next
> > End Sub

> >
> > よろしくお願いします。
>


11078 : 小川慶一の回答 (2019-02-05 17:25:59)

ひろしさん:

たとえば、以下の要領で複数行をまとめて削除することもできます。

Sub hoge()
    Dim cFm As Long
    Dim cTo As Long
    cFm = 3
    cTo = 17
    Range("A" & cFm & ":A" & cTo).EntireRow.Delete
End Sub


なので、以下の流れになるかと思います。

[1] 削除対象行に印をつけていく
[2] 印のある列で並べ替える
[3] 上述の要領で削除する

あとは、削除じゃなくてオートフィルタでも十分なら、オートフィルタしてしまうとか。
オートフィルタのマクロについては発展編1で取り扱っています。

本動画でもそういうアレンジを紹介すればできたのですが、あまりいろいろ脱線していると本論がおろそかになるので、触れずにいました。



> いつもお世話になっております。
> 行の削除について、質問があります。
>
> 下記のように、A列に"行削除"と文字が発見されたら、
> 対象の列を削除させるマクロを作成しました。
> しかし、データ数が膨大になると(20,000行以上とか)
> 処理時間が、かなり掛かってしまうようです。
>
> データ数が、多い場合は別の方法が良いのでしょうか?
> ご教授頂けると幸いです。
>
>
Sub gyo_sakujo()
> 
>     Dim gyo As Long
>     Dim gmax As Long
>     gmax = Range("A" & Rows.Count).End(xlUp).Row
>     
>     For gyo = gmax To 2 Step -1
>         If Range("A" & gyo).Value = "行削除" Then
>             Range("A" & gyo).EntireRow.Delete
>         End If
>     Next
> End Sub

>
> よろしくお願いします。


11076 : ひろしさんのコメント (2019-02-05 15:05:32)

いつもお世話になっております。
行の削除について、質問があります。

下記のように、A列に"行削除"と文字が発見されたら、
対象の列を削除させるマクロを作成しました。
しかし、データ数が膨大になると(20,000行以上とか)
処理時間が、かなり掛かってしまうようです。

データ数が、多い場合は別の方法が良いのでしょうか?
ご教授頂けると幸いです。

Sub gyo_sakujo()

    Dim gyo As Long
    Dim gmax As Long
    gmax = Range("A" & Rows.Count).End(xlUp).Row
    
    For gyo = gmax To 2 Step -1
        If Range("A" & gyo).Value = "行削除" Then
            Range("A" & gyo).EntireRow.Delete
        End If
    Next
End Sub


よろしくお願いします。


10563 : 小川慶一の回答 (2018-09-10 10:12:49)

morimotoさん:

こちらも、基本中の基本です。

> 絶対削除は下からと覚えておかないといけないですね。

ポイントはそこではないです。

> 練習中は上からしてしまい当然できませんでした。

ということがなぜ起こってしまったのか?
飛躍的な向上を目指すのであれば、そこをしっかりつきつめる必要がありますね。



> 「削除系は下から」勉強になりました。練習中は上からしてしまい当然できませんでした。F8で動きをみると for nextの順と削除したい行がずれていくのが見えました。ヒント通り下からすると解消しました。絶対削除は下からと覚えておかないといけないですね。


10562 : 小川慶一の回答 (2018-09-10 10:11:08)

morimotoさん:

基本のパターンとして、身体に染み込むまで練習してください。
以下はよい習得方法ですよ。

[1] 勝手に手が動いてスラスラ解ける
[2] 横に自分より少しマクロが苦手な人がいるつもりで、その人に説明しながら解く

> 冒頭の解説で、「別のシートに転記する方法」というのがほんと感心しました。確かにアレンジ効きませんよね。ks204の練習をしてて転記元と転記先のIDや氏名、住所の並びがバラバラで練習中は相互に見比べるのが大変でしたが、この転記という方法は大変役立つので覚えておきたいです。


10559 : morimotoさんのコメント (2018-09-09 20:03:17)

「削除系は下から」勉強になりました。練習中は上からしてしまい当然できませんでした。F8で動きをみると for nextの順と削除したい行がずれていくのが見えました。ヒント通り下からすると解消しました。絶対削除は下からと覚えておかないといけないですね。


10558 : morimotoさんのコメント (2018-09-09 19:59:33)

冒頭の解説で、「別のシートに転記する方法」というのがほんと感心しました。確かにアレンジ効きませんよね。ks204の練習をしてて転記元と転記先のIDや氏名、住所の並びがバラバラで練習中は相互に見比べるのが大変でしたが、この転記という方法は大変役立つので覚えておきたいです。


9101 : 小川慶一の回答 (2017-10-31 11:33:23)

受講生 さん:

> ・数式 n(終わりの数になるための数)-gyo で後ろから実行する
> ・step -1 で指定した範囲の後ろから実行する

どちらでもOKです。
というか、どちらもできるようになるとよいですね。


9100 : 受講生さんのコメント (2017-10-30 21:51:13)

・削除系のマクロを作る時は、後ろから削除する。
・数式 n(終わりの数になるための数)-gyo で後ろから実行する
・step -1 で指定した範囲の後ろから実行する


6444 : 小川慶一の回答 (2016-04-18 10:56:44)

ゲスト さん:

「こういうやり方もある」と気づいてしまえばあとはいろいろ応用利くようになります。
まずは、ベタに書いてみてください。

>業務で実際に行を削除してほしいデータを残していったことがあったのですが、step-1のやり方しか考え付かず、for gyo = 10 to 35で、加工する箇所で、45-gyoという発想はまったくなかったので目からウロコでした!こちらのフォローアップ講座ではいろんなやり方を学べてとても勉強になります。


6425 : 宮下 郁子さんのコメント (2016-04-13 17:55:52)

業務で実際に行を削除してほしいデータを残していったことがあったのですが、step-1のやり方しか考え付かず、for gyo = 10 to 35で、加工する箇所で、45-gyoという発想はまったくなかったので目からウロコでした!こちらのフォローアップ講座ではいろんなやり方を学べてとても勉強になります。


3日がかりのその仕事、3分で終わらせる方法教えます。ガラパゴスタディーオンライン講座 ユーザー登録

本講座の動画一覧

  1. 【動画1】 住所情報を都道府県から市区町村レベルで細かく分割する
    【動画1】 住所情報を都道府県から市区町村レベルで細かく分割する 未習得
  2. 【動画2】 保険料額表から標準報酬額ごとの保険料負担額を算出する
    【動画2】 保険料額表から標準報酬額ごとの保険料負担額を算出する 未習得
  3. 【動画3】 セル内の文字列から区切り文字を見つけ、その出現回数+1回だけデータ転記する
    【動画3】 セル内の文字列から区切り文字を見つけ、その出現回数+1回だけデータ転記する 未習得
  4. 【動画4】 セル内の文字列から区切り文字を見つけ、その区切り文字の間にある文字列を切り出す
    【動画4】 セル内の文字列から区切り文字を見つけ、その区切り文字の間にある文字列を切り出す 未習得
  5. 【動画5】 セル内の文字列から区切り文字を見つけ、その区切り文字の間にある文字列を反映しつつデータ転記する
    【動画5】 セル内の文字列から区切り文字を見つけ、その区切り文字の間にある文字列を反映しつつデータ転記する 未習得
  6. 【動画6】 VLookUp関数、Index関数、Match関数より便利なマクロ-該当する行が見つからない場合の処理をアレンジ
    【動画6】 VLookUp関数、Index関数、Match関数より便利なマクロ-該当する行が見つからない場合の処理をアレンジ 未習得
  7. 【動画7】 VLookUp関数、Index関数、Match関数より便利なマクロ-複数シート間、複数ファイル間でのマッチング
    【動画7】 VLookUp関数、Index関数、Match関数より便利なマクロ-複数シート間、複数ファイル間でのマッチング 未習得
  8. 【動画8】 転記先シートを生成してデータを流し込む。
    【動画8】 転記先シートを生成してデータを流し込む。 未習得
  9. 【動画9】 転記先ファイルを生成してデータを流し込む。
    【動画9】 転記先ファイルを生成してデータを流し込む。 未習得
  10. 【動画10】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で作成する。
    【動画10】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で作成する。 未習得
  11. 【動画11】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で同一ファイル内に連続的に作成する。
    【動画11】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で同一ファイル内に連続的に作成する。 未習得
  12. 【動画12】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で複数の別ファイルとして連続的に作成する。
    【動画12】 条件に一致するデータだけのリストを、条件に一致しないデータを削除する方法で複数の別ファイルとして連続的に作成する。 未習得
  13. 【動画13】 ファイル配布→配布先でのデータ記入→記入済データを手元資料に統合
    【動画13】 ファイル配布→配布先でのデータ記入→記入済データを手元資料に統合 未習得
  14. 【動画14】 データ記入用ファイルを配布する-その1
    【動画14】 データ記入用ファイルを配布する-その1 未習得
  15. 【動画15】 データ記入用ファイルを配布する-その2
    【動画15】 データ記入用ファイルを配布する-その2 未習得
  16. 【動画16】 各部署からファイルを回収し、記入済データを手元資料に統合その1
    【動画16】 各部署からファイルを回収し、記入済データを手元資料に統合その1 未習得
  17. 【動画17】 各部署からファイルを回収し、記入済データを手元資料に統合その2
    【動画17】 各部署からファイルを回収し、記入済データを手元資料に統合その2 未習得
  18. 【動画18】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その1)
    【動画18】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その1) 未習得
  19. 【動画19】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その2-1)
    【動画19】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その2-1) 未習得
  20. 【動画20】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その2-2)
    【動画20】 商品ごと、年ごとの販売額合計をピボットテーブルのように出力する(その2-2) 未習得

塾長 小川慶一

メニュー

コメント紹介

もっと見る

ページの先頭へ