PeaceJetのブログ

金融系の社内エンジニアをやりながら、マーケティングやプランナーなども

ある月の最初の営業日のデータを抜き出す方法。【ExcelVBA・エクセルマクロ】

今回は、ある月の最初の営業日のデータを抜き出す方法
をご紹介します。

配列の応用みたいなものですが、
月が変わった最初の日だけ抜き出したい。

株式などの価格を月の初めの値を取得して
チャートを作成するなどと言った場合にも、
対応できるかなと考えています。

以下のようなリストがあると仮定します。

ポイントは2つです。

  1. 月が変わった直後のデータは、最初の営業日のデータである。
  2. 年月日のうち、年と月を比較する。

 ABC
12015/1/5¥2,103,444¥-8,098
22014/12/29¥1,000,746¥-12,333
32014/12/15¥3,485,938¥-26,321
42014/12/1¥132,847¥-3,333
52014/11/14¥874,913¥-126,997
62014/11/3¥2,483,456¥-4,649

  • htmlで¥マークを表示させるには¥を使いましょう。
Sub MakeMonthlyData()
    
    Dim NextArray(3), CurrentArray(3), TargetWorksheets As Variant
    Dim EndRow As Integer
    
    ReDim TempArray1(0), TempArray2(0) As Variant
        
        With ActiveSheet
        
            .Range("G:H").Clear
            
            EndRow = .Range("A65535").End(xlUp).Row
            
            For i = 1 To EndRow - 1 ' -- (1)
            
                CurrentArray(0) = Split(.Cells(i, 2), "/")(0)
                CurrentArray(1) = Split(.Cells(i, 2), "/")(1)
                CurrentArray(2) = Split(.Cells(i, 2), "/")(2)
                
                '配列の要素が空になる場合はエラーになるので注意。            
                NextArray(0) = Split(.Cells(i + 1, 2), "/")(0)
                NextArray(1) = Split(.Cells(i + 1, 2), "/")(1)
                NextArray(2) = Split(.Cells(i + 1, 2), "/")(2)

                
                If CurrentArray(0) = NextArray(0) And _
                     CurrentArray(1) = NextArray(1) Then
                    
                    'NothingTODO
                
                Else
                    
                    n = UBound(TempArray1)
                    ReDim Preserve TempArray1(n + 1)
                    ReDim Preserve TempArray2(n + 1)
                    
                    TempArray1(n) = CurrentArray(0) & "/" & _
                                    CurrentArray(1) & "/" & _
                                    CurrentArray(2)

                    TempArray2(n) = .Cells(i, 3).Value
                
                End If
           
            Next i
        
                For j = 0 To UBound(TempArray1)
                
                    .Cells(j + 1, 4) = TempArray1(j)
                    .Cells(j + 1, 5) = TempArray2(j)
                
                Next j
            
                    ReDim Preserve TempArray1(0), TempArray2(0)
                    
        End With

End Sub

実行結果

 ABCDE
12015/1/5¥2,103,444¥-8,0982015/1/5¥2,103,444
22014/12/29¥1,000,746¥-12,3332014/12/1¥132,847
32014/12/15¥3,485,938¥-26,321  
42014/12/1¥132,847¥-3,333  
52014/11/14¥874,913¥-126,997  
62014/11/3¥2,483,456¥-4,649  

問題点 → 最後の要素を取得できない可能性

  1. 上記のプロシージャでは、最後の要素を取得できない可能性がある。
  2. (1)で、「-1」をコメントアウトするとエラーになる。
  3. これは、Split関数が空要素を受け付けないため?
  4. 従って、一番最後のセルが最初の営業日だった場合、取得できない可能性がある。

課題

解決法として考えられるものを、いくつか挙げてみます。

  1. そもそもSplit関数を使わない。