SQLの窓

2017年07月23日


VBA : FileSystemObject でテキストファイル(CSV) を読み込んでセルにセットする

この記事は、『VBA : 一ヶ月の予定リストの作成』の続きです。
テンプレートシートをコピーして作業シートを作成する関数 "対象" という名前のシートがあればそれを使い、無ければ "テンプレート" シートをコピーして、"対象" と言う名前に変更します。
Function LoadSheet()
    
    ' ********************
    ' データ処理をする Sheet
    ' ********************
    Dim sheet As Worksheet
    
    ' ********************
    ' "対象" Sheet の取得
    ' ********************
    On Error Resume Next
    Set sheet = Worksheets("対象")
    On Error GoTo 0
    
    ' "対象" Sheet が無い場合は テンプレート をコピーして作成
    If sheet Is Nothing Then
        Call Worksheets("テンプレート").Copy(, Worksheets("年月入力"))
        ' コピーした Sheet の名前を変更
        Application.ActiveSheet.Name = "対象"
        ' 変数にコピーした Sheet をセット
        Set sheet = Application.ActiveSheet
    End If
    
    Set LoadSheet = sheet

End Function


※ 戻り値は、Worksheet オブジェクトです。

FileSystemObject は、ThisWorkbook に定義

Workbook_Open イベントで一度だけ実行して作成し、ブックを閉じるまでずっとそれを使います。

Public Fs As Object

Private Sub Workbook_Open()

    Set Fs = CreateObject("Scripting.FileSystemObject")

End Sub


※ Open から Line Input を使わないのは、FileSystemObject ならば 他の VB 系でも使用可能で汎用性が高いからです。

処理

※ Fs は、ThisWorkbook に定義されているので、ThisWorkbook.Fs と参照します
Sub ボタン2_Click()

    ' ********************
    ' データ処理をする Sheet
    ' ********************
    Dim sheet As Worksheet
    
    ' ********************
    ' 戻り値を取得
    ' ********************
    Set sheet = LoadSheet

    ' ********************
    ' ファイルを開く
    ' ********************
    Dim Path As String
    Path = Application.GetOpenFilename("CSV,*.csv,全て,*.*", , "CSVファイルを選択して下さい")
    If Path = "False" Then
        Exit Sub
    End If
    
    ' ********************
    ' オープン
    ' ********************
    On Error Resume Next
    Set InObj = ThisWorkbook.Fs.OpenTextFile(Path, 1)
    If Err.Number <> 0 Then
        MsgBox (Err.Description)
        Exit Sub
    End If
    On Error GoTo 0
    
    Dim Buffer As String
    Dim row As Integer: row = 0
    Dim Data() As String
    ' ********************
    ' CSV ファイルより
    ' データを読み込み
    ' ********************
    Do While Not InObj.AtEndOfStream
        Buffer = InObj.ReadLine
        
        row = row + 1
        
        Data = Split(Buffer, ",")
        
        sheet.Cells(row, 3).Value = Data(0)
        sheet.Cells(row, 4).Value = Data(1)
    Loop

    ' ********************
    ' ファイルクローズ
    ' ********************
    InObj.Close

End Sub


Application.GetOpenFilename の第二引数(FilterIndex)は省略しています。その代わり、第三引数を指定しています( タイトル文字列の指定 )

Split 関数
OpenTextFile メソッド
ReadLine メソッド






タグ:EXCEL VB VBA
posted by lightbox at 2017-07-23 20:57 | Comment(0) | VBA | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり