プロが教える店舗&オフィスのセキュリティ対策術

1レコード300項目のCSVがあります。(Webで収集したアンケートです)これを、EXCELで集計しようとしたところ、256項目(列?)までしか読み込めません。私はEXCELしか使うことができませんので、なんとかしてEXCELで読む方法は無いのでしょうか?また、アクセスなどのデータベースだと読むことが出来るのでしょうか?

A 回答 (2件)

EXCELの仕様が横が256セルですからそのままでは難しいですね。

多分ACCESSならば読めるとは思うのですがEXCELしかなくどうしてもということであれば、面倒ですが下記の方法でカットされたデータを読み込むのはどうでしょうか?

1.まずCSVファイルの拡張子をTXT等に変更します(コピーを作ってやって下さい)。

2.次に上記で拡張子を変更したファイルを開きますと「テキストファイルウィザード」が開きますので「タブやカンマ~」にチェックが入っていることを確認して次へ。

3.「区切り文字」に「カンマ」を追加して次へ。

4.「列のデータ形式」で257列以降を残して削除にチェックを入れて完了。

これでカットされた257列以降分のデータが読み込めるはずです。ただデータの順番のずれには気をつけてください。
    • good
    • 0

以下のコードは、新規のブックにインポートされます。


256 列を越えた分を、次のシートに貼り付けされます。こちらで試験したのは、300列です。論理的には、シートエラーを起こすまでということになるのですが、それは、常識的な範囲でお願いします。

一本しかない横のデータは、無理だと思います。というか、いわゆる時系列データは、Cells(i) で入れていきますね。1シートで、論理的に16,777,216個のデータが扱えることになります。

Alt+ F11 で、Visual Basic 画面を開いて、挿入-標準モジュールで、新しい画面が出たら、以下を貼り付けます。

なるべく、速い貼り付けができるように、以前あったものを改編してみました。しかし、思ったほど、速くなりませんでした。ハングしたかと思われては困るので、インポートは、見えるようにしました。

'---------------------------------------------------------
'<標準モジュールに登録してください>
Option Explicit
Sub OverColumnCSV()
 Dim i As Long, j As Long, k As Long, m As Long, n As Long
 Dim rw As Long, col As Long, FNo As Integer
 Dim Fname As String
 Dim TextLine As String
 Dim LineBuf As Variant, arbuf() As Variant
 Dim ShtCount As Integer
 Dim UB As Long
 Dim AddFlg As Integer
 '
  rw = 1 '最初の行数
  Fname = Application.GetOpenFilename("CSV ファイル(*.csv),*.csv")
  If Fname = "False" Then
   Exit Sub
  End If
  Workbooks.Add '新規ブック作成
  With ActiveWorkbook
  FNo = FreeFile()
  Open Fname For Input As #FNo 'ファイルインポート
  Do Until EOF(FNo)
   Line Input #FNo, TextLine
   '「""」 の除去
   TextLine = Application.Substitute(TextLine, """", "")
   LineBuf = Split(TextLine, ",")
   UB = UBound(LineBuf) '上限の添え字
   ShtCount = .Worksheets.Count
   'シート数の確認
   If j \ 257 > ShtCount Then .Worksheets.Add _
   After:=.Worksheets(ShtCount), Count:=(j \ 257) - ShtCount
   'ハングと間違えられるので、画面に出す
   'Application.ScreenUpdating = False
   If UB Mod 255 Then AddFlg = 1
   For j = 1 To (UB \ 257) + AddFlg
    With .Worksheets(j)
     If UB - j * 255 > 0 Then
      col = 256
      Else
      col = UB Mod 256
     End If
     k = k + col
     For m = (j - 1) * 256 To k - 1
      ReDim Preserve arbuf(n)
      arbuf(n) = LineBuf(m)
      n = n + 1
     Next m
     .Range(.Cells(rw, 1), .Cells(rw, col)).Value = arbuf
     ReDim arbuf(0): n = 0
    End With
   Next j
   rw = rw + 1: k = 0: m = 0
  Loop
  'Application.ScreenUpdating = True
  Close #FNo
 End With
 MsgBox "終了しました", 64
End Sub

'---------------------------------------------------------
    • good
    • 0

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