• ベストアンサー

ExcelVBAを使ってテキストファイルを取り込む際に条件を与える方法

こんばんわ。 今、テキストファイルをExcelの特定シートに開くVBAを組もうとしています。 ある書籍のソースをそのまま流用すると、 一部分は満たされるのですが、他方が実現されず、困っております。 やろうとしていること: 新規ブックを開かずに、テキストファイル(CSV形式)の各列の形式(文字列or数値)を指定しながら、特定シートにデータを展開する。 Book名「ABC.xls」 その中のシート名「展開」 テキストファイル名「data.txt」:11列のデータがカンマ区切りで入っています data.txt、ABC.xls共に同じフォルダ内に保存してあります。 やってみたこと: *********************************************** Sub ReadTxt() Dim myTxtFile As String Dim myBuf(11) As String Dim i As Integer, j As Integer Application.ScreenUpdating = False myTxtFile = ActiveWorkbook.Path & "\data.txt" Worksheets("展開").Activate Open myTxtFile For Input As #1 Do Until EOF(1) Input #1, myBuf(1), myBuf(2), myBuf(3), myBuf(4), myBuf(5), myBuf(6), _ myBuf(7), myBuf(8), myBuf(9), myBuf(10), myBuf(11) i = i + 1 For j = 1 To 11 Cells(i, j) = myBuf(j) Next j Loop Close #1 End Sub *********************************************** というソースで特定シートに取り込めたのですが、 各列の取り込み形式(文字列、数値)を指定する方法がわかりません。 OpenTextメソッドでFieldInfoに配列を記述し取り込み形式を指定する方法は見つけたのですが、こちらは、新規ブックが開いてしまい・・・ どなたか方法をご存知の方、回答を頂けたら幸いです。 お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

読み込む前に対象の11列の属性を決めてしまえば問題はないと思いますが・・・ 下はその例です。 文字列設定していないと読み込み結果が変わってしまう例として、  1-2-3 の様は文字列が日付になる  0001 の様な前ゼロが数値になってしまう(前ゼロが消える)  02E01 のような文字列が指数表示の数値になってしまう このような事例が思い浮かびますが、スペースで挟まれた数値などはスペースが無視されるはずです。このようなデータに対しては、元のテキスト(CSV)ファイル側で、""で囲む必要があると思います。 OpenTextで読み込んで、対象のシートコピーする方法も考えられます。 対応例です ↓ Sub ReadTxt()   Dim myTxtFile As String   Dim myBuf(11) As String   Dim i As Integer, j As Integer   Application.ScreenUpdating = False   myTxtFile = ActiveWorkbook.Path & "\data.txt"   Worksheets("展開").Activate   '==================== 以下を追加 ========================   Dim C As Integer   For C = 1 To 11     Select Case C       'A、C、D、H、I列は標準(数値)の例       Case 1, 3, 4, 8, 9         Columns(C).NumberFormatLocal = "G/標準"       'B、E、F、G、J、K列は文字列の例       Case Else         Columns(C).NumberFormatLocal = "@"     End Select   Next   '========================================================   Open myTxtFile For Input As #1   Do Until EOF(1)     Input #1, myBuf(1), myBuf(2), myBuf(3), myBuf(4), myBuf(5), myBuf(6), _     myBuf(7), myBuf(8), myBuf(9), myBuf(10), myBuf(11)     i = i + 1     For j = 1 To 11       Cells(i, j) = myBuf(j)     Next j   Loop   Close #1 End Sub

kenton
質問者

お礼

教えていただいたソースで実験してみたところ、 見事目的の結果を導けました。 ありがとうございます。 また、何かの際には質問していると思いますが、見かけましたら、助言をいただけると幸いです。

kenton
質問者

補足

回答ありがとうございます。 質問での記入に漏れていた部分まで憶測して頂いている回答、本当に感謝いたします。 nitscapeさんへのお礼にも書きましたが、全て数値の物の中から、頭に”0”が付くような数値を文字列にしようと試みていたものでした。 その点で、 >0001 の様な前ゼロが数値になってしまう(前ゼロが消える) >      'B、E、F、G、J、K列は文字列の例 >      Case Else >        Columns(C).NumberFormatLocal = "@" という回答はBingoかもしれません。 本日は、明日のことも考えると試せませんが、 明日移行試して、再びお礼をしたいと思います。 変数を設けて、文字列に指定したい列にNumberFormatLocalプロパティ(?)を指定してやれば良いのですね。 実行してみて、またわからない点は質問するかもしれませんが、その後目に付いた際にはお付き合い願えると幸いです。 ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • nitscape
  • ベストアンサー率30% (275/909)
回答No.1

 数値型に変更してから値をセルに書き込んでみたらどうでしょうか?  文字列から数値に直す関数名を忘れてしまいまたパソコンにExcelなどが入っていないので分かりません。ここではint()としています。  もし数字だけを含む文字列だけを数値としてという条件にするのであれば全文字チェックして0-9であればTRUEを返すような関数を作ればいいのではないでしょうか。 i = i + 1 For j = 1 To 11 if j = 1 then Cells(i, j) = int(myBuf(j)) else Cells(i, j) = myBuf(j) end if Next j Loop

kenton
質問者

お礼

返答が遅れてしまって申し訳ありません。 >もし数字だけを含む文字列だけを数値としてという条件にするのであれば全文字チェックして0-9であればTRUEを返すような関数を作ればいいのではないでしょうか。 質問の際に記入しておけばよかったのですが、全て数値の中から1列目の数値のみを文字列として扱おうとしてあれこれやっていました。 それは、”XXXX”という数値でして、頭から数桁が”0”になり得るので、それをどうにかして文字列として扱いたく、ここに質問した次第です。 この”XXXX”は商品コードでして、頭につく”0”も含めて、取り込んだ後の処理でVLOOKUP関数にて、取り込んだ数値の右側のセルを参照しようと試みていたものでした。 説明が足りず申し訳ありませんでした。 関数を作るというところまでVBAに関して理解しておりませんが、今後何かの際に参考にさせて頂こうと思います。 回答ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A