- ベストアンサー
Excel2003での改列方法
こんにちわ。 私はWindowsXPのExcel2003のVBAでテキストファイル のデータ(カンマ区切り)を指定したセル列に代入 したいと思っているのですが、途中でセル列を変えたら データの続きから代入したいのですが上手くいきません。 この説明だと分かりづらいと思うので下記の例を見てください。 例) テキストファイルの中身: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, 11,12,13,14,15,16,17,18,19,20,21,22,23,24,25, : ・ 90,91,92,93,94,95,96,97,98,99,100 セル列(B1:B10)に1~10の値を代入し、他のセル列(E1:E10)に11~20の値を,またその他のセルに30~のデータを10ずつ区切って代入したい考えています。下記のコードを実行したところ、 Do Until EOF(intFF) Line Input #intFF, tmp buf = Split(tmp, ",") Worksheets("sheet1").Range("B1:B10,E1:E10,H1:H10") = buf Worksheets("sheet1").Range("B1:B10,E1:E10,H1:H10") = WorksheetFunction.Transpose(buf) Loop Close #intFF 最初のB列にはきちんと代入されるのですが、E列では全てのセルに1が、H列にはB列の値(1~10)が代入されてしまいます。どうしたら良いのかお教え願います。
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
Line Inputで Tmpに読み込まれる文字列が 1,2,3 ... 98,99,100 といった途中に改行など無い文字列なのでしょうか 質問時に例示文字列ですと 『1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,』 『11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,』 と別行のように思えます ... 『11,12,13,14,15,』が重複しているため 1-100までのカンマ区切り文字列なら 読み込んだ行を splitで分解して これを別の配列に 0-9,10-19, 20-29などをコピーして WorksheetFunction.Transpseしてしまえばいいでしょう dim arTemp, m as integer, n as integer, i as integer ' 読み込んだ文字列を分解 buf = split( tmp, ",") ' 転記用の配列を準備 redim arTemp(9) m = 0 for n = 0 to 99 step 10 for i = 0 to 9 ' 転記用の要素の代入 arTemp( i ) = buf(n+i) next Range("B1:B10").Offset(0,m).value = WorksheetFunction.Transpose( arTmp ) m = m + 3 next といった具合でしょう
その他の回答 (9)
- n-jun
- ベストアンサー率33% (959/2873)
ANo.9です。 >指定した行のデータだけではなく全てのデータを読み込んでしまいます・・・。 まず、どのようなcsvファイルを、どのようにシートに分けていくのか 分ける前と後のシートレイアウトが不明です。 そして”指定”が意味する物が何であるか?と言う事です。 条件を与えるのか?データから書き込むシートを指定するのか? 紹介したサイトについては、csvの読み込み方を参考にと言う事であり、 そのものが要望事項の全てを網羅しているわけではありません。 必要に応じて書き換えなければなりません。 が、先にも申し上げたように要望事項が見えてこないのです。 あと質問事項が変わったのであれば、一度閉じて新たに立て直す方が、 回答の際にも切り分けしやすいと思いますよ。
- n-jun
- ベストアンサー率33% (959/2873)
n-junです。 >実行してみたら、確かに数字が繋がっていました。このテキストファイルの中身では無理なのでしょうか? 私のコードで無理な理由がわかりました。 しかし、対策としてはANo.4さんが既に回答されてますよ。 >あと、最初と趣旨が変わってしまうのですが・・・テキストファイルではなくcsvは読み込めますか? >これをマクロを実行したら行単位で読み込んで、それぞれ別のシートの指定したセルに代入するのは可能でしょうか? >それぞれの行の整数の数は違います。 CSV形式テキストデータの読み込み(カンマ数不定版) http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_030.html ご参考に。
補足
指定したセル列に値を代入するのは出来ました!! http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_030.html 上のサイトを参考にしてやったのですが、指定した行のデータだけではなく全てのデータを読み込んでしまいます・・・。
- onlyrom
- ベストアンサー率59% (228/384)
またまたonlyromです。 >B14:B73にはきちんと入るのですが、EとHには何も数字が入りません それはデータが全て繋がって読み込まれたからでしょう。 それを確認するために、以下の●の部分にMsgBoxをいれて実行してみてください。 Do Until EOF(intFF) Line Input #intFF, tmp MsgBox tmp '●ここで内容を表示して確認 buf = Split(tmp, ",") それから、次のコードは不要だと思いますが。。 >'ファイルの存在チェック >If Dir(strFILENAME) = "" Then >MsgBox strInFileName & "が見つかりません" >Exit Sub >End If
補足
何度もご回答ありがとうございます。 実行してみたら、確かに数字が繋がっていました。このテキストファイルの中身では無理なのでしょうか? あと、最初と趣旨が変わってしまうのですが・・・テキストファイルではなくcsvは読み込めますか?csvの中身は下記のようにしたいと考えています。 例) A B C D.......... 1 "氏名" 2 2 2 1 3....(整数の羅列) 3 1 3 2 3....(整数の羅列) 4 3 3 3 3....(整数の羅列) 5 2 1 2 3....(整数の羅列) . . これをマクロを実行したら行単位で読み込んで、それぞれ別のシートの指定したセルに代入するのは可能でしょうか?それぞれの行の整数の数は違います。 (最初と質問の内容が全く変わってしまい、申し訳ございません。)
- onlyrom
- ベストアンサー率59% (228/384)
しつこく登場、onlyromです。 n-junさん、フォローありがとうございます。 まさか、勝手に型を変更されてるとは、思いもしませんでした。 質問者さん、ダメですよ~、勝手に変えちゃ。。(>_<);;; 余談ですが、 n-junさんの回答は目に付く限りにおいて必ず読ませてもらってます。 とても参考になります。 これからも目から鱗の回答を期待しています。
補足
おはようございます。 申し訳ないです!!かなりの初心者なので、変数宣言の際には何かつけなければいけないと思い、勝手につけたしてしまいました・・。 コードは下記の通りです。 例) Dim buf As Variant, tmp As String Dim xlAPP As Application ' Applicationオブジェクト Dim intFF As Integer ' FreeFile値 Dim strFILENAME As String ' OPENするファイル名(フルパス) Dim D As Long, i As Long, N As Long, O As Long, Co As Long Dim Ag As Long, Si As Long, G As Long, W As Long, Fr As Long Dim x As Integer, Cnt As Integer, Rng ' Applicationオブジェクト取得 Set xlAPP = Application ' 「ファイルを開く」のフォームでファイル名の指定を受ける xlAPP.StatusBar = "読み込むファイル名を指定して下さい。" strFILENAME = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, _ Title:=cnsTITLE) ' キャンセルされた場合は以降の処理は行なわない If StrConv(strFILENAME, vbUpperCase) = "FALSE" Then Exit Sub ' FreeFile値の取得(以降この値で入出力する) intFF = FreeFile ' 指定ファイルをOPEN(入力モード) Open strFILENAME For Input As #intFF 'シートの保護を解除 ActiveSheet.Unprotect 'ファイルの存在チェック If Dir(strFILENAME) = "" Then MsgBox strInFileName & "が見つかりません" Exit Sub End If Rng = Array("B14:B73", "E14:E73", "H14:H73") Do Until EOF(intFF) Line Input #intFF, tmp buf = Split(tmp, ",") Worksheets("sheet1").Range(Rng(Cnt)) = WorksheetFunction.Transpose(buf) Cnt = Cnt + 1 Loop (すみません。質問欄にはB1:B10,E1:E10,H1:H10と書きましたが、実際に使用するセルはB14:B73", "E14:E73", "H14:H73です) これを実行したところ、B14:B73にはきちんと入るのですが、EとHには何も数字が入りません。
- n-jun
- ベストアンサー率33% (959/2873)
ANo.3です。 ANo.2さんの提示のコードでのエラー発生は、質問者さんが変数Rngを Range型で宣言してしまった為と思います。 横道でした。
- onlyrom
- ベストアンサー率59% (228/384)
再度の登場、onlyromです。 >「オブジェクト変数またはWITH ブロック変数が設定されていません」というエラーが出ました・・ 軽くテストしてありますのでエラーが出るのは、???です。 また、テキストデータがどんなものであれ上手くいくはずです。 コードのその部分だけではなく全てをアップしてください。
- n-jun
- ベストアンサー率33% (959/2873)
ANo.1です。 >試したところ、B列に1~100の数字が入ってしまいました・・・。 セル範囲を10個しか指定してないのに100個もデータが入ったのですか? そのコードを提示できますか?
補足
おはようございます。 すみません。100は間違いで、B列(B1:B10)に1~10の数字が入って処理が終わってしまいました。コードは下記の通りです。 (変数iは使用していたのでxにしました) 例) Dim x As Integer x = 0 Do Until EOF(intFF) Line Input #intFF, tmp buf = Split(tmp, ",") Worksheets("Sheet1").Range("B1").Offset(, x).Resize(10) = WorksheetFunction.Transpose(buf) x = x + 3 Loop
- onlyrom
- ベストアンサー率59% (228/384)
回答1と同じようなものですが、、、(^^;;; '----------------------------------------- Dim Cnt As Integer Dim Rng Rng = Array("B1:B10", "E1:E10", "H1:H10") Do Until EOF(intFF) Line Input #intFF, tmp buf = Split(tmp, ",") Worksheets("sheet1").Range(Rng(Cnt)) = WorksheetFunction.Transpose(buf) Cnt = Cnt + 1 Loop '--------------------------------------
補足
ご回答ありがとうございます。 Dim Cnt As Integer Dim Rng As Range Rng = Array("B1:B10", "E1:E10", "H1:H10") Do Until EOF(intFF) Line Input #intFF, tmp buf = Split(tmp, ",") Worksheets("sheet1").Range(Rng(Cnt)) = WorksheetFunction.Transpose(buf) Cnt = Cnt + 1 Loop 上記を実行したところ、「オブジェクト変数またはWITH ブロック変数が設定されていません」というエラーが出ました・・。
- n-jun
- ベストアンサー率33% (959/2873)
Dim i As Integer i = 0 Do Until EOF(intFF) Line Input #intFF, tmp buf = Split(tmp, ",") Worksheets("Sheet1").Range("B1").Offset(, i).Resize(10) = WorksheetFunction.Transpose(buf) i = i + 3 Loop こうゆう事ですか?
補足
ご回答ありがとうございます。 試したところ、B列に1~100の数字が入ってしまいました・・・。
補足
おはようございます。 すみません!!改行はしていますけど重複はしていないです・・。 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, 16,17,18,19,20,21,22,23,24,25, 26,27,28,29,30,31,32,33,34,35, ・ ・ こうでした・・。