メインコンテンツへスキップ
【VBA】キューを実装する

【VBA】キューを実装する

·3 分
Programming VBA
かずさプログラマー
著者
かずさプログラマー
業務の作業自動化を行っています。Go、VBA、Pythonを主に使用しています。過去にはC#、VB.Net、JavaScriptも使用していました。
目次

VBAにデータ構造のキューがないのでクラスモジュールを使用してキューを実装してみます。

クラスモジュールの使用方法については下記サイト様の情報を参照させていただきました。
ありがとうございます。

キューの構造
#

キューはデータ構造の一種です。
FIFO(First In First Out)といわれる最初に入れたデータが、最初に取り出される構造になっています。 キューにデータを入れる操作をenqueue(エンキュー)、キューからデータを取り出す操作をdequeue(デキュー)といいます。

実装する機能
#

今回はクラスモジュールを使用して、下記の機能を実装してみます。

  • キューの末尾にデータを追加するenqueue(エンキュー)
  • キューに存在する先頭のデータを取り出すdequeue(デキュー)
  • キューに存在するデータ数をカウントするcount(カウント)

キューの実装
#

クラスモジュールを追加します。

追加されたクラスモジュール名をClass1からQueueに変更します。

Queueクラスのコードは以下になります。
Collection型を利用してキューを実装しています。

Option Explicit

Private c As Collection       'キューのデータ本体
Private dataSizeIndex As Long '最後尾のデータ位置
Private headerIndex As Long   '先頭のデータ位置

Private Sub Class_Initialize()
  'コンストラクタ
  
  Set c = New Collection
  dataSizeIndex = 0
  headerIndex = 0
  
End Sub
Public Sub enqueue(v As Variant)
  'キューの末尾にデータを追加する
  
  c.Add v, CStr(dataSizeIndex)       'collectionのkeyはstring型しか設定できない
  dataSizeIndex = dataSizeIndex + 1
  
End Sub
Public Function dequeue() As Variant
  'キューの先頭のデータを取り出す
  
  If c.count = 0 Then
    'キューにデータが存在しないときは、エラー番号1000をRaiseする
    Err.Raise 1000, "Queue", "キューにデータが存在しません"
  End If
  
  Dim vType As Long
  vType = VarType(c.Item(CStr(headerIndex)))
  
  Select Case vType
    'オブジェクト、データアクセスオブジェクト、ユーザー定義型は
    'Set構文を利用する
    Case vbObject
      Set dequeue = c.Item(CStr(headerIndex))
    Case vbDataObject
      Set dequeue = c.Item(CStr(headerIndex))
    Case vbUserDefinedType
      Set dequeue = c.Item(CStr(headerIndex))
    Case Else
      dequeue = c.Item(CStr(headerIndex))
  End Select
  
  Call c.Remove(CStr(headerIndex))
  headerIndex = headerIndex + 1
  
End Function
Public Function count() As Long
  'キューのデータ数をカウントする
  
  count = c.count

End Function
Private Sub Class_Terminate()
  'デストラクタ
  
  Set c = Nothing
  
End Sub

キューのテスト
#

標準モジュールを追加します。

追加した標準モジュールにQueueをテストするコードを貼り付けます。
Queueクラスをテストするコードは以下になります。

Option Explicit
Sub test_Queue()

On Error GoTo ErrorLabel
  
  Dim q As Queue
  Set q = New Queue 'Queueクラスをインスタンス化
  
  q.enqueue 1       '1をキューに追加する
  q.enqueue 2       '2をキューに追加する
  q.enqueue 3       '3をキューに追加する
  MsgBox q.dequeue  '1をキューから取り出す
  MsgBox q.dequeue  '2をキューから取り出す
  MsgBox q.dequeue  '3をキューから取り出す
  MsgBox q.dequeue  'エラー番号1000がraiseされる

ErrorLabel:
  If Err.Number = 1000 Then
    MsgBox Err.Description, vbCritical, "エラー発生"
  Else
    MsgBox Err.Description, vbCritical, "エラー発生"
  End If
  
End Sub

enqueueメソッドで1,2,3をキューに追加後dequeueメソッド4回実行しています。

最初に追加した1から、順番にデータを取り出していきます

4回目のdequeueメソッド実行時にデータがキューに存在しないので、エラーが発生します。
エラー番号は1000番で設定しています。

Github
#

kazusapg/vba_queue

VBA
0
0

関連記事

【VBA】Excelのシート名を変更する
·1 分
Programming VBA
VBAでExcelの表示倍率を変更
·1 分
Programming VBA
VBAで配列の長さを指定するのに変数を使う方法
·1 分
Programming VBA