2014年6月11日水曜日

VBA 一意なリストの高速作成

一意なリストとは、列に重複したレコードが存在した場合、重複を排除したレコードの一覧のこと。
SQLでいえば、distinct のことです。

Excelの画面操作では、以下の手順で作成(わかりやすく1列で操作)

1)重複したレコードを含む範囲を選択
2)データ → フィルタ → フィルタオプションの設定
3)"重複するレコードは無視する"にチェックを入れる
4)OK ボタンをクリック

Excelのフィルタ機能で、リストが一意になるように、重複したレコードは非表示になります。
しかし、大量データでは遅いのと、あくまで非表示にしているだけなので、使い勝手が悪いです。
そこで、VBAで一意なリストを作成します。


<前提>
重複したリスト Sheet1 A列にA1から格納されている
一意なリストはSheet2のA列に作成する

Dim myDic As Object, myKey As Variant
Dim c As Variant, varData As Variant

Set myDic = CreateObject("Scripting.Dictionary")
'                                ↓重複したリストのシート名
With Worksheets("Sheet1")
'                   ↓重複したリストの範囲
  varData = .Range("A1", .Range("A" & Rows.Count).End(xlUp)).Value
End With

For Each c In varData
  If Not c = Empty Then
    If Not myDic.Exists(c) Then
      myDic.Add c, Null
    End If
  End If
Next

myKey = myDic.Keys
'                                  ↓一意なリストを作成するシート名
With Worksheets("Sheet2")
'                ↓A列をクリア
  .Range("A:A").ClearContents
'                ↓一意なリストを作成
  .Range("A1").Resize(myDic.Count) = Application.WorksheetFunction.Transpose(myKey)
End With

Set myDic = Nothing

2014年6月2日月曜日

Netezza(ネティーザ) Oracleでいうところの dual表

OracleでダミーのSQLを実行する時によく使う dual テーブルがあります。

当然、Netezzaには dual テーブルはありませんが、ダミーのSQLを実行する方法はあります。

・Oracle の場合
select to_char(sysdate,'YYYY-MM-DD') from dual;

・Netezza の場合
select to_char(now(),'YYYY/MM/DD') ;

from 句を省略することで、同じ動きをします。