Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7328 / 13646 ツリー ←次へ | 前へ→

【39795】タブ区切りのデータをインポート せいこ 06/7/1(土) 10:52 質問[未読]
【39796】Re:タブ区切りのデータをインポート Blue 06/7/1(土) 11:40 質問[未読]
【39798】Re:タブ区切りのデータをインポート せいこ 06/7/1(土) 13:23 質問[未読]
【39799】Re:タブ区切りのデータをインポート せいこ 06/7/1(土) 13:53 質問[未読]
【39800】Re:タブ区切りのデータをインポート Blue 06/7/1(土) 13:59 質問[未読]
【39802】Re:タブ区切りのデータをインポート せいこ 06/7/1(土) 14:16 質問[未読]
【39801】Re:タブ区切りのデータをインポート Hirofumi 06/7/1(土) 14:16 回答[未読]
【39803】Re:タブ区切りのデータをインポート せいこ 06/7/1(土) 15:11 お礼[未読]

【39795】タブ区切りのデータをインポート
質問  せいこ  - 06/7/1(土) 10:52 -

引用なし
パスワード
   6万5千行以上のテキストデータに自動で読み込みたいのですが、タブ区切りのデータをどのように読み込んで、シートに書きこめばよいのかがわかりません。

いまは一つのセルに全てがインプットされている状況です。

【39796】Re:タブ区切りのデータをインポート
質問  Blue  - 06/7/1(土) 11:40 -

引用なし
パスワード
   >6万5千行以上のテキストデータ
はどのように、シートに表示するのでしょうか?
普通に考えると、テキストの1行がエクセルの1行ではできないですよね?
どこかで、

テキストの2行が1行になるとか
どうにかしてデータをまとめるとか

そういう作業が必要ではないでしょうか?
ですので、もう少し具体的に

・テキストファイルはどのように指定するのか
・どんなテキストデータの内容なのか(タブ区切りとしかわからない)
・セルのどこに配置するのか

を明確にしてください。
予想で回答しても、あなたを混乱させるだけになってしまいますので。

【39798】Re:タブ区切りのデータをインポート
質問  せいこ  - 06/7/1(土) 13:23 -

引用なし
パスワード
   ▼Blue さん:

お返事ありがぉございます。

>・テキストファイルはどのように指定するのか
>・どんなテキストデータの内容なのか(タブ区切りとしかわからない)
>・セルのどこに配置するのか
>

テキストファイルはApplication.GetOpenFilename で指定したいと思っています。
テキスト1行に48の要素が入っていて、それらはタブで区切られています。
このタブ区切りの1行をエクセルのシート1行にインプットしたいです。
テキストの1行目の1個目の要素を、エクセルのA1に挿入。1行目の2個目の要素をB1に挿入。

テキストの2行目の1個目の要素をエクセルのA2に挿入。

言葉でうまく表現できず、わかりにくくてごめんなさいです。

テキスト各行は改行されています。

コメントよろしくお願いしますぅ。

【39799】Re:タブ区切りのデータをインポート
質問  せいこ  - 06/7/1(土) 13:53 -

引用なし
パスワード
   Sub データ読み込み ()

Workbooks.OpenText File:=input.txt", DataType:=xlDelimited, Tab:=True

End Sub

ファイル名を input.txt と固定すれば上記のマクロで読み込み可能なのですが、
6万5千行を超える場合、どのように処理すればよいでしょうか?

【39800】Re:タブ区切りのデータをインポート
質問  Blue  - 06/7/1(土) 13:59 -

引用なし
パスワード
   ですから
> 6万5千行を超える場合
はどのようにExcel上で表示させるつもりなんでしょうか?
それが明確でない以上アドバイスすらできません。
(しいていうなら、次期Excelを使ってくださいとしか、、、)

たとえば、行数をオーバーした場合Sheet2に続きをいれるとか
そういう具体的な回答がほしいです。


ところで、6万5千行のデータをExcelで表示することは
なにか意味があるのでしょうか?(全部のデータに目を通すわけではないですよね?)
フィルタ機能とかを使いたいとか?

【39801】Re:タブ区切りのデータをインポート
回答  Hirofumi  - 06/7/1(土) 14:16 -

引用なし
パスワード
   もっと上手い方法が有るかも?
データが指定行数を超えた場合シートを追加し、其れに読み込みます
Option Explicit

Public Sub CSVRead()
  
'  CSVデータの読み込み
  
  '各シートに書き込む先頭セル位置
  Const cstrTop As String = "A1"
  
  Dim i As Long
  Dim rngWrite As Range
  Dim lngRow As Long
  Dim strPath As String
  Dim dfn As Integer
  Dim vntFileName As Variant
  Dim vntField As Variant
  Dim strBuff As String
  Dim lngQuantity As Long
  Dim strProm As String
  
  '書き込む位置を設定
  Set rngWrite = ActiveSheet.Range(cstrTop)
  
  '1シートに読み込む最大行数
  lngQuantity = Rows.Count - rngWrite.Row 'シートの最終行までの時
'  lngQuantity = 60000           '最大行数を指定する場合
  
  '読み込むファイルのフォルダを設定
  strPath = ThisWorkbook.Path
  
  '指定フォルダからファイル名を取得
  If Not GetReadFile(vntFileName, strPath) Then
    strProm = "マクロがキャンセルされました"
    GoTo Wayout
  End If
  
  '画面更新を停止
  Application.ScreenUpdating = False
  
  '指定ファイルを読み込みモードでOpen
  dfn = FreeFile
  Open vntFileName For Input As dfn
  
  Do Until EOF(dfn)
    'ファイルから1行読み込み
    Line Input #dfn, strBuff
    'CSVをフィールドに分割
    vntField = SplitCsv(strBuff, vbTab)
    '指定シートの指定行列位置について
    With rngWrite.Offset(lngRow)
      'フィールドの書き込み
      .Resize(, UBound(vntField) + 1).Value = vntField
    End With
    '書き込み行位置を更新
    lngRow = lngRow + 1
    If lngRow > lngQuantity Then
      lngRow = 0
      'シートを追加して初期位置を設定
      Set rngWrite = rngWrite.Parent.Parent.Worksheets _
            .Add(After:=rngWrite.Parent).Range(cstrTop)
    End If
  Loop
  
  'ファイルをClose
  Close #dfn
  
  strProm = "処理が完了しました"
  
Wayout:
  
  '画面更新を再開
  Application.ScreenUpdating = True
  
  Set rngWrite = Nothing
  
  MsgBox strProm, vbInformation
  
End Sub

Private Function SplitCsv(ByVal strLine As String, _
            Optional strDelimiter As String = ",", _
            Optional strQuote As String = """", _
            Optional strRet As String = vbCrLf, _
            Optional blnMulti As Boolean) As Variant

'      strLine     :分割元と成る文字列
'      strDelimiter  :区切り文字
'      SplitCsv    :戻り値、切り出された文字配列

  Dim lngDPos As Long
  Dim vntData() As Variant
  Dim lngStart As Long
  Dim i As Long
  Dim vntField As Variant
  Dim lngLength As Long
  
  i = 0
  lngStart = 1
  lngLength = Len(strLine)
  blnMulti = False
  Do
    ReDim Preserve vntData(i)
    If Mid$(strLine, lngStart, 1) <> strQuote Then
      lngDPos = InStr(lngStart, strLine, _
            strDelimiter, vbBinaryCompare)
      If lngDPos > 0 Then
        vntField = Mid$(strLine, lngStart, _
                  lngDPos - lngStart)
        If lngDPos = lngLength Then
          ReDim Preserve vntData(i + 1)
        End If
        lngStart = lngDPos + 1
      Else
        vntField = Mid$(strLine, lngStart)
        lngStart = lngLength + 1
      End If
    Else
      lngStart = lngStart + 1
      Do
        lngDPos = InStr(lngStart, strLine, _
                strQuote, vbBinaryCompare)
        If lngDPos > 0 Then
          vntField = vntField & Mid$(strLine, _
                lngStart, lngDPos - lngStart)
          lngStart = lngDPos + 1
          Select Case Mid$(strLine, lngStart, 1)
            Case ""
              Exit Do
            Case strDelimiter
              lngStart = lngStart + 1
              Exit Do
            Case strQuote
              lngStart = lngStart + 1
              vntField = vntField & strQuote
          End Select
        Else
          blnMulti = True
          vntField = Mid$(strLine, lngStart) & strRet
          lngStart = lngLength + 1
          Exit Do
        End If
      Loop
    End If
    vntData(i) = vntField
    vntField = Empty
    i = i + 1
  Loop Until lngLength < lngStart
  
  SplitCsv = vntData()
  
End Function

Private Function GetReadFile(vntFileNames As Variant, _
            Optional strFilePath As String, _
            Optional blnMultiSel As Boolean _
                    = False) As Boolean

  Dim strFilter As String
  
  'フィルタ文字列を作成
  strFilter = "CSV File (*.csv),*.csv," _
        & "Text File (*.txt),*.txt," _
        & "CSV and Text (*.csv; *.txt),*.csv;*.txt," _
        & "全て (*.*),*.*"
  '読み込むファイルの有るフォルダを指定
  If strFilePath <> "" Then
    'ファイルを開くダイアログ表示ホルダに移動
    ChDrive Left(strFilePath, 1)
    ChDir strFilePath
  End If
  'もし、ディフォルトのファイル名が有る場合
  If vntFileNames <> "" Then
    SendKeys vntFileNames & "{TAB}", False
  End If
  '「ファイルを開く」ダイアログを表示
  vntFileNames _
      = Application.GetOpenFilename(strFilter, 2, , , blnMultiSel)
  If VarType(vntFileNames) = vbBoolean Then
    Exit Function
  End If
  
  GetReadFile = True
  
End Function

【39802】Re:タブ区切りのデータをインポート
質問  せいこ  - 06/7/1(土) 14:16 -

引用なし
パスワード
   ▼Blue さん:

行数をオーバーした場合は次にシートに続きをいれたいです。
確かに仰るとおり次期エクセルは104万行(?)ですから、このような問題はないと思います。


>ところで、6万5千行のデータをExcelで表示することは
>なにか意味があるのでしょうか?(全部のデータに目を通すわけではないですよね?)
>フィルタ機能とかを使いたいとか?

串刺しで計算したいと考えています。オートフィルタも利用したいと思っています。

【39803】Re:タブ区切りのデータをインポート
お礼  せいこ  - 06/7/1(土) 15:11 -

引用なし
パスワード
   ▼Hirofumi さん

ありがとうございますぅ。

きれいにデータが分割されました。

本当にありがとうございました。

7328 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free