Step1. ã€VBA】ボタン無ã—ã§ãƒ—ãƒã‚°ãƒ©ãƒ を実行
ã”覧ã®é€šã‚Šã€1æ—¥ã®è¨˜å…¥æ¬„ãŒã€ä¿æœ‰æ ªä¾¡ã¨è³‡ç”£é¡ã®å¤‰å‹•を2行ã§è¨˜éŒ²ã™ã‚‹ãƒ•ォーマットã«ãªã£ã¦ã„ã¾ã™ã€‚
ã“ã®ï¼’行ã®è¨˜å…¥æ¬„ã‚’ã€æ¯Žæ—¥è¿½åŠ ã™ã‚‹ã®ãŒæ‰‹é–“ãªã®ã§ãƒ—ãƒã‚°ãƒ©ãƒ ã§è‡ªå‹•化。
見出ã—ã«ã‚る通り
ボタンをè¨ç½®ã›ãšã«ãƒ—ãƒã‚°ãƒ©ãƒ を実行ã—ã€è¨˜å…¥æ¬„ã‚’è‡ªå‹•è¿½åŠ ã§ãるよã†ã«ã—ã¾ã—ãŸã€‚
ã¤ã„ã§ã«ã€åŒã˜ä»•組ã¿ã‚’使ã£ã¦ã€æ–°ã—ã„銘柄を記録ã™ã‚‹åˆ—ã‚‚è¿½åŠ ã§ãるよã†ã«ã—ã¦ã„ã¾ã™ã€‚
æ ªä¾¡ãƒŽãƒ¼ãƒˆ_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ã®è¡Œã‚„åˆ—ã‚’è¿½åŠ /削除ã—ã¦ã‚‚処ç†ãŒå½±éŸ¿ã‚’å—ã‘ãªã„よã†ã«
処ç†ã‚’修了ã™ã‚‹ç›®å°ã¨ã—ã¦ã€ã‚»ãƒ«ã«"/"ã®å€¤ã‚’入れã¦ãŠã。
ãƒ«ãƒ¼ãƒ—ã®æ¡ä»¶å¼ã§ã€ã‚»ãƒ«ã®å€¤ãŒ"/"ã«ãªã£ãŸã‚‰çµ‚了ã™ã‚‹ã‚ˆã†ã«ã—ã¦ã„る。
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ã«æ ¼ç´ã€‚
※ ã“ã®æ ªä¾¡ã®æŠ½å‡ºã®ã¨ã“ã‚ã¯ã€ãƒãƒƒãƒˆä¸Šã®æƒ…å ±ã‚’ãã®ã¾ã¾æµç”¨ã•ã›ã¦é ‚ãã¾ã—ãŸã€‚
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"ã§.