大体でIT

-ちょっと使えるネタを紹介-

大体でIT

Excel VBAで、オートフィルタの可視セルを配列に格納するには、「一旦コピーして、配列に格納」する方法と、「SpecailCellsを使う」方法があります。簡単なのは、「一旦コピー」する方法で、高速なのは「SpecialCells」を使う方法です。配列の操作について、マスターしていきましょう。

はじめに

この記事では、オートフィルタの可視セルを配列に格納する方法について、ご紹介します。

方法としては、次の2つがあります。

  • 一旦フィルタ結果を別セルにコピーして、配列に格納
  • SpecialCellsをループして、可視セルを配列に格納

VBAコードが簡単なのが、「一旦コピーする」する方法です。

実行する速度が速いのは、「SpecialCellsを使う」方法になります。

VBAコードを高速化したい場合は、「SpecialCells」を使って、そこまでデータが多くなければ、「一旦コピーする」方法を使うといいです。

フィルタ結果を配列に格納する方法について、マスターしていきましょう。

では、オートフィルタの可視セルを配列に格納する方法について、解説していきます。

この記事を読むメリット

  • オートフィルタの可視セルを、配列に格納する方法がわかります。

本記事の内容を動画でまとめています

目次から見たい項目へ移動すると便利ですよ。

目次

オートフィルタの可視セルのみを配列に格納する

オートフィルタの可視セルのみを配列に格納する方法として、2つあります。

  • 一旦フィルタ結果を別セルにコピーして、配列に格納
  • SpecialCellsをループして、可視セルを配列に格納

という感じです。

それぞれの方法について、解説していきます。

一旦コピーして配列に格納

一旦フィルタ結果を、別セルにコピーして、配列に格納する方法をやってみます。

手順としては、次のようになります。

  • シートを追加
  • 新規シートにフィルタ結果をコピー
  • フィルタ結果を配列に格納
  • 新規シートを削除

VBAコードは、こんな感じになります。

Sub TEST1()
  
  'フィルタする
  Range("A1").AutoFilter 1, "*D*"
  
  'シート追加
  Worksheets.Add
  
  '一旦、フィルタ結果を別セルにコピー
  ActiveSheet.Next.Range("A1").CurrentRegion.Copy Range("A1")
  
  Dim A
  'フィルタ結果を配列に格納
  A = Range("A1").CurrentRegion
  
  '作業セルをクリア
  Application.DisplayAlerts = False
  ActiveSheet.Delete
  Application.DisplayAlerts = True
    
  'フィルタを解除
  Range("A1").AutoFilter 1
  
  '確認用
  Range("D1").Resize(UBound(A, 1), UBound(A, 2)) = A
  
End Sub

表を用意しておきます。

表を用意

表を用意します

まずは、「B」を含む値でフィルタします。

フィルタしておく

「B」を含む値でフィルタします

フィルタ結果を配列に格納していきます。

フィルタ結果を配列に格納していく

元のシートに影響がでないように、シートを追加します。

シートを追加します

フィルタ結果を新規シートにコピーします。

フィルタ結果を新規シートにコピーします

そして、フィルタ結果を配列に格納します。

フィルタ結果を配列に格納します

新規シートを削除します。

新規シートを削除します

こんな感じで、フィルタ結果を配列に格納することができます。

あとは、フィルタの解除と配列の値を確認していきいます。

フィルタを解除します。

フィルタの解除

フィルタを解除します

確認のため、配列をセルに入力します。

配列を確認

確認のため、配列をセルに入力します

フィルタ結果を、配列に入力できていることがわかります。

SpecialCellsでループして配列に格納

次は、「SpecialCells」を使って、可視セルをループして配列に格納してみます。

手順としては、次のようになります。

  • 可視セルの行数分だけ配列を作成
  • 可視セルの行をループする
  • 可視セルを行を配列に格納

では、VBAコードをみてみます。

Sub TEST2()
  
  'フィルタ
  Range("A1").AutoFilter 1, "*D*"
  
  Dim A
  '配列を作成
  ReDim A(1 To Range("A1").CurrentRegion.Resize(, 1).SpecialCells(xlCellTypeVisible).Count, 1 To 2)
  
  k = 0
  '可視セルの行をループ
  For Each B In Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Rows
    k = k + 1 'カウントアップ
    For j = 1 To 2
      '可視セルの値を配列に入力
      A(k, j) = B.Cells(1, j)
    Next
  Next
  
  'フィルタを解除
  Range("A1").AutoFilter 1
  
  '確認用
  Range("D1").Resize(UBound(A, 1), UBound(A, 2)) = A
  
End Sub

表を用意しておきます。

表を用意

表を用意します

「B」を含む値で、フィルタしておきます。

フィルタしておく

「B」を含む値で、フィルタします

では、「SpecialCells」を使って、フィルタ結果を配列に格納していきます。

フィルタ結果を配列に格納していく

可視セルの行数分の配列を作成します。

配列を作成します

1つ目の可視セルの行を、配列に格納します。

1つ目の可視セルの行を、配列に格納します

2つ目の可視セルの行を、配列に格納します。

2つ目の可視セルの行を、配列に格納します

3つ目の可視セルの行を、配列に格納します。

3つ目の可視セルの行を、配列に格納します

そして、4つ目の可視セルの行を、配列に格納します。

4つ目の可視セルの行を、配列に格納します

こんな感じで、「SpecialCells」で可視セルをループして、フィルタ結果のみを配列に格納することができます。

あとは、後処理で、フィルタの解除と配列の値を確認します。

フィルタを解除します。

フィルタを解除

フィルタを解除します

確認のため、配列をセルに入力します。

配列を確認

確認のため、配列をセルに入力します

フィルタ結果のみを、配列に格納できていることがわかります。

速度を比較してみる

次は、「一旦コピーする」方法と、「SpecialCells」を使う方法で、速度を比較してみます。

結果からいうと、「SpecialCells」を使う方が3倍ぐらい高速になります。

一旦コピーして配列に格納

一旦フィルタ結果を別セルにコピーして、配列に格納する方法で実行する時間を計測してみます。

Sub TEST3()
  
  'フィルタする
  Range("A1").AutoFilter 1, "*D*"
  
  t = Timer
  
  'シート追加
  Worksheets.Add
  
  '一旦、フィルタ結果を別セルにコピー
  ActiveSheet.Next.Range("A1").CurrentRegion.Copy Range("A1")
  
  Dim A
  'フィルタ結果を配列に格納
  A = Range("A1").CurrentRegion
  
  '作業セルをクリア
  Application.DisplayAlerts = False
  ActiveSheet.Delete
  Application.DisplayAlerts = True
    
  Debug.Print Timer - t & " 秒"
  
  'フィルタを解除
  Range("A1").AutoFilter 1
  
  '確認用
  Range("D1").Resize(UBound(A, 1), UBound(A, 2)) = A
  
End Sub

10万行のデータを用意しました。

10万行のデータを用意

10万行のデータを用意しました

VBAコードを実行してみます。

確認のため、配列をセルに入力します。

フィルタ結果を配列に格納できている

確認のため、配列をセルに入力しました

フィルタ結果のみを、配列に格納できていることがわかります。

では、かかった時間をみてみます。

かかった時間

かかった時間は、約0.3秒です

かかった時間は、約0.3秒です。

一旦コピーする方法でも、かなり高速です。

SpecialCellsでループして配列に格納

では次は、「SpecialCells」で可視セルをループして、配列に格納する方法で実行する時間を計測してみます。

Sub TEST4()
  
  'フィルタ
  Range("A1").AutoFilter 1, "*D*"
  
  t = Timer
  
  Dim A
  '配列を作成
  ReDim A(1 To Range("A1").CurrentRegion.Resize(, 1).SpecialCells(xlCellTypeVisible).Count, 1 To 2)
  
  k = 0
  '可視セルの行をループ
  For Each B In Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Rows
    k = k + 1 'カウントアップ
    For j = 1 To 2
      '可視セルの値を配列に入力
      A(k, j) = B.Cells(1, j)
    Next
  Next
  
  Debug.Print Timer - t & " 秒"
  
  'フィルタを解除
  Range("A1").AutoFilter 1
  
  '確認用
  Range("D1").Resize(UBound(A, 1), UBound(A, 2)) = A
  
End Sub

先ほどと同じ10万行のデータで、実行してみます。

10万行のデータを用意

10万行のデータを用意しました

では、VBAコードを実行してみます。

確認のため、配列をセルに入力します。

フィルタ結果を配列に格納できている

確認のため、配列をセルに入力しました

フィルタ結果のみを、配列に格納できていることがわかります。

では、かかった時間をみてみます。

かかった時間

かかった時間は、約0.1秒です

かかった時間は、約0.1秒です。

先ほどの「一旦コピーして格納」では、「約0.3秒」でしたので、3倍ほど高速になっています。

より高速にVBAコードを実行したいという場合は、「SpecialCells」を使うといいです。

ただ、「一旦コピーして格納」でも「約0.3秒」とかなり高速なので、そこまでデータが多くないという場合は、「一旦コピーして格納」する方法を使う方が簡単です。

おわりに

この記事では、オートフィルタの可視セルを配列に格納する方法について、ご紹介しました。

方法としては、次の2つがあります。

  • 一旦フィルタ結果を別セルにコピーして、配列に格納
  • SpecialCellsをループして、可視セルを配列に格納

VBAコードが簡単なのが、「一旦コピーする」する方法です。

実行する速度が速いのは、「SpecialCellsを使う」方法になります。

VBAコードを高速化したい場合は、「SpecialCells」を使って、そこまでデータが多くなければ、「一旦コピーする」方法を使うといいです。

フィルタ結果を配列に格納する方法について、マスターしていきましょう。

参考になればと思います。最後までご覧くださいまして、ありがとうございました。

関連する記事から探す

カテゴリから探す

カテゴリから見たい項目を探すと便利ですよ。

サイト内を検索する

↓キーワードを入力する

アーカイブから探す