[[20160821230834]] 『指定したテキストファイルを指定したシートに読み』(らんぷ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『指定したテキストファイルを指定したシートに読み込むVBAについて』(らんぷ)

初めまして。
VBAの勉強を始めたばかりです。
よろしくお願いします。

テキストファイルを読み込むVBAを作成したいです。
過去の質問を切り貼りして、テキストファイルを好きなように区切ってから取り込むプログラムを作りました。

このVBAに下記のような改良を加えたいと考えております。

・既存の指定したシートにテキストファイルを読み込む。 
 同じブックでも違うブックでもいいのですが、あらかじめ数式が書いてあるシートに対して、テキストの内容を貼り付けたいです。

現在のVBAはこのようになっております。
もしかしたら的外れの質問になっているかもしれませんが、なにかアドバイスを頂けると幸いです。

Sub Sample()

    Dim OpenFileName As String

    OpenFileName = Application.GetOpenFilename("テキストファイル,*.txt")

    Workbooks.OpenText Filename:=OpenFileName, _
                       DataType:=xlDelimited, _
                       comma:=True, _
                       Space:=True, _
                       other:=True, _
                       otherchar:="xx" '<※好きな区切り文字を入れる> 

    '<列幅を内容に合わせて調節> 
    Columns("A:G").Select
    Columns("A:G").EntireColumn.AutoFit
    Range("A1").Select

End Sub

< 使用 Excel:Excel2013、使用 OS:Windows7 >


別ブック、別シート間でのデータの代入は、ブックとシートを明示してやれば、イコールを使うだけです。

現在のコードでは、カレント(ブックやシートを指定しない場合のデフォルト)が開いたテキストファイルに変わってしまうので、貼り付けたい先のシートをWorksheetオブジェクトの変数に覚えさせておき、ここに任意の代入を行えば良いでしょう。
(開くファイルも、別の変数にして明示するのがベストです)

    Dim wk1 As Worksheet

    Set wk1 = ActiveSheet

    ここは現状のファイルを開く処理
    …
    wk1.Range("A1") = Range("A1")
    wk1.Range("B1") = Range("D1")
    …
    ファイルをCloseする処理
(???) 2016/08/22(月) 10:44

ありがとうございます!
感謝します。

貼り付けたい先のシートをWorksheetオブジェクトの変数に覚えさせておき、 のWorksheetオブジェクトの変数とは何を指すのでしょうか?

素人質問で申し訳ございません。

(開くファイルも、別の変数にして明示するのがベストです) 違う変数とは、OpenFileName以外ということでしょうか?

まだいらっしゃったらアドバイスをお願いいたします!
(らんぷ) 2016/08/22(月) 23:05


言われたキーワードを調べないで、Worksheetオブジェクトって何?、と聞かれそうな気がしたので、サンプルコード中で実例を見せたのですが、それを見て何とも思わなかったというのが残念過ぎます…。前のサンプルのwk1や、以下のコードのwk2が、WorkSheetオブジェクトの変数ですよ。

また、開くファイルについては、OpenTextメソッドはExcel2013から追加されたものなので、2010の私の環境では確認できませんが、予想でこんな感じです。

    Dim wk2 As WorkSheet

    Set wk2 = Workbooks.OpenText(Filename:=OpenFileName, _
                       DataType:=xlDelimited, _
                       comma:=True, _
                       Space:=True, _
                       other:=True, _
                       otherchar:="xx") '<※好きな区切り文字を入れる>

こうしておくと、以下のように書くことで、動いている最中にExcel操作して、他のシートをアクティブに変えたりしても、対象のシートが変わる事が無いので、確実に動作してくれるようになります。

    wk1.Range("A1") = wk2.Range("A1")
(???) 2016/08/23(火) 09:17

ちょっと変更。WorkBooksのメソッドなので、シートではなくブックのオブジェクトを返しそうなので、以下で。

    Dim wk2 As Workbook

    Set wk2 = Workbooks.OpenText(Filename:=OpenFileName, _
                       DataType:=xlDelimited, _
                       comma:=True, _
                       Space:=True, _
                       other:=True, _
                       otherchar:="xx") '<※好きな区切り文字を入れる>

    wk1.Range("A1") = wk2.Sheets(1).Range("A1")

(???) 2016/08/23(火) 09:24


何度もご丁寧に回答をありがとうございます。

申し訳ありません。おっしゃる通りだと思います。

切り貼りして以下のコードを作製したのですが、実行を押すと
OpenTextのところで、Function または変数が必要です。というエラーがでます。
これは2013から追加された機能のようですが、原因がお分かりでしたら再度お教え頂けると
幸いです。何度も何度も本当にありがとうございます。

Sub OpebText()

    Dim OpenFileName As String
    Dim wk2 As Workbook

    '<テキストファイルのパスを取得> ←(1)
    OpenFileName = Application.GetOpenFilename("テキストファイル,*.txt")

    '<「OpenText」メソッドを使ってテキストファイルを開く> ←(2)
    Set wk2 = Workbooks.OpenText(Filename:=OpenFileName, _
                       DataType:=xlDelimited, _
                       comma:=True, _
                       Space:=True, _
                       other:=True, _
                       otherchar:="a")

    '<列幅を内容に合わせて調節して見やすく> ←(3)
    Columns("A:G").Select
    Columns("A:G").EntireColumn.AutoFit
    Range("A1").Select

End Sub

(らんぷ) 2016/08/23(火) 11:00


OpenText時、結果を直接オブジェクトに渡せないようですね。WorkBooks.Open とは違って、癖がありそうです。
以下のように、読み込み部分は元に戻して、読み込んだ後にオブジェクトに代入するよう、変えてみてください。

    Workbooks.OpenText Filename:=OpenFileName, _
                       DataType:=xlDelimited, _
                       comma:=True, _
                       Space:=True, _
                       other:=True, _
                       otherchar:="xx" '<※好きな区切り文字を入れる>

    Set wk2 = Workbooks(Workbooks.Count)
(???) 2016/08/23(火) 11:07

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.