2-4.銘柄リスト取込(txtファイルから取得例)

(1) 概略
掲示板に
KIkabe(load_np)の銘柄コードを入れるところをInputBoxではなく、他のリストから持ってくるというマクロを教えていただきたいのですが・・・。
と言う依頼があり本ページを作成。

内容としては、KIkabe(load_np)のテキストボックスの代わり下図のユーザーフォームにした例です。


なお、銘柄リストは下図のようなtxtファイルを使用であり自作すること。



(2)KIkabu(load_np)の変更箇所
今回紹介のユーザーフォームを使用する場合、KIkabu(load_np)は以下のように 1部変更してください。

Sub load_np()

'画像削除
    ActiveSheet.Unprotect
    For Each zu In ActiveSheet.Shapes
        zu.Delete
    Next
'過去データ削除
 Cells.Select
    Selection.ClearContents
    Range("A1").Select
    
 Call 銘柄表取込
    
'銘柄コード指定
    UserForm1.Show vbModeless
End Sub
'-------------------------------------------------------------------------------
Sub load実行()
    meino = UserForm1.txt1.Text
    If Len(meino) <> 4 Then
        MsgBox "取得する銘柄コードを数字4桁で入力して下さい"
        Exit Sub
    End If
    UserForm1.Hide

  ・・・・・・・・・・・以下は同じ
[1] UserForm1.Show vbModeless でモードレス指定の関係でExcel2000以降が対象
[2] メインのオブジェクトは「load実行」にしてユーザーフォームから呼び出しに変更

(3)ユーザーフォームモジュール
ユーザーフォームのプロパティに付けた名称は下図参照のこと。

Private Sub cmb1_Click()
    Call load実行
End Sub
'-------------------------------------
Private Sub cmb21_Click()
    Call 次へ
End Sub
'-------------------------------------
Private Sub cmb22_Click()
    Call 戻る
End Sub
'-------------------------------------
Private Sub cmb3_Click()
    Call ファイル指定
End Sub
'-------------------------------------
Private Sub cmb4_Click()
    UserForm1.Hide
End Sub

(4)txtデ−タ取り込み
このプロシージャでtxtファイルをファイルを開かずに配列へ読み込みます。

Dim dat(5000, 1) As String    '銘柄リスト
Dim txtname As String         'txtファイル名
Dim listno As Integer         'リスト番号

Sub 銘柄表取込()
'記録されているtxtファイル
    fff = ThisWorkbook.Worksheets("Sheet3").Cells(1, 1)    		'[1]
    
'ファイル指定前ガード
If fff = "" Then
   Exit Sub
End If
   
dai = Dir(fff)								'[2]
If dai = "" Then
   MsgBox fff & "ファイルが見つかりません。" & Chr$(10) & Chr$(10) _
    & "パス・ファイル名が異なる場合は「ファイル指定」で変更して下さい"
    Exit Sub
End If

'2重取込ガード
If dat(0, 0) <> "" Then
    Exit Sub
End If

'txtデ−タ取り込み							'[3]
    i = 1
    Open fff For Input As #1
Do Until EOF(1)
    On Error GoTo rest							'[4]
    Input #1, dat(i, 0), dat(i, 1)
    On Error GoTo 0
     i = i + 1
Loop
Close #1

dat(0, 0) = i - 1							'[5]
UserForm1.lbl1.Caption = fff & "取込完了"
UserForm1.txt1.Text = dat(0, 1)
Exit Sub
rest:
   Close #1
   MsgBox fff & "ファイルのデータ取得に失敗しました。" & Chr$(10) _
    & "txtファイルのデータの最終以降に空白等入っていないか確認して下さい" & Chr$(10) _
   & "もし空白がある場合はデータの最後を選択しDeleteキーを数回押し訂正してください。"
   On Error GoTo 0
    End
End Sub
[1]同じtxtファイルの使用を考慮し"Sheet3"のA1セルにある、前回のパスとファイル名を読み取る
[2]指定のtxtファイルがあるか確認
[3]txtデ−タ取り込み。バッファーを開きダイレクトに読む場合は必ず Close すること。
[4]txtファイルのフォーマットが異なる場合のエラー対策
[5]本例の場合、データ数をdat(0, 0)に入れ後で使用している

(5)txtファイル指定
自作のtxtファイルの保存場所を指定。(下図参照)
指定したファイルは再使用を考慮しシート"Sheet3"のA1セルへ保存(シート名Sheet3がある前提)


Sub ファイル指定()
    
 flt$ = "txtファイル(*.txt),*.txt"
txtname = Application.GetOpenFilename(flt$, , Title:="txtファイル指定")

If txtname <> "False" Then
    ThisWorkbook.Worksheets("Sheet3").Cells(1, 1) = txtname
Else
    MsgBox "ファイルの指定がありません"
    Exit Sub
End If
   dat(0, 0) = ""     '前データ消す
   Call 銘柄表取込
End Sub

(6)配列データを1個進める

Sub 次へ()
If listno = 0 Then
    listno = 1
Else
    listno = listno + 1
    If listno > dat(0, 0) Then 				'[1]
        listno = dat(0, 0)
        MsgBox "これ以上データがありません"
    End If
End If

With UserForm1
    .txt1.Text = dat(listno, 0)
    .lbl1.Caption = " " & listno & "." & dat(listno, 1) & "[" & dat(listno, 0) & "]"
End With

End Sub
[1] データの最後をチェック

(7)配列データを1個戻す

Sub 戻る()
listno = listno - 1
    If listno < 1 Then                    		'[1]
        listno = 1
        MsgBox "これ以下のデータがありません"
    End If

With UserForm1
    .txt1.Text = dat(listno, 0)
    .lbl1.Caption = listno & ".[" & dat(listno, 0) & "]" & dat(listno, 1)
End With

End Sub

[1] データの配列番号が1以下にならないようにチェック



【戻る】