- ベストアンサー
Excelマクロを使用して銘柄情報を取得する方法
- Excelマクロで、銘柄情報を取得する方法について教えてください。
- 具体的な手順やコードの解説も含めてお願いします。
- また、取得した情報を表示する方法も知りたいです。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
ANo.8です。 データの取得には時間がかかるようですね。 あとは実際にRSSを行なっている方でないと検証出来ないもので、 対策案は浮かんでこないです。
その他の回答 (7)
- n-jun
- ベストアンサー率33% (959/2873)
ANo.7です。 或いはRSSが情報を取得する際のタイミングの問題かも知れないですね。 Excelの方が処理が進んでしまいエラーを引き起こすのかも。 Loopの前に Application.Wait Time:=Now() + TimeValue("0:0:1") を入れてみて少し待たせるようにしてみては。 処理時間は若干遅くなるでしょうが、エラー回避になるかもです。
補足
ありがとう御座います。やって見ましたが、あまり効果がありませんでした。分かってきました。最初 RSSデータが出なかったのですが、しばらく、接続状態にしていたら、データが表示されました。楽天側RSS接続に時間が掛かるようです。他のRSSマクロも同様に、すぐに接続されないです。待てばいいようです。
- n-jun
- ベストアンサー率33% (959/2873)
ANo.6です。 仮にRSSに問題があったとしても、 >Cells(iRow, 3) = v(2) 'C列に市場を入力 --------------------------------------------1 ここでエラーが出ているのは、読み込んでいるテキストファイルの異常ですよ。 2~4であればRSSが関係するでしょうが。 試しに新規Bookを作成して以下のコードで銘柄.txtを読み込んでみて下さい。 Sub 確認のためのサンプル() Const cFILENAME = "R:\銘柄.txt" ' ファイルのフルパス Dim iRow As Integer ' 行指定 Dim iNumber As Integer ' A列4桁数字 Dim intFF As Integer ' FreeFile値 Dim strREC As String ' 読み込んだレコード内容 Dim v As Variant ' 読み込んだデータを区切る Range("A1:C1").Value = Array("コード", "名称", "市場") ' FreeFile値の取得(以降この値で入出力する) intFF = FreeFile ' 指定ファイルをOPEN(入力モード) Open cFILENAME For Input As #intFF ' データの表示開始は2行目 iRow = 2 ' ファイルのEOF(End of File)まで繰り返す Do Until EOF(intFF) ' 改行までをレコードとして読み込む Line Input #intFF, strREC v = Split(strREC, ",") ' 読み込んだ1行を","で区切る If UBound(v) <> 2 Then MsgBox "銘柄.txtの" & iRow - 1 & "行目の" & vbLf & strREC & _ vbLf & "に問題あります。" End If Cells(iRow, 1) = v(0) 'A列に数字を入力 Cells(iRow, 2) = v(1) 'B列に名称を入力 Cells(iRow, 3) = v(2) 'C列に市場を入力 iRow = iRow + 1 '行数更新 Loop ' 指定ファイルをCLOSE Close #intFF End Sub v(2)がエラーになる原因がわかるかも知れません。
補足
ありがとう御座います。上手くいきました。特に、test2は何もしていません。何故、今回okになったのか分かりません。これで、しばらく様子を見てみます。ok確認後、締め切らせて頂きます。 親切に相談に載って頂き感謝しています。本当にありがとう御座いました。 1.確認のためのサンプル マクロ結果: コード,名称,市場 6162,ミヤノ,T 6290,SES,Q 3765,ガンホー,OJ 7974,任天堂,OS 2.test2 マクロ結果: コード,名称,市場,現在値,高値,安値 6162,ミヤノ,T,240,244,239 6290,SES,Q,340,340,323 3765,ガンホー,OJ,193900,198000,185200 7974,任天堂,OS,51800,51900,50200
- n-jun
- ベストアンサー率33% (959/2873)
ANo.5です。 >v(2) で引っ掛かりました。 >実行時エラー 9 インデックスが有効範囲にありません 銘柄.txtに >6162,ミヤノ,T >6290,エス・イー・エス,Q >3765,ガンホーオンラインエンターテイメント,OJ >7974,任天堂,OS のように","で区切られた3列ずつのデータがあればエラーは出ないはずです。 特に >Cells(iRow, 3) = v(2) 'C列に市場を入力 --------------------------------------------1 ここでのエラー発生であれば尚更でしょう。 或いは","の代わりに"."になっているとか、タブ区切りなど別の区切りがあってもエラーになり得ますね。 (","が全角の"、"でもエラーですけど) あとデータが2列しかない所があれば、それもエラー原因になります。 検証したのは提示された情報のみですから、提示された内容と実際の 銘柄.txtを見比べて下さい。 こればかりは実際のデータがなければ検証できない範囲ですので。 あと銘柄.txtに項目行はつけないで下さい。 項目行の有無の判断は含まれていませんので。
補足
回答ありがとう御座います。 再確認結果を示します。 1. >のように","で区切られた3列ずつのデータがあればエラーは出ないはずです。 ","で区切られた3列ずつのデータ となっています。 2. 特に >Cells(iRow, 3) = v(2) 'C列に市場を入力 --------------------------------------------1 ここでのエラー発生であれば尚更でしょう。 或いは","の代わりに"."になっているとか、タブ区切りなど別の区切りがあってもエラーになり得ますね。 (","が全角の"、"でもエラーですけど) ご指摘の内容 ,で区切られています。 3. >あとデータが2列しかない所があれば、それもエラー原因になります。 これは有りませんでした。 4. >あと銘柄.txtに項目行はつけないで下さい。項目行の有無の判断は含まれていませんので。 これも有りませんでした。 実は、このRSS関数 他の掲示板でも、同じ内容の引数の問題があり、うまくいきませんでした。現在、マクロ作成者により、掲示板から削除されています。この関数の悪い点です。簡単にはできないようです。 親切な対応 感謝しています。
- n-jun
- ベストアンサー率33% (959/2873)
ANo.3です。 完全検証できないのでご参考程度に。 Sub test2() Const cFILENAME = "R:\銘柄.txt" ' ファイルのフルパス Dim iRow As Integer ' 行指定 Dim iNumber As Integer ' A列4桁数字 Dim intFF As Integer ' FreeFile値 Dim strREC As String ' 読み込んだレコード内容 Dim v As Variant ' 読み込んだデータを区切る Range("A1:F1").Value = Array("コード", "名称", "市場", "現在値", "高値", "安値") ' FreeFile値の取得(以降この値で入出力する) intFF = FreeFile ' 指定ファイルをOPEN(入力モード) Open cFILENAME For Input As #intFF ' データの表示開始は2行目 iRow = 2 ' ファイルのEOF(End of File)まで繰り返す Do Until EOF(intFF) ' 改行までをレコードとして読み込む Line Input #intFF, strREC v = Split(strREC, ",") ' 読み込んだ1行を","で区切る iNumber = Val(v(0)) 'A列の4桁数字指定 Cells(iRow, 1) = iNumber 'A列に数字を入力 Cells(iRow, 2) = v(1) 'B列に名称を入力 Cells(iRow, 3) = v(2) 'C列に市場を入力 Cells(iRow, 4) = "=RSS|'" & iNumber & "." & v(2) & "'!現在値" 'D列に式を入力 Cells(iRow, 5) = "=RSS|'" & iNumber & "." & v(2) & "'!高値" 'E列に式を入力 Cells(iRow, 6) = "=RSS|'" & iNumber & "." & v(2) & "'!安値" 'F列に式を入力 iRow = iRow + 1 '行数更新 Loop ' 指定ファイルをCLOSE Close #intFF End Sub
お礼
追伸: コード,名称,市場,現在値,高値,安値 6162,ミヤノ,,,, 式はありませんでした。
補足
回答ありがとう御座います。 v(2) で引っ掛かりました。 実行時エラー 9 インデックスが有効範囲にありません Cells(iRow, 3) = v(2) 'C列に市場を入力 --------------------------------------------1 Cells(iRow, 4) = "=RSS|'" & iNumber & "." & v(2) & "'!現在値" 'D列に式を入力-------2 Cells(iRow, 5) = "=RSS|'" & iNumber & "." & v(2) & "'!高値" 'E列に式を入力 --------3 Cells(iRow, 6) = "=RSS|'" & iNumber & "." & v(2) & "'!安値" 'F列に式を入力 --------4 deback内容 1をcommentにしたら、2で引っ掛かります。 2をcommentにしたら、3で引っ掛かります。 以下同様でした。
- n-jun
- ベストアンサー率33% (959/2873)
>データ50個で確認しました。その結果、最初のデータだけがNGで、他はOKでした。よろしくお願いします。 最初のコード"3381"において取得できるデータがないのでは? と言いますか、先に述べたように外部プログラムRSSがないので取得できるかどうかの 検証は出来ないのです。 あくまでテキストファイルからデータを順次読み込んで数式に当てはめるまでです。
お礼
親切に相談に載って頂き、感謝しています。市場コードの問題があり、方針変更に時間が掛かりました。銘柄.txtに市場コードを追加しました。名称は、RSSからの取得を止めて、銘柄.txtの名称を使う事にしました。名称が違うケースがあるためです。 銘柄.txt: コード,名称,市場 6162,ミヤノ,T 6290,エス・イー・エス,Q 3765,ガンホーオンラインエンターテイメント,OJ 7974,任天堂,OS マクロ結果: コード,名称,市場,現在値,高値,安値 6162,ミヤノ,T,=RSS|'6162.T'!現在値,=RSS|'6162.T'!高値,=RSS|'6162.T'!安値 6290,エス・イー・エス,Q,=RSS|'6290.Q'!現在値,=RSS|'6290.Q'!高値,=RSS|'6290.Q'!安値 3765,ガンホーオンラインエンターテイメント,OJ,=RSS|'3765.OJ'!現在値,=RSS|'3765.OJ'!高値,=RSS|'3765.OJ'!安値 7974,任天堂,OS,=RSS|'7974.OS'!現在値,=RSS|'7974.OS'!高値,=RSS|'7974.OS'!安値 すみませんが、もう少し相談に載ってください。
補足
回答ありがとう御座います。 3381,ビズネット ジャスダックですので、3381.T→3381.Q okになりました。
- n-jun
- ベストアンサー率33% (959/2873)
ANo.1です。 RSSはないので検証は完全ではないですが。 Sub test() Const cFILENAME = "R:\銘柄.txt" ' ファイルのフルパス Dim iRow As Integer ' 行指定 Dim iNumber As Integer ' A列4桁数字 Dim intFF As Integer ' FreeFile値 Dim strREC As String ' 読み込んだレコード内容 Cells(1, 1) = "コード": Cells(1, 2) = "銘柄": Cells(1, 3) = "現在値" Cells(1, 4) = "高値": Cells(1, 5) = "安値" ' FreeFile値の取得(以降この値で入出力する) intFF = FreeFile ' 指定ファイルをOPEN(入力モード) Open cFILENAME For Input As #intFF ' データの表示開始は2行目 iRow = 2 ' ファイルのEOF(End of File)まで繰り返す Do Until EOF(intFF) ' 改行までをレコードとして読み込む Line Input #intFF, strREC iNumber = Val(Split(strREC, ",")(0)) 'A列の4桁数字指定 Cells(iRow, 1) = iNumber 'A列に数字を入力 Cells(iRow, 2) = "=RSS|'" & iNumber & ".T'!銘柄名称" 'B列に式を入力 Cells(iRow, 3) = "=RSS|'" & iNumber & ".T'!現在値" 'C列に式を入力 Cells(iRow, 4) = "=RSS|'" & iNumber & ".T'!高値" 'D列に式を入力 Cells(iRow, 5) = "=RSS|'" & iNumber & ".T'!安値" 'E列に式を入力 iRow = iRow + 1 '行数更新 Loop ' 指定ファイルをCLOSE Close #intFF End Sub ------------------------------------- Const cFILENAME = "R:\銘柄.txt" はこちらでのテスト環境です。 適宜修正願います。 テキストデータは順次読み込みになっています。
お礼
補足です。数式を示します。式は同じです。? コード,銘柄,現在値,高値,安値 3381,=RSS|'3381.T'!銘柄名称,=RSS|'3381.T'!現在値,=RSS|'3381.T'!高値,=RSS|'3381.T'!安値 8878,=RSS|'8878.T'!銘柄名称,=RSS|'8878.T'!現在値,=RSS|'8878.T'!高値,=RSS|'8878.T'!安値 8874,=RSS|'8874.T'!銘柄名称,=RSS|'8874.T'!現在値,=RSS|'8874.T'!高値,=RSS|'8874.T'!安値
補足
ありがとう御座います。 データ50個で確認しました。その結果、最初のデータだけがNGで、他はOKでした。よろしくお願いします。 マクロ結果: コード,銘柄,現在値,高値,安値 3381,#N/A,#N/A,#N/A,#N/A 8878,日本綜合地所,230,240,172 8874,ジョイント・コーポレーション,142,155,116
- n-jun
- ベストアンサー率33% (959/2873)
質問はテキストファイルを順に読み込みたいと言うことでしょうか? テキストデータの読み込み http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110.html
補足
回答ありがとう御座います。上記URL 読み込みを確認しました。 補足説明します。 テキストファイルデータを全て取り込み、その後各コードに対応する表示を下記の様にしたいのです。 2. 銘柄.txt: 1801,大成建 7968,田崎真珠 3110,日東紡 約100個 3. マクロ結果: コード,銘柄,現在値,高値,安値 1801,大成建,770,785,765 7968,田崎真珠,765,779,758 3110,日東紡,780,985,970 このマクロ結果は、列がずれて、見にくくなるので、カンマを入れています。CSV対応。 よろしくお願いします。
お礼
RSS接続に時間が掛かる件については、他のRSSマクロも同じです。楽天serverによるものです。これで締め切らせていただきます。 親切に対応していただき、感謝しています。20pointではなく、花丸です。
補足
ありがとう御座います。他のRSSでは、長い時で30sec 繋がらない時もあります。マクロの再立ち上げしています。それ以外では、順調です。