Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2097 / 13645 ツリー ←次へ | 前へ→

【69960】月の最終営業日のデータをピックアップしたい kaze11 11/9/28(水) 21:50 質問[未読]
【69962】Re:月の最終営業日のデータをピックアップ... UO3 11/9/29(木) 11:38 発言[未読]
【69963】Re:月の最終営業日のデータをピックアップ... kaze11 11/9/29(木) 11:51 質問[未読]
【69964】Re:月の最終営業日のデータをピックアップ... UO3 11/9/29(木) 12:06 回答[未読]
【69965】Re:月の最終営業日のデータをピックアップ... kaze11 11/9/29(木) 12:40 お礼[未読]
【69966】Re:月の最終営業日のデータをピックアップ... UO3 11/9/29(木) 16:28 発言[未読]
【69967】Re:月の最終営業日のデータをピックアップ... あすなろ 11/9/29(木) 17:44 回答[未読]
【69969】Re:月の最終営業日のデータをピックアップ... kaze11 11/9/29(木) 21:27 お礼[未読]
【69970】Re:月の最終営業日のデータをピックアップ... あすなろ 11/9/29(木) 22:05 回答[未読]
【69971】Re:月の最終営業日のデータをピックアップ... あすなろ 11/9/29(木) 22:11 回答[未読]
【69972】Re:月の最終営業日のデータをピックアップ... kaze11 11/9/29(木) 22:39 お礼[未読]
【69968】Re:月の最終営業日のデータをピックアップ... kaze11 11/9/29(木) 21:21 お礼[未読]

【69960】月の最終営業日のデータをピックアップし...
質問  kaze11  - 11/9/28(水) 21:50 -

引用なし
パスワード
   下図のような株価のデータが数年分あります

年月日   始値 高値 安値 終値

2011/7/28 100 110   90  100
2011/7/29 120 130   70  110
2011/8/1  140 180   110 130
2011/8/2  110 140   100 120


このデータから、月の最終営業日のデータだけをコピーして、
別シートに貼り付ける方法はあるでしょうか?

年月日   始値 高値 安値 終値

2011/7/29  100 110   90  100
2011/8/31  120 130   70  110
2011/9/30  140 180   110 130
2011/10/31 110 140   100 120

こんな感じにしたいのですが、なにかうまい方法はありませんか?
御教授いただければ幸いです。

【69962】Re:月の最終営業日のデータをピックアッ...
発言  UO3  - 11/9/29(木) 11:38 -

引用なし
パスワード
   ▼kaze11 さん:

直接の回答ではないのですが・・
月末最終営業日ってのは、実にやっかいなものですね。
土曜とか日曜とか、それはなんとかなると思いますが、祝祭日とか
もしかしたら、突発事故で市場がクローズになっている日も(ないと思いますが)

過去数年の毎日のデータがあると思われますので、同一月の実績データの中で
一番大きな日付をもったデータをピックアップというロジックにされてはいかがでしょうか?

【69963】Re:月の最終営業日のデータをピックアッ...
質問  kaze11  - 11/9/29(木) 11:51 -

引用なし
パスワード
   ▼UO3 さん:
コメントありがとうございます。
そもそも、エクセルおよびvbaの知識は豊富ではないのですが、ググってみても、なかなかいい方法が見つからず、こちらで質問させていただきました。

>同一月の実績データの中で
>一番大きな日付をもったデータをピックアップというロジックにされてはいかがでしょうか?

もしよろしければ、そのロジックを、ヒントでも結構ですので御教授いただけないでしょうか?よろしくお願いします。

【69964】Re:月の最終営業日のデータをピックアッ...
回答  UO3  - 11/9/29(木) 12:06 -

引用なし
パスワード
   ▼kaze11 さん:

ヒントのほうがよかったかもしれませんが、書いてしまったので。
Sheet1にある元データを 、Sheet2に転記します。

Sub Sample()
  Dim v1 As Variant
  Dim v2() As Variant
  Dim z As Long
  Dim i As Long
  Dim j As Long
  Dim cYYMM As String
  Dim nYYMM As String
  Dim ok As Boolean
  
  v1 = Sheets("Sheet1").UsedRange.Value
  ReDim v2(1 To UBound(v1, 1), 1 To UBound(v1, 2))
  
  For i = LBound(v1, 1) To UBound(v1, 1)
    ok = True
    If i <> LBound(v1, 1) And i <> UBound(v1, 1) Then
      cYYMM = Format(v1(i, 1), "yyyymm")
      nYYMM = Format(v1(i + 1, 1), "yyyymm")
      If cYYMM = nYYMM Then ok = False
    End If
    If ok Then
      z = z + 1
        For j = LBound(v1, 2) To UBound(v1, 2)
          v2(z, j) = v1(i, j)
        Next
    End If
  Next
    
  Worksheets("Sheet2").Range("A1").Resize(UBound(v2, 1), UBound(v2, 2)).Value = v2
      
End Sub

【69965】Re:月の最終営業日のデータをピックアッ...
お礼  kaze11  - 11/9/29(木) 12:40 -

引用なし
パスワード
   ▼UO3 さん:
本当にありがとうございます!できました!感動しました!
できる方は、こんな簡単に作れてしまうんですね。凄いです!
vbaの中身は分らないことだらけなので、勉強したいと思います。
この中身を変更すると、例えば、月の第一営業日とか、最終営業日の3日前とか、4日前とかをピックアップすることも可能なんでしょうかね?
とまた、質問調になってしまいましたが・・・
これだけ教えていただいただけで恐縮至極なんですけれども・・・
本当にありがとうございました。

【69966】Re:月の最終営業日のデータをピックアッ...
発言  UO3  - 11/9/29(木) 16:28 -

引用なし
パスワード
   ▼kaze11 さん:

>この中身を変更すると、例えば、月の第一営業日とか、最終営業日の3日前とか、4日前とかをピックアップすることも可能なんでしょうかね?

第一営業日については、上でアップした考え方を応用すれば
「同一月で最初にでてきたデータ」で、可能でしょうね。
最終営業日の○日前というのは、アップしたコードの構えではちょっと骨が折れます。
つまり、まず、アップしたコードで各月の最終営業日を把握しておき
もう一度ループさせて、その○日前の日付を抽出するという構成になります。
むしろ、データを日付の降順に並び替えをして、「同一月で○番目にでてきたデータ」を
抽出するという方法がスマートでしょうね。

もちろん、「正攻法」といいますか、どこかに数年分の各月営業最終日テーブルを
つくっておいて、それとマッチングする方法もあるわけですが。

【69967】Re:月の最終営業日のデータをピックアッ...
回答  あすなろ  - 11/9/29(木) 17:44 -

引用なし
パスワード
   ▼kaze11 さん:

日付列で昇順ソートされていて、データ数が膨大でないなら、
データがA1:Enにあるとして、以下の数式をデータのある行までフィルコピー

F2 : =IF(TEXT(A2,"yyyymm")=TEXT(A1,"yyyymm"),SUM(F1)+1,1)

G2 : =COUNTIF(A:A,"< " & DATEVALUE(YEAR(A2)&"/"&MONTH(A2)+1&"/1"))
    -COUNTIF(A:A,"< " & DATEVALUE(YEAR(A2)&"/"&MONTH(A2)&"/1"))-F2+1

オートフィルターでG列に1を指定すると月の最終日
オートフィルターでG列に2を指定すると月の最終日の前日

オートフィルターでF列に1を指定すると月の最初の日
オートフィルターでF列に2を指定すると月の2日目

関数式は苦手なもので、エキスパートの方ならもっと簡潔になるかも。

【69968】Re:月の最終営業日のデータをピックアッ...
お礼  kaze11  - 11/9/29(木) 21:21 -

引用なし
パスワード
   ▼UO3 さん:
重ね重ねありがとうございます。
vbaの中身を詳しく研究してみたいと思います。

>もちろん、「正攻法」といいますか、どこかに数年分の各月営業最終日テーブルを
>つくっておいて、それとマッチングする方法もあるわけですが。

そういう発想も思い付きませんでした。
あすなろさんにお知らせいただいた方法と組み合わせてうまくできるかも・・・
いずれにせよ、再度研究してみたいと思います。
ありがとうございました。

【69969】Re:月の最終営業日のデータをピックアッ...
お礼  kaze11  - 11/9/29(木) 21:27 -

引用なし
パスワード
   ▼あすなろ さん:
ありがとうございます!
月内の日にちに順番に数値がふられました。

>G2 : =COUNTIF(A:A,"< " & DATEVALUE(YEAR(A2)&"/"&MONTH(A2)+1&"/1"))
>    -COUNTIF(A:A,"< " & DATEVALUE(YEAR(A2)&"/"&MONTH(A2)&"/1"))-F2+1
>
>オートフィルターでG列に1を指定すると月の最終日
>オートフィルターでG列に2を指定すると月の最終日の前日

ただgの方はなぜか12月だけ変な数字になってしまいます。
こちらの設定が何かおかしいのか?ちょっと研究してみます。

【69970】Re:月の最終営業日のデータをピックアッ...
回答  あすなろ  - 11/9/29(木) 22:05 -

引用なし
パスワード
   ▼kaze11 さん:
あら、御免なさい。検証不足です。

=COUNTIF(A:A,"< " & DATE(YEAR(A24),MONTH(A24)+1,1))
  -COUNTIF(A:A,"<" & DATE(YEAR(A24),MONTH(A24),1))-F24+1

【69971】Re:月の最終営業日のデータをピックアッ...
回答  あすなろ  - 11/9/29(木) 22:11 -

引用なし
パスワード
   ▼kaze11 さん:

再々御免なさい。

G2 =COUNTIF(A:A,"< " & DATE(YEAR(A2),MONTH(A2)+1,1))
  -COUNTIF(A:A,"<" & DATE(YEAR(A2),MONTH(A2),1))-F2+1

【69972】Re:月の最終営業日のデータをピックアッ...
お礼  kaze11  - 11/9/29(木) 22:39 -

引用なし
パスワード
   ▼あすなろ さん:
ありがとうございます!
完璧にうまく行きました。
かえってお手数をおかけして、申し訳ございませんでした。

2097 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free