プロが教えるわが家の防犯対策術!

こんにちわ。
私は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)が代入されてしまいます。どうしたら良いのかお教え願います。

A 回答 (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

といった具合でしょう

この回答への補足

おはようございます。
すみません!!改行はしていますけど重複はしていないです・・。
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,
          ・
          ・
こうでした・・。

補足日時:2008/09/12 09:56
    • good
    • 0

ANo.9です。



>指定した行のデータだけではなく全てのデータを読み込んでしまいます・・・。
まず、どのようなcsvファイルを、どのようにシートに分けていくのか
分ける前と後のシートレイアウトが不明です。

そして”指定”が意味する物が何であるか?と言う事です。
条件を与えるのか?データから書き込むシートを指定するのか?

紹介したサイトについては、csvの読み込み方を参考にと言う事であり、
そのものが要望事項の全てを網羅しているわけではありません。
必要に応じて書き換えなければなりません。
が、先にも申し上げたように要望事項が見えてこないのです。

あと質問事項が変わったのであれば、一度閉じて新たに立て直す方が、
回答の際にも切り分けしやすいと思いますよ。
    • good
    • 0

n-junです。



>実行してみたら、確かに数字が繋がっていました。このテキストファイルの中身では無理なのでしょうか?
私のコードで無理な理由がわかりました。
しかし、対策としてはANo.4さんが既に回答されてますよ。

>あと、最初と趣旨が変わってしまうのですが・・・テキストファイルではなくcsvは読み込めますか?
>これをマクロを実行したら行単位で読み込んで、それぞれ別のシートの指定したセルに代入するのは可能でしょうか?
>それぞれの行の整数の数は違います。
CSV形式テキストデータの読み込み(カンマ数不定版)
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub0 …
ご参考に。

この回答への補足

指定したセル列に値を代入するのは出来ました!!
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub0 …
上のサイトを参考にしてやったのですが、指定した行のデータだけではなく全てのデータを読み込んでしまいます・・・。

補足日時:2008/09/16 10:58
    • good
    • 0

またまた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....(整数の羅列)
.
.
これをマクロを実行したら行単位で読み込んで、それぞれ別のシートの指定したセルに代入するのは可能でしょうか?それぞれの行の整数の数は違います。
(最初と質問の内容が全く変わってしまい、申し訳ございません。)

補足日時:2008/09/12 14:36
    • good
    • 0

しつこく登場、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には何も数字が入りません。

補足日時:2008/09/12 10:00
    • good
    • 0

ANo.3です。



ANo.2さんの提示のコードでのエラー発生は、質問者さんが変数Rngを
Range型で宣言してしまった為と思います。

横道でした。
    • good
    • 0

再度の登場、onlyromです。



>「オブジェクト変数またはWITH ブロック変数が設定されていません」というエラーが出ました・・

軽くテストしてありますのでエラーが出るのは、???です。
また、テキストデータがどんなものであれ上手くいくはずです。

コードのその部分だけではなく全てをアップしてください。
 
    • good
    • 0

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

補足日時:2008/09/12 09:50
    • good
    • 0

回答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 ブロック変数が設定されていません」というエラーが出ました・・。

補足日時:2008/09/11 18:03
    • good
    • 0

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の数字が入ってしまいました・・・。

補足日時:2008/09/11 17:21
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!