EXCEL 株価ノート

アップデート:April. 2024

株をé‹ç”¨ã—始ã‚ã¦æ•°å¹´ãŒçµŒã¤ã®ã§ã™ãŒã€æ¯Žæ—¥ã®è‡ªåˆ†ã®è³‡ç”£ã®å¢—減を日記ã«ã—よã†ã¨æ€ã„ã€EXCELã§è¨˜éŒ²ã—始ã‚ã¾ã—ãŸã€‚
ã¨ã“ã‚ãŒã€æ¯Žæ—¥å…¥åŠ›ã™ã‚‹ã®ãŒã‚ã‚“ã©ãã•ããªã£ã¦ããŸã®ã§ã€è‡ªå‹•åŒ–ã—ãŸã¨æ€ã„ EXCELã®VBAを使ã£ãŸãƒ—ログラムを組込んã§ã¿ã¾ã—ãŸã®ã§ã€ã“ã“ã§ç´¹ä»‹ã—ã¾ã™ã€‚

Step1. ã€VBA】ボタン無ã—ã§ãƒ—ログラムを実行


ã”覧ã®é€šã‚Šã€1æ—¥ã®è¨˜å…¥æ¬„ãŒã€ä¿æœ‰æ ªä¾¡ã¨è³‡ç”£é¡ã®å¤‰å‹•ã‚’ï¼’è¡Œã§è¨˜éŒ²ã™ã‚‹ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã«ãªã£ã¦ã„ã¾ã™ã€‚
ã“ã®ï¼’è¡Œã®è¨˜å…¥æ¬„ã‚’ã€æ¯Žæ—¥è¿½åŠ ã™ã‚‹ã®ãŒæ‰‹é–“ãªã®ã§ãƒ—ログラムã§è‡ªå‹•åŒ–。

見出ã—ã«ã‚る通り ボタンを設置ã›ãšã«ãƒ—ログラムを実行ã—ã€è¨˜å…¥æ¬„を自動追加ã§ãるよã†ã«ã—ã¾ã—ãŸã€‚
ã¤ã„ã§ã«ã€åŒã˜ä»•çµ„ã¿ã‚’使ã£ã¦ã€æ–°ã—ã„銘柄を記録ã™ã‚‹åˆ—も追加ã§ãるよã†ã«ã—ã¦ã„ã¾ã™ã€‚

ã€ã‚µãƒ³ãƒ—ルコード】

株価ノート_step1 サンプルã¯ã‚³ãƒãƒ©

⇒ ç°¡å˜ãªãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã‚‚ã€ã“ã®EXCELã®ä¸­ã«æ›¸ã„ã¦ãŠãã¾ã—ãŸã€‚


セルをダブルクリックã—ã¦å‡¦ç†ã‚’実行:


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 ‥‥
End Sub
			

ã“ã®é–¢æ•°ã‚’実装ã™ã‚‹ã¨ã‚»ãƒ«ã‚’ダブルクリックã—ãŸæ™‚ã€EXCELã®ãƒ€ãƒ–ルクリックã®å‡¦ç†(セルã®ç·¨é›†)ãŒå®Ÿè¡Œã•ã‚Œã‚‹å‰ã« ã“ã®é–¢æ•°ã®ä¸­ã«æ›¸ã„ãŸãƒ—ログラムを実行。
ã“ã†ã™ã‚‹ã¨ã€ã‚¯ãƒªãƒƒã‚¯ã—ãŸã‚»ãƒ«ã‚’基準ã«ã—ã¦å‡¦ç†ãŒå‡ºæ¥ã‚‹ã®ãŒãƒ¡ãƒªãƒƒãƒˆã€‚

特定ã®ã‚»ãƒ«ã®å ´åˆã ã‘処ç†ã‚’実行:


If Target.Value = "ã“ã“ã«è¿½åŠ ï¼" Then
 ‥‥
End If
			

"Target"ã¯ã€Worksheet_BeforeDoubleClick関数ã®å¼•æ•°ã§ãƒ€ãƒ–ルクリックã•ã‚ŒãŸã‚»ãƒ«ãŒè¨­å®šã•ã‚Œã¦ã„る。
ã“ã®ã‚»ãƒ«ã®å€¤ãŒã€Œã“ã“ã«è¿½åŠ ï¼ã€ã®å ´åˆã ã‘ã€ãã®ã‚»ãƒ«ä½ç½®ã«å¯¾ã—ã¦å‡¦ç†ã‚’実行。
ãれ以外ã®ã‚»ãƒ«ã®å€¤ã®å ´åˆã¯ã€é€šå¸¸ã®EXCELã®ãƒ€ãƒ–ルクリックã®å‡¦ç†ãŒå®Ÿè¡Œã•ã‚Œã‚‹ã€‚

EXCEL本æ¥ã®ãƒ€ãƒ–ルクリックã®å‡¦ç†ã‚’キャンセル:


Cancel = True
			

"Cancel"ã¯ã€Worksheet_BeforeDoubleClick関数ã®å¼•æ•°ã§ã€ã“れをTRUEã«è¨­å®šã™ã‚‹ã¨ã€ãƒ€ãƒ–ルクリックã®å‡¦ç†ãŒå®Ÿè¡Œã•ã‚Œãªããªã‚‹ã€‚ 特定ã®ã‚»ãƒ«ã®å ´åˆã ã‘ã€ãƒ€ãƒ–ルクリックã§ã‚»ãƒ«ã®ç·¨é›†ãƒ¢ãƒ¼ãƒ‰ã«å…¥ã‚‰ãªã„よã†ã« Ifæ–‡ã®ä¸­ã§è¨­å®šã€‚

ダブルクリックã—ãŸè¡Œã«ã€2行分をコピーã—ã¦æŒ¿å…¥ï¼š


Rows(Target.Row - 2 & ":" & Target.Row - 1).Copy
Rows(Target.Row).Insert

Application.CutCopyMode = False
			

クリックã—ãŸã‚»ãƒ«ã®ä¸Šã®2行分をコピーã—ã¦ã€ クリックã—ãŸã‚»ãƒ«ã®è¡Œã«ã‚³ãƒ”ーã—ãŸ2行を挿入。
最後ã«ã€ã‚³ãƒ”ーã—ãŸç¯„囲を解除。

çµåˆã‚»ãƒ«ã«å¯¾ã™ã‚‹2回目以é™ã®å‡¦ç†ã§ã™ãã«é–¢æ•°çµ‚了:


If Target.Count > 1 Then Exit Sub
			

クリックã—ãŸã‚»ãƒ«ãŒçµåˆã‚»ãƒ«ã®å ´åˆã¯ã€"Target.Count"ãŒã‚¤ãƒ³ã‚¯ãƒªãƒ¡ãƒ³ãƒˆã•ã‚Œã¦ çµåˆã—ãŸã‚»ãƒ«ã®æ•°ã ã‘処ç†ãŒè¡Œã‚れるらã—ã„。
ã§ã™ã®ã§ã€çµåˆã—ãŸã‚»ãƒ«ã®æ•°ã ã‘処ç†ã‚’ç¹°ã‚Šè¿”ã™å¿…è¦ãŒãªã„å ´åˆã¯ã€ã“ã®CountãŒ2以上ã«ãªã£ãŸã‚‰ã€é–¢æ•°ã‚’Exit。

セルã®å€¤ã‚„書å¼ã®ã‚¯ãƒªã‚¢ï¼š


Cells(Target.Row, Target.Column).ClearContents
Cells(Target.Row, Target.Column).Interior.Color = RGB(255, 255, 255)
			

ã“ã®ä¾‹ã§ã¯ã€ã‚¯ãƒªãƒƒã‚¯ã—ãŸã‚»ãƒ«ã®å€¤ã‚’クリア。
ãã—ã¦ã€ã‚¯ãƒªãƒƒã‚¯ã—ãŸã‚»ãƒ«ã®è‰²ã‚’白色ã«è¨­å®šã€‚

ループ処ç†ã§ç›®çš„ã®ã‚»ãƒ«ã¾ã§ç¹°ã‚Šè¿”ã—処ç†ï¼š


Do While Not Cells(Target.Row, Target.Column + cnt).Value = "/"
 ‥‥
 cnt = cnt + 1
Loop
			

"Do While ~ Loop"ã¨ã„ã†ç‹¬ç‰¹ãªå½¢ã§ãƒ«ãƒ¼ãƒ—処ç†ã‚’è¡Œã†ã€‚
Excelã®è¡Œã‚„列を追加/削除ã—ã¦ã‚‚処ç†ãŒå½±éŸ¿ã‚’å—ã‘ãªã„よã†ã« 処ç†ã‚’修了ã™ã‚‹ç›®å°ã¨ã—ã¦ã€ã‚»ãƒ«ã«"/"ã®å€¤ã‚’入れã¦ãŠã。 ループã®æ¡ä»¶å¼ã§ã€ã‚»ãƒ«ã®å€¤ãŒ"/"ã«ãªã£ãŸã‚‰çµ‚了ã™ã‚‹ã‚ˆã†ã«ã—ã¦ã„る。

[PR]

Step2. ã€VBA】ãƒãƒƒãƒˆã‹ã‚‰æ ªä¾¡ã‚’自動åŽé›†


ã“ã“ã§ã¯ã€æ ªä¾¡ã‚’ãƒãƒƒãƒˆã‹ã‚‰è‡ªå‹•å–å¾—ã—ã€éŠ˜æŸ„ã”ã¨ã®ä¿æœ‰æ ªæ•°ã‹ã‚‰å‰æ—¥ã‹ã‚‰ã®è³‡ç”£ã® 変動é¡ã‚’算出ã—ã¾ã™ã€‚
1ã¤ï¼‘ã¤è¨ˆç®—ã—ã¦å…¥åŠ›ã™ã‚‹ã®ãŒé¢å€’ã ã£ãŸã®ã§ã€ãã“ã‚’"åŠ"自動化。
「株価情報å–å¾—ã€ã‚»ãƒ«ã‚’ダブルクリックã—ã¦ã€éŠ˜æŸ„ã”ã¨ã®è³‡ç”£é¡ã‚’「å‰æ—¥æ¯”ã€ã®æ¬„㫠出力ã™ã‚‹ãƒ—ログラムを作りã¾ã—ãŸã€‚

ã€ã‚µãƒ³ãƒ—ルコード】

株価ノート_step2 サンプルã¯ã‚³ãƒãƒ©

⇒ ç°¡å˜ãªãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã‚‚ã€ã“ã®EXCELã®ä¸­ã«æ›¸ã„ã¦ãŠãã¾ã—ãŸã€‚


株価をãƒãƒƒãƒˆã‹ã‚‰å–å¾—ã™ã‚‹ï¼š


Dim code As String
Dim objHttp As Object

code = Cells(Target.Row - 3, Target.Column + 1).Value
str_url = "https://www.google.com/finance/quote/ " + code + ":TYO?hl=ja"

On Error Resume Next

Set objHttp = CreateObject("MSXML2.XMLHTTP")
objHttp.Open "GET", str_url, False
objHttp.Send

buf = objHttp.responseText
            
Err.Clear
On Error GoTo 0
			

ã¾ãšã¯ã€EXCELã«å…¥åŠ›ã—ã¦ã‚る銘柄コードã‹ã‚‰ã€googleファイナンスã®éŠ˜æŸ„ページã®URL文字列を作æˆã€‚
次ã«ã€ãれをCreateObject()関数ã§ç”Ÿæˆã—ãŸHTTPオブジェクトã«ã‚»ãƒƒãƒˆã—ã¦HTTPページをå–å¾—ã™ã‚‹ã€‚

HTTPページå–å¾—ã«å¤±æ•—ã—ã¦ã‚‚ã€æ¬¡ã®ãƒšãƒ¼ã‚¸ã®å–å¾—ã«é€²ã‚るよã†ã«â€On Error Resume Nextâ€ã§ã‚¨ãƒ©ãƒ¼ç„¡è¦–。
HTTPページå–得処ç†ãŒçµ‚ã‚ã£ãŸã‚‰ã€ã‚¨ãƒ©ãƒ¼ç„¡è¦–を解除ã—ã¦ã‹ã‚‰ã€æ¬¡ã®å‡¦ç†ã«é€²ã‚€ã€‚

HTTPページ(長ã„文字列)ã®ä¸­ã‹ã‚‰ç›®çš„も文字(æ•°å­—)を抽出:


buf = Mid(buf, InStr(buf, "<div jsname=""ip75Cb"" class=""Bu4oXd""><div class=""YMlKec"">") + Len("<div jsname=""ip75Cb"" class=""Bu4oXd""><div class=""YMlKec"">"))
buf = Left(buf, InStr(buf, "</div>") - 1)
buf = Replace(buf, "ï¿¥", "")
buf = Replace(buf, ",", "")
ret = Val(buf)
			

å–å¾—ã—ãŸHTTPページã¯ã€éžå¸¸ã«é•·ã„1ã¤ã®æ–‡å­—列ã¨ã—ã¦ã€bufã®ä¸­ã«æ ¼ç´ã•ã‚Œã¦ã„る。
ãã®ä¸­ã‹ã‚‰æ ªä¾¡ã®æƒ…å ±ãŒã‚ã‚‹ã¨ã“ã‚ã‚’ã€æ–‡å­—列検索ã«ã‚ˆã‚Šç‰¹å®šã—ã€æ ªä¾¡ã®éƒ¨åˆ†ã ã‘を抽出。 ã•ã‚‰ã«ã€"\"ã‚„","ãªã©ä¸è¦ãªæ–‡å­—ã‚’å–り除ãã€æœ€å¾Œã«æ•°å­—ã«å¤‰æ›ã—ã¦ã€retã«æ ¼ç´ã€‚

※ ã“ã®æ ªä¾¡ã®æŠ½å‡ºã®ã¨ã“ã‚ã¯ã€ãƒãƒƒãƒˆä¸Šã®æƒ…報をãã®ã¾ã¾æµç”¨ã•ã›ã¦é ‚ãã¾ã—ãŸã€‚

[PR]

Step3. ã€VBA】株価ã®ã‚°ãƒ©ãƒ•ã‚’作æˆ


今後ã¯ã€æ—¥ã€…ã®è³‡ç”£é¡ã®é·ç§»ã‚’見ãˆã‚‹åŒ–ã—ãŸã„ã¨æ€ã£ãŸã®ã§ã™ãŒ ã“ã®æ ªä¾¡ãƒŽãƒ¼ãƒˆã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã ã¨ã€è³‡ç”£é¡ãŒ1è¡ŒãŠãã«ã‚ã‚‹ã®ã§ã€EXCELã®ã‚°ãƒ©ãƒ•æ©Ÿèƒ½ã§ã¯ ã†ã¾ãグラフ化ã§ãã¾ã›ã‚“。。。

ãã“ã§ã€ã‚°ãƒ©ãƒ•åŒ–ã‚‚VBAを使ã£ã¦ã‚„ã£ã¦ã—ã¾ãŠã†ã¨æ€ã„ã¾ã™ã€‚

ã€ã‚µãƒ³ãƒ—ルコード】

株価ノート_step3 サンプルã¯ã‚³ãƒãƒ©

⇒ ç°¡å˜ãªãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã‚‚ã€ã“ã®EXCELã®ä¸­ã«æ›¸ã„ã¦ãŠãã¾ã—ãŸã€‚


データ個数ãŒä¸€å®šã§ã¯ãªã„å‹•çš„é…列:


Dim dataList() As Variant
ReDim dataList(1 To Int(Target.Row / 2))
			

株ノートã¯æ¯Žæ—¥è¨˜éŒ²ã™ã‚‹ã®ã§ã€æ—¥ã€…データã®å€‹æ•°ãŒå¢—ãˆã¦ã„ã。
ãã®ãŸã‚ã€ãƒ‡ãƒ¼ã‚¿ã®ä¸€ç•ªä¸‹ã®è¡Œã‚’ダブルクリックã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ ãã“を起点ã«ãƒ‡ãƒ¼ã‚¿å€‹æ•°ã‚’計算ã—ã€ãれをè¦ç´ æ•°ã¨ã—ã¦ãƒªã‚¹ãƒˆï¼ˆé…列)を生æˆã™ã‚‹å¿…è¦ãŒã‚る。

動的サイズã®é…列を作æˆã™ã‚‹ã«ã¯ã€â€ReDimâ€ã‚’使ã†ã€‚
プログラムã®é€”中ã§ã‚µã‚¤ã‚ºï¼ˆè¦ç´ æ•°ï¼‰ã‚’増やã™ã“ã¨ã‚‚ã§ãるらã—ã„。ãã®å ´åˆã¯ã€"Reserve"を使ã†ã¨ é…列ã®å†…容をä¿æŒã—ãŸã¾ã¾ã€ã‚µã‚¤ã‚ºå¤‰æ›´ãŒå¯èƒ½ã€‚

ワークシートã®ã‚ªãƒ–ジェクトをå–å¾—ã—ã¦åˆ¥ã‚·ãƒ¼ãƒˆã‚’æ“作:


Dim ws_g As Worksheet: Set ws_g = Worksheets("グラフ")
ws_g.Cells.Clear 'å‰å›žã‚°ãƒ©ãƒ•ä½œæˆæ™‚ã®æƒ…報をクリア
ws_g.Select 'グラフシートã«æ¨™ç¤ºã‚’切り替ãˆ
			

別シートã«ãƒ‡ãƒ¼ã‚¿ã‚’退é¿ã—ã€ãã“ã‹ã‚‰ã‚°ãƒ©ãƒ•ã‚’作æˆã™ã‚‹ãŸã‚ ワークシートã®ã‚ªãƒ–ジェクトをã€"As Worksheet"ã§å®šç¾©ã—ã¦ã€ãƒ‡ãƒ¼ã‚¿ã®ã‚¯ãƒªã‚¢ã‚„セルã®å‚ç…§ãªã©ã‚’è¡Œã†ã€‚

グラフを作æˆï¼š


'グラフを作æˆï¼ˆå…¨ä½“ã®æ益用)
With ws_g.Shapes.AddChart.Chart
    .ChartType = xlLine
    .SetSourceData ws_g.Range(ws_g.Cells(1, 1), ws_g.Cells(365, 12))
End With
			

ã“ã“ã§ã‚‚ã€ã€Œã‚°ãƒ©ãƒ•ã€ã‚·ãƒ¼ãƒˆã®ã‚ªãƒ–ジェクトを指定ã™ã‚‹å¿…è¦ãŒã‚る。 "Range"ã‚„"Cells"ãªã©ã€ã„ã¡ã„ã¡æŒ‡å®šã—ãªã„ã¨ã‚¨ãƒ©ãƒ¼ã«ãªã‚‹ã®ã§æ³¨æ„ï¼
(別シートã§ãªã‘ã‚Œã°ä¸è¦ã€‚)

"Shapes.AddChart.Chart"ã¨ã„ã†é–¢æ•°ã‚’使ã£ã¦ã€è¿½åŠ ã—ãŸã‚ªãƒ–ジェクト(グラフ)ã«å¯¾ã—㦠色々ãªæ“作を行ã†ã€‚
åŒã˜ã‚ªãƒ–ジェクトã«å¯¾ã—ã¦ã€é€£ç¶šã—ã¦æ“作を行ã†ãŸã‚"With"ステートメントを使ã†ã¨ä¾¿åˆ©ã€‚
ã“ã®ä¾‹ã§ã¯ã€  "ChartType"ã§ã‚°ãƒ©ãƒ•ã®ç¨®é¡žã‚’指定
 "SetSourceData"ã«Rangeを使ã£ã¦ãƒ‡ãƒ¼ã‚¿ç¯„囲を指定。
 ※ 1è¡Œ1列(=A1)セルã‹ã‚‰ã€365è¡Œ12列(=K365)セルをã€ãƒ‡ãƒ¼ã‚¿ç¯„囲ã¨ã™ã‚‹ã€ã¨ã„ã†æ„味。

複数エリアã®ãƒ‡ãƒ¼ã‚¿ã‹ã‚‰ã‚°ãƒ©ãƒ•ã‚’作æˆï¼š


.SetSourceData Union(ws_g.Range(ws_g.Cells(1, 1), ws_g.Cells(365, 1)), _
                     ws_g.Range(ws_g.Cells(1, 5), ws_g.Cells(365, 12)) _
                     )
			

データã®ç¯„囲ã®ä¸­ã§ã€é€£ç¶šã—ãªã„複数ã®ã‚¨ãƒªã‚¢ã‹ã‚‰ã‚°ãƒ©ãƒ•ã‚’作りãŸã„å ´åˆã‚‚ã‚る。
ãã®ã‚ˆã†ãªã¨ãã¯ã€ã“ã®ä¾‹ã®ã‚ˆã†ã«ã€""Union"を使ãˆã°ã€è¤‡æ•°ã®Rangeを指定ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã‚‹ã€‚
ã“ã“ã§ã¯ã€1ã¤ç›®ã®Rangeã§1列目ã®ã‚»ãƒ«ã‚’見出ã—ã¨ã—ã¦æŒ‡å®šã€2ã¤ç›®ã®Rangeã§5列目~12列目をデータ範囲ã¨ã—ã¦ã—ã¦ã„る。

グラフã®ä½ç½®ã€ã‚µã‚¤ã‚ºã‚’指定:


With ws_g.ChartObjects(1)
    .Top = Range("A1").Top
    .Left = Range("A1").Left

    .Width = 800
    .Height = 250
End With
			

追加ã—ãŸã‚°ãƒ©ãƒ•ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’指定(ã“ã“ã§ã¯ï¼‘番目ã«è¿½åŠ ã—ãŸã‚°ãƒ©ãƒ•=1を指定)ã—ã¦ã€ グラフã«å¯¾ã™ã‚‹æ“作を行ã†ã“ã¨ã§ãる。
ã“ã®ä¾‹ã§ã¯ã€ä½ç½®ã‚„サイズã®æŒ‡å®šã‚’ãŠã“ãªã£ã¦ã„る。
※ "Shapes.AddChart.Chart"を実行ã—ãŸWithステートメントã®ä¸­ã§è¡Œã£ã¦ã‚‚良ã„ãŒã€ã“ã†ã„ã†ã‚„り方もã‚ã‚‹ã¨ã„ã†ã“ã¨ã§å‚考ã¾ã§ã«ã€‚

シート内ã®ã‚°ãƒ©ãƒ•ã‚’探ã™ï¼š


Dim shp As Shape    'オブジェクト
Dim shp_ct As Long  'グラフオブジェクト数

'グラフシート内ã®ã‚ªãƒ–ジェクトを順ã«å‡¦ç†
For Each shp In ws_g.Shapes
    If shp.Type = msoChart Then 'オブジェクトãŒã‚°ãƒ©ãƒ•ã®å ´åˆ
        ws_g.ChartObjects.Delete
        Exit For   '1ã¤ã§ã‚‚ã‚ã‚Œã°å…¨éƒ¨æ¶ˆã™ã€ã¨ã„ã†å‡¦ç†ãªã®ã§ã“ã“ã§ãƒ«ãƒ¼ãƒ—を抜ã‘ã‚‹
    End If
Next shp
			

ã“ã“ã§ã‚‚ã€ã€Œã‚°ãƒ©ãƒ•ã€ã‚·ãƒ¼ãƒˆã®ã‚ªãƒ–ジェクトを使ã£ã¦æ“作ã—ã¦ã„る。
シート内ã®ã‚ªãƒ–ジェクト("Shapes")ã«å¯¾ã—ã¦ï¼‘ã¤ãšã¤Forループã§å‡¦ç†ã‚’è¡Œã†ã€‚

ã“ã®ä¾‹ã§ã¯ã€ã‚ªãƒ–ジェクトã®ç¨®åˆ¥ã‚’判定ã™ã‚‹ã€ã¨ã„ã†ã“ã¨ã¨è¡Œã£ã¦ã„る。
ã¾ãŸã€é€”中ã§ãƒ«ãƒ¼ãƒ—を抜ã‘ã‚‹å ´åˆã¯ã€"Exti For"ã§.