ExcelでSQLを使う

エクセルでSQLを使う必須の関数を紹介しします。

ExcelでSQLを使う-015: SQL ORDER BY 節 多重ソート

動物のお医者さん 第7章

 鷹匠になることを夢見た小学生のハムテルは、ある日、道端で60円のひよこを買った。それはやがて、主人にまで蹴りをいれる恐るべきニワトリに成長した。いくたびかの苦難をを乗り越えて西根家にたどりついた気の強い仔猫は、そのままおばあさんにもらわれ、今では近所のパトロールに余念のない毎日である。アフリカでウイッチ・ドクターとして崇められていた篠原教授の威厳は、日本でも不動のままである。強いものはいくつになっても強いのだった。(同書の帯より)

◇◇◇◇◇

ORDER BY 節

 前項までは、検索した行の並びには関心を払いませんでした。しかし、検索結果を並び替えることも SQL文の重要な役割りです。ORDER BY節を使うことで、SELECT節に指定した列のいずれかを基準として検索した行を特定の順序で並び替えるができます。

 

  例えば、得意先台帳から<名前>と<読み>を抽出し<読み>の五十音順に並べることもできます。

 

 SELECT 氏名,読み FROM [得意先台帳$A1:F11] ORDER BY 読み


 本稿では、得意先台帳から<読み>昇順で抽出した<名前>を同じバイト数の文字列に左詰めして、かつ<読み>を付加してプリントするマクロを紹介します。

 

 

 

Sub Test()
      Dim I                  As Integer
      Dim N                 As Integer
      Dim strSQL          As String
      Dim Customers() As String
      Dim strName       As String
      Dim strYomi        As String
 
      strSQL = "SELECT 氏名,読み FROM [得意先台帳$A1:F11] ORDER BY 読み"
      Customers() = Split(DSelect(strSQL), "|")
      N = UBound(Customers) - 1
      For I = 0 To N
           strName = CutStr(Customers(I), ";", 2)
           strYomi = CutStr(Customers(I), ";", 3)
           Debug.Print SetL(strName, String(20, "-")) & strYomi
      Next I
End Sub

 

' ==================

'  文字を左詰めする

' ==================

Public Function SetL(ByVal Text1 As String, ByVal Text2 As String) As String
      Dim I As Integer
      Dim J As Integer
      Dim L As Integer
      Dim M As Integer
      Dim N As Integer

 

      J = Len(Text1)
      L = LenH(Text2)
      For I = 1 To J
            M = LenB(StrConv(Left(Text1, I), vbFromUnicode))
            If M > L Then
                 SetL = Left(Text1, I - 1) & Left(Text2, L - N)
                 Exit Function
            Else
                 N = M
            End If
      Next I
      SetL = Text1 & Left(Text2, L - N)

End Function

 

' ==================

'  文字を右詰めする

' ==================

Public Function SetR(ByVal Text1 As String, ByVal Text2 As String) As String

      Dim I As Integer
      Dim J As Integer
      Dim L As Integer
      Dim M As Integer
      Dim N As Integer


      J = Len(Text1)

      L = LenH(Text2)
      For I = 1 To J
            M = LenH(Mid$(Text1, 1, I))
            If M > L Then
                  SetR = Left$(Text2, L - N) & Left$(Text1, I - 1)
                  Exit Function
            Else
                  N = M
            End If
       Next I
       SetR = Left$(Text2, L - N) & Text1

End Function

 

' =============================

'  文字列の長さをバイト数で返す

' =============================

Public Function LenH(ByVal Text As String) As Integer

      LenH = LenB(StrConv(Text, vbFromUnicode))
End Function

 

 

多重ソート

  ORDER BY 節に複数の列をカンマで区切って指定して、”多重ソート”することができます。次は、顧客情報を最初に<住所1>で並び替え、次に<読み>を基準に地区ごとのグループを並び替えます。

 

 SELECT 名前, 読み, 住所1 [得意先台帳$A1:F11]
                ORDER BY 住所1, 読み