2007年5月12日 (土)

売買指示シートの出来あがり

  Vba41_3 これがVBEです。

 Vba42 売買指示シートのトップシートです。データ取得ボタンをクリックすればデータ取得フォームが現れます。行あけボタンで2枚目以降のシートの3行目を入力した数だけ行が挿入され,必要な式が挿入された行にコピーされます。(30秒ぐらい)その作業が終わったのを確認し、フォームのデータ取得ボタンをクリックして下さい。(1分ぐらいで15銘柄のデータが取得されます。2つのブックで3分ぐらいです。)

Vba43 トップシートに戻り、左側のボタンをクリックして行けば,結果が出ます。

データ取得に余り時間が掛らないのでゆっくりと検討することができます。

シュミレーションの4銘柄は昨日の下げにもしぶとく耐えHOLDとなっています。私は4112を残し離してしまいました。振り落とされたようです。また機会があれば買い戻す予定です。

Vba44 共栄タンカー、三菱マテリアルはストップ率を小さくしていたためストップに掛りました。一応は適切な処置であったと思います。

それで一つ間違いに気付きました。共栄タンカーの買い予定値がこの前作った条件式では両シグナルのどちらかVba45の値になると思います。ストップで売りですから。買い予定値はそのトレーディングストップの値になります。(しかし買戻しは難しいですね。)下に訂正後の式を書いておきます。{セルT3}に入れて下さい。

=IF(OR($AA3=0,$AA3=2,$AA3=4),IF(AND($N3="",$P3=""),$O3,IF(AND($N3="*",$P3="*"),$M3,IF($Z3="ストップ",$Y3,IF($M3>$O3,$O3,$M3)))),"")

これでこのシリーズは終わりです。是非とも実行してみてください。

| | コメント (0) | トラックバック (0)

2007年5月 7日 (月)

VBAの入り口 その6

つづき

データ取得フォームの呼び出しボタンをエクセル上に作ってください。作り方はVBAの入り口を参照してください。

(オブジェクト名) データ取得ボタン

ソースコード

        *******

Sub データ取得ボタン_Click()

    データ取得.Show vbModeless

End Sub

        *******

Showメソッド はユーザフォーム(先日作ったデータ取得フォーム)を表示します。

vbModeless はフォームを開いた状態で他のエクセルの作業が出来ます。この記述がないとフォームをとじるまで他のエクセルの作業が出来ません。

       *

次にVBEのデータ取得フォームを選択、オブジェクトの表示ボタンをクリック、

フォームの閉じるボタンをクリック、コードの表示ボタンをクリック、

下のコードを記述(コピー/ペースト)して下さい。

        ********

Private Sub 閉じる_Click()

    Unload Me        

End Sub

        ********

エクセルに戻り、ボタンの名前をデータ取得 に変えてください。

そのボタンを右クリックし、マクロ登録(N)、データ取得 Clickを選択しOKをクリックしてください。

 テストします。

フォームを出したり消したり出来るはずです。

つづく

| | コメント (0) | トラックバック (0)

2007年5月 6日 (日)

データ取得に入る前に

 昨日は町の氏神さんで子供餅つき大会、すがすがしい五月晴れの下、ひさしぶりに餅つきをしてきました。5/4から準備をし雨が降らないか心配していたのですが、晴れて良かったです。多くの参加をいただきました。

 その5に入る前に今からどのような事をしていくか一欄にしないと、自分も何から進めれば良いのか分からなくなるし、それ以上に皆さんは今何をしているのか分からなくなってしまうでしょうね。

今後の予定

        ********

 1. フォームの作成

 2. エクセル上にフォーム呼び出しのボタンを作る。

 そのマクロを作る。閉じるボタンのマクロ記述。

 3. フォームの各ツールのマクロ記述。

 4.行の挿入Sub の記述。

 5. 式のコピーSub の記述。

 6 ヤフーデータ取り込みSub の記述。

                       おわり

        ********

これで今後の記事が書きやすくなりました。

つづく

| | コメント (0) | トラックバック (0)

2007年5月 5日 (土)

VBAの入り口 その4

つづき

 前回は長く書きすぎました。このプログラム6個は同じパタンですからその2だけでも良かったのですが。

 Vba22それで何処がおかしいかと言いますと。NOポジの表示が一列空いてしまうのですよ。それで何回プログラムを見ても間違ってないのに、初めて作った時には各ボタンを一個ずつ順番に作っていましたから、よけいに何処がおかしいのか分かりませんでした。それで他の項目のボタンを作ってみてやっとNOポジの表示だけがおかしいと気付いたのです。

 他と違うのは売買サインだけです。

このままだと1枚目のシートからIfで条件を調べますから,1枚目のシートのセルAA3には何も入っていません、セルG1にも何も入っていません、それで{セルAA3}=0と判断し、{セルG1}=””を表示したのですつまり空を表示していたのです。

 それで応急処置として1枚目のシートの{セルAA3}に5をいれてみました。これで直るはずです。(ショボイですよね。)

 今から修正します。 と宣言したものの、上手く行かない。

たとえば

If  objSheet <> Worksheets(1)  Then

       :

       :

End If

として、1枚目のシートをパスしようとしましたが上手く行きません。残念

次はf1と言うフラッグを作り0から1ずつ増やしf1が1になるまでパスするようにしてみます。

一応、出来ました。

        ********

Sub NOぽじ_Click()

    Dim objSheet As Worksheet
    Dim ingCount As Integer
    Dim f1 As Integer
   
    ingCount = 0
    f1 = 0
   
    Application.ScreenUpdating = False
   
    For Each objSheet In ThisWorkbook.Worksheets
   
        If f1 <> 0 Then
       
            If objSheet.Range("AA3") = 0 Then
       
                 Worksheets(1).Range("C11").Offset(0, ingCount) = objSheet.Range("G1")
                 Worksheets(1).Range("C12").Offset(0, ingCount).Value = objSheet.Range("E3").Value
                 Worksheets(1).Range("C13").Offset(0, ingCount).Value = objSheet.Range("T3").Value
            
            
                 ingCount = ingCount + 1
            
            
            End If
       
         End If
         
           f1 = f1 + 1            
       
    Next
   
            Worksheets(1).Range("C12").Offset(0, ingCount) = "以上なし"
       
    Application.ScreenUpdating = True
 
  End Sub

        ********

赤色の部分が今回追加したところです。

次回は いよいよデータ取得です。

  前回のデータ取得は検証用に1銘柄1000日分の取得でした。

  今回は売買指示シート用でシート(銘柄)毎にデータを取得します

         好御期待

| | コメント (2) | トラックバック (0)

2007年5月 4日 (金)

VBAの入り口 その3

つづき

先に日付のソースコードを変えてみます。ツール(T)からVBEを開きます。

左上のプロジェクト・ウィンドーの標準モジュールの日付を選択し、左上コードの表示ボタンをクリックして下さい。

先日、記述したプログラムがコード・ウィンドーに現れます。

        ********

Sub 日付_Click()

Application.ScreenUpdating = False

    Set a = Worksheets(1)
    Set b = Worksheets(2)

        a.Range("A7").Value = b.Range("A3").Value   
   
Application.ScreenUpdating = True

End Sub

        ********

Sub 日付_Click() のClick() はClickイベントで先に登録したボタンをクリックするとこのプログラムが実行されるというものです。

          *

VBAに慣れている方は、どんどん先に進んでください。昨日の記事のみどりの部分を変えるだけですよね。

それと一つ注意するのを忘れていました。2枚目以降の売買指示シートの{セルG1}には必ず銘柄銘を入れてください。そうしないとボタンをいくらクリックしても結果が返ってきません。

またテストするには銘柄(シート数)を増やして下さい。{セルAA3}には0から4までの値を適当に入れておけば良いと思います。

ただ1箇所だけこれはおかしいと言うところがあります。

今から書くソースコードは敢えて修正前のものを書きます。(自分は今も修正しないでショボイ方法で処理しています。)

何処がおかしいか,修正方法はなにか、考えてください。また、よろしければコメントをください。

2.NOポジ(0)のサインの出ている銘柄の抽出

        ********

Sub NOぽじ_Click()

    Dim objSheet As Worksheet
    Dim ingCount As Integer
   
   
    ingCount = 0
   
    Application.ScreenUpdating = False
   
    For Each objSheet In ThisWorkbook.Worksheets
       
        If objSheet.Range("AA3") = 0 Then
       
            Worksheets(1).Range("C11").Offset(0, ingCount) = objSheet.Range("G1")
            Worksheets(1).Range("C12").Offset(0, ingCount).Value = objSheet.Range("E3").Value
            Worksheets(1).Range("C13").Offset(0, ingCount).Value = objSheet.Range("T3").Value
            
            
            ingCount = ingCount + 1
            
            
        End If
       
    Next
   
            Worksheets(1).Range("C12").Offset(0, ingCount) = "以上なし"
       
    Application.ScreenUpdating = True   
      

End Sub

        ********

3.買い(3)のサインの出ている銘柄の抽出

        ********

Sub 買い_Click()

    Dim objSheet As Worksheet
    Dim ingCount As Integer
   
       
        ingCount = 0
   
    Application.ScreenUpdating = False
      
       
    For Each objSheet In ThisWorkbook.Worksheets
   
        If objSheet.Range("AA3") = 3 Then
       
            Worksheets(1).Range("C16").Offset(0, ingCount) = objSheet.Range("G1")
            Worksheets(1).Range("C17").Offset(0, ingCount).Value = objSheet.Range("E3").Value
            Worksheets(1).Range("C18").Offset(0, ingCount).Value = objSheet.Range("R3").Value
                        
                                       
                  
        ingCount = ingCount + 1
       
       
        End If
    Next
   
            Worksheets(1).Range("C17").Offset(0, ingCount) = "以上なし"

   
   Application.ScreenUpdating = True
       

End Sub

        ********

4.売り(2)のサインの出ている銘柄の抽出

        ********

Sub 売り_Click()

    Dim objSheet As Worksheet
    Dim ingCount As Integer      
   
    ingCount = 0
   
    Application.ScreenUpdating = False
      
       
    For Each objSheet In ThisWorkbook.Worksheets
   
        If objSheet.Range("AA3") = 2 Then
       
           Worksheets(1).Range("C21").Offset(0, ingCount) = objSheet.Range("G1")
           Worksheets(1).Range("C22").Offset(0, ingCount).Value = objSheet.Range("E3").Value
           Worksheets(1).Range("C23").Offset(0, ingCount).Value = objSheet.Range("T3").Value
                  
        ingCount = ingCount + 1
       
       
        End If
    Next
   
            Worksheets(1).Range("C22").Offset(0, ingCount) = "以上なし"
   
   Application.ScreenUpdating = True 

End Sub      
       
          ********

5.ストップ・サインの出ている銘柄の抽出

        ********

Sub ストップ_Click()

  Dim objSheet As Worksheet
    Dim ingCount As Integer
            
   
    ingCount = 0
   
    Application.ScreenUpdating = False
      
       
    For Each objSheet In ThisWorkbook.Worksheets
   
        If objSheet.Range("Z3") = "ストップ" Then
       
           Worksheets(1).Range("C26").Offset(0, ingCount) = objSheet.Range("G1")
           Worksheets(1).Range("C27").Offset(0, ingCount).Value = objSheet.Range("Y3").Value
                                    
                  
        ingCount = ingCount + 1
       
       
        End If
    Next
   
            Worksheets(1).Range("C27").Offset(0, ingCount) = "以上なし"
   
   Application.ScreenUpdating = True
   

End Sub
          
          ********

6.ストップ(4)点灯した銘柄の抽出

        ********

Sub ストップ点灯_Click()

Dim objSheet As Worksheet
    Dim ingCount As Integer
   
       
        ingCount = 0
   
    Application.ScreenUpdating = False
      
       
    For Each objSheet In ThisWorkbook.Worksheets
   
        If objSheet.Range("AA3") = 4 Then
       
            Worksheets(1).Range("C30").Offset(0, ingCount) = objSheet.Range("G1")
           Worksheets(1).Range("C31").Offset(0, ingCount).Value = objSheet.Range("Y3").Value
                                    
                
        ingCount = ingCount + 1
       
       
        End If
    Next
   
            Worksheets(1).Range("C31").Offset(0, ingCount) = "以上なし"
   
   Application.ScreenUpdating = True
       
   
End Sub

        ********

修正方法はまた後で考えるとして、これでテストしてみてください。プログラムの順序が違っていたため,途中書くのに手間取りました。多分これで良いと思います。と確認していたらまた間違えていた、あぶないあぶない・・・・・

つづく

| | コメント (0) | トラックバック (1)

2007年5月 3日 (木)

VBAの入り口 その2

 つづき

ここまで出来れば後はこの応用、入り口だけが、始めの一歩が、どんな事でも困難なのではないだろうか。後は簡単ではないが何とかなる。何とか出来そうだ・・・・・・Vba14

始めの一歩を踏み出そう

前回したように、図のように6個のボタンを作り

各々マクロ登録の新規作成(N)をクリック、して行く。

VBEは図のようになり、オブジェクト名を抽出とする。

Vba15 Sub の横を HOLD、NOポジ、買い、売り、ストップ、ストップ点灯と記入して行く。

 赤丸のところは自然と変わります。

エクセルに戻り各ボタンの名前を上からHOLD、NOポジ、買い、売り、ストップ、ストップ点灯と変えます。(前回参照

Vba18 ボタンを右クリックしてマクロの登録(N)、HOLDのボタンであればHOLDを選択し、OKをクリックします。(6個全てにしてください)右の図の様になります。

これで準備完了。

後はVBEを開きSubとEnd Subの間にソースコードを記述していきます。

記述の方法にはマクロの記録機能を使う方法、自分で記入していく方法、他の人が作ったモジュールを何処かからパクッて来る方法などがあります。

マクロの記録機能が使えれば良いのですが,エクセルの作業が今回複数のページにまたがっているので、今から書くソースコードをコピーペーストしてください。

1.HOLD(1)のサインの出ている銘柄の抽出

Sub HOLD Click() と End Sub の間に下のソースコードを貼り付けてください。

               ***********

    Dim objSheet As Worksheet
    Dim ingCount As Integer      
   
    ingCount = 0
   
    Application.ScreenUpdating = False
      
       
    For Each objSheet In ThisWorkbook.Worksheets
   
        If objSheet.Range("AA3") = 1 Then
       
           Worksheets(1).Range("C6").Offset(0, ingCount) = objSheet.Range("G1")
           Worksheets(1).Range("C7").Offset(0, ingCount).Value = objSheet.Range("E3").Value
           Worksheets(1).Range("C8").Offset(0, ingCount).Value = objSheet.Range("R3").Value
          
                  
        ingCount = ingCount + 1
       
       
        End If
    Next
   
            Worksheets(1).Range("C7").Offset(0, ingCount) = "以上なし"
            
   
   Application.ScreenUpdating = True

               **********

コードの説明

         *

Dim   ステートメントで変数は宣言をしなければなりません。

『 Dim 変数名 As データ型 

 変数名 objSheet は自分で考えて作るもので、アルファベット小文字で始めます例えば f1 でも構いません。分かりやすい短いのが良いでしょうね。

多分これは何かの本からそのまま移したと思います。

データ型 Worksheet これは普通、変数の精度 によって決まります。(これは多分オブジェクト型だと思います)

データ型 Integer は整数値

       *

For Each objSheet In ThisWorkbook.Worksheets ~

Next

objSheet(オブジェクト型)変数が1から増えていき。Nextまでワークブックの数だけくりかえします。

後でシートを増やしてもこれで対応してくれます。普通の変数型にすれば予めシート数を数えていなければなりませんし、シートを増やしたり減らしたりすればその度に変えなければなりません。

          *

If objSheet.Range("AA3") = 1 Then

End If

objSheet.はつまり最初 Worksheets(1). で Sheet1のセルAA3(売買指示サイン)が1なら次の処理をしingCountは0から1増えます(ingCount = ingCount + 1)。(当然Sheet1のセルAA3は1ではありません)

 objSheet.はWorksheets(2). となりSheet2のセルAA3が1なら次の処理をしingCountは1増えます

          *

Worksheets(1).Range("C6").Offset(0, ingCount) = objSheet.Range("G1")

セルAA3が1ならそのシート(objSheet.)のセルG1(銘柄名)がSheet1のセルC6から(0、ingCount)(行、列)離れたセルに入ります。つまりセルC6、セルD6、セルE7と右に入っていきます。Offset(0, ingCount)はそう言う意味です。

その下にE3(終値)、R3(売り+TS 予定)が入ります。

         *

残りのボタンのソースコードもこれと同じで、条件の値みどりを変えます。その下の式の記入の位置みどりを最初に記入するセル位置に、記入する値みどりを見たいセルに変えます。

つまりこの部分を変えることにより色んな表示が今後出来ると言うことです。

 素晴らしいアイデアがあればシート2以降のK列~V列までを改良して、先ほど書いたSheet1のソースコードのみどりの部分を変えると面白いことになると思います。

 話が反れてしまいましたね。

それで、今作ったボタンを押して記入された部分は消去ボタンを押しても消えませんので今からそのソースコードを昨日作った消去モジュールに付け加えていきます。1部変更しましたのでよろしくお願いします。

         ***********

Set a = Worksheets(1)
   
    a.Range("A7").ClearContents
    a.Range("C6:Q8").ClearContents
    a.Range("C11:Q13").ClearContents
    a.Range("C16:O18").ClearContents
    a.Range("C21:O23").ClearContents
    a.Range("C26:O27").ClearContents
    a.Range("C30:O31").ClearContents

         ***********

ゆいさんのコメントを試してみればすっきりしたソースになりました。

ありがとう。

 思い出しました。半年前に多分上手く行かなかったんだと、それでマクロの記録を使ったんだろうと。

この場合 Set がいるのですね。

皆さんも作って試してくださいね。

| | コメント (0) | トラックバック (1)

2007年5月 2日 (水)

VBAの入り口

 次に書く記事の予定をしてしまったので、どの様に書けば良いのか、思案していたところ過去に作っていたシートが出てきました。Vba

 去年の8月頃はまだ幼稚なことをしていて、何とかして一目で各銘柄のサインを見ようと試みていたのでしょう。この時はまだVBAを使ってのデータ取得はしていなかったので銘柄数も少なく。クエリも知りませんでした

 それで、初心に返り一から実際にやってみよう。上の半年前のように、実際に今から作り始めるという設定で,書いていこう。と言うことに決めました。

           *************

 しかし,いざ始めてみるとなかなか上手くいきません。始めてVBAに挑戦する人もこの入り口でつまずくのではないでしょうか。(プロの方から見れば何をどんくさい事をしてるねんと言われそうです。完全な関西弁)ソースコードだけを書いてこれをコピーしてくださいとするのが1番楽なんですよね。でも、実際にはこんな簡単な事でも2・3年前に漠然とこんな事が出来ないかなァ~と言う考えがあって。1年ほど前に具体的なテスト版のようなものが出来あがり。こんな機能があればと改良を重ね。本を読み,他のサイトも訪ね、そしてやっとの思いで作りました(本当は作っていく過程が楽しいのですが)。

 今から書こうとする部分も先日やっと完成したのですから、半年以上かかった事になります。

              ************

 それでは、予め作っておいたシートにVba01

1.マクロ実行用のボタンを作ります。

 表示(V),ツールバー(T),フォーム

2.フォームのボタンをクリック、セルA2、に一個、Vba02

 ななめにドラッグしてつくります。

Vba033.マクロ登録の新規作成(N)をクリック,VBEが出ますので、

Subのとなりに日付と入れ、オブジェクト名を日付としてください。Vba08

4.エクセルシートに戻り今作ったボタンを右クリック, Vba05

 テキストの編集(X),ボタンの名前を日付としてください。

5.ボタンを右クリック、マクロ登録(N)をクリックVba10

日付 Clickを選択し、OKボタンをクリックしてください。

Vba09 6.VBEに戻り、Sub 日付_Click() とEnd Subの間に

次のソースコードをコピー/ペーストしてください。

             ************

Application.ScreenUpdating = False    
   
    Worksheets(2).Select
    Range("A3").Select
    Selection.Copy
    Worksheets(1).Select
    Range("A7").Select
    ActiveSheet.Paste
   
Application.ScreenUpdating = True

             ************

Application.ScreenUpdating = をFalseにすればTrueになるまで画面が変わりません。その間にコンピュータは計算などの作業をします。

 2番目のワークシートのセルA3をコピーし1番目のワークシートのセルA7にペーストするということです。

                            ************

次に同じくマクロ実行用のボタンを作ります。このボタンは日付ボタンによって記入されたセルA7を消すものです 。セルE2の位置に作ってください。

7.マクロ登録の記録(R)をクリック,マクロの記録、Vba12

マクロ名(M)を消去 Click、ユーザー名を書いて

OKをクリックします。

8.実際にいつもエクセルでしているようにセルA7を消してください。そして記録終了のボタン■をクリックしてください。

Vba13 9.ツール(T),マクロ(M),VBE(V)でVBEを開き記述されているのを確認します。オブジェクト名を消去と書いて出来あがり。

ソースコードは

       ************

    Range("A7").Select
    Selection.ClearContents

       ************

 となります。

ボタンの名前を4.でしたように消去としてください。

上書き保存を忘れずに。

実際に動くか試してください。日付が出たり消えたりするはずです。

つづく

| | コメント (5) | トラックバック (0)