Excel VBA質問箱 IV

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

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


2176 / 13645 ツリー ←次へ | 前へ→

【69508】CSVの取込みについて ぞう 11/7/25(月) 18:20 質問[未読]
【69511】Re:CSVの取込みについて Jaka 11/7/26(火) 9:42 発言[未読]
【69515】Re:CSVの取込みについて ぞう 11/7/27(水) 13:46 お礼[未読]
【69516】Re:CSVの取込みについて Jaka 11/7/27(水) 14:01 発言[未読]
【69518】Re:CSVの取込みについて ぞう 11/7/27(水) 15:13 質問[未読]
【69519】Re:CSVの取込みについて Jaka 11/7/27(水) 15:41 発言[未読]
【69520】追加分 Jaka 11/7/27(水) 15:43 発言[未読]
【69539】Re: ぞう 11/7/29(金) 11:22 お礼[未読]
【69549】Re: 解読不能 11/7/31(日) 18:30 発言[未読]
【69522】Re:CSVの取込みについて ぞう 11/7/27(水) 16:41 お礼[未読]
【69523】Re:CSVの取込みについて ぞう 11/7/27(水) 16:54 お礼[未読]
【69524】Re:CSVの取込みについて momo 11/7/27(水) 18:52 発言[未読]
【69536】Re:CSVの取込みについて ぞう 11/7/29(金) 10:36 お礼[未読]
【69525】Re:CSVの取込みについて n 11/7/27(水) 20:01 発言[未読]
【69537】Re:CSVの取込みについて ぞう 11/7/29(金) 10:39 お礼[未読]

【69508】CSVの取込みについて
質問  ぞう  - 11/7/25(月) 18:20 -

引用なし
パスワード
   Macから出力されたCVSファイルですが、カンマ区切りでエクセルに吐こうとすると文字化けしてしまします。
拡張子をtxt形式に直し、エクセルシートから「開く」をクリックして、テキストファイルウィザードでカンマにチェックを入れて完了を押すと正常に表示されるのですが、この一連の動作をVBAで実行するにはどの様にすれば良いのでしょうか?
また、ファイル名は日々変わるので、指定のフォルダをから任意選択を希望しております。
どうかよろしくご教授ください。

【69511】Re:CSVの取込みについて
発言  Jaka  - 11/7/26(火) 9:42 -

引用なし
パスワード
   Macのバイナリとかあったのか忘れましたけど、
これも文字化けしますか?

'参照設定 Microsoft DAO 3.6 Object Library が必要。(3.6は、Win2000の場合)

Sub CSV読み込み()
Dim DDB As DAO.Database
Dim OpnF As Variant
Dim DBPth As String, CSV_F As String
  
OpnF = Application.GetOpenFilename("Excelファイル (*.csv;*.txt), *.csv;*.txt")
If VarType(OpnF) = vbBoolean Then
  Exit Sub
End If
'GetOpenで、カレントディレクトリが移動しているので、そのまま使う。
DBPth = CreateObject("WScript.Shell").CurrentDirectory
CSV_F = Dir(OpnF)

Stt = Now()
Set DDB = DBEngine.Workspaces(0).OpenDatabase(DBPth, False, False, "Text;HDR=NO;")
SQLSt = "SELECT * FROM " & CSV_F
Set dbrs = DDB.OpenRecordset(SQLSt, dbOpenSnapshot)
Range("A1").CopyFromRecordset dbrs

Set DDB = Nothing
Set dbrs = Nothing
MsgBox Format(Now() - Stt, "Hh:mm:ss")
End Sub

【69515】Re:CSVの取込みについて
お礼  ぞう  - 11/7/27(水) 13:46 -

引用なし
パスワード
   さっそくありがとうございました。
参照設定でMicrosoft DAO 3.6 Object Libraryにチェックを入れ、実行してみました。対象のCSVファイルを選択すると時間の計測結果のみが表示されるのですが、何か方法を間違っておりますでしょうか。

▼Jaka さん:
>Macのバイナリとかあったのか忘れましたけど、
>これも文字化けしますか?
>
>'参照設定 Microsoft DAO 3.6 Object Library が必要。(3.6は、Win2000の場合)
>
>Sub CSV読み込み()
>Dim DDB As DAO.Database
>Dim OpnF As Variant
>Dim DBPth As String, CSV_F As String
>  
>OpnF = Application.GetOpenFilename("Excelファイル (*.csv;*.txt), *.csv;*.txt")
>If VarType(OpnF) = vbBoolean Then
>  Exit Sub
>End If
>'GetOpenで、カレントディレクトリが移動しているので、そのまま使う。
>DBPth = CreateObject("WScript.Shell").CurrentDirectory
>CSV_F = Dir(OpnF)
>
>Stt = Now()
>Set DDB = DBEngine.Workspaces(0).OpenDatabase(DBPth, False, False, "Text;HDR=NO;")
>SQLSt = "SELECT * FROM " & CSV_F
>Set dbrs = DDB.OpenRecordset(SQLSt, dbOpenSnapshot)
>Range("A1").CopyFromRecordset dbrs
>
>Set DDB = Nothing
>Set dbrs = Nothing
>MsgBox Format(Now() - Stt, "Hh:mm:ss")
>End Sub

【69516】Re:CSVの取込みについて
発言  Jaka  - 11/7/27(水) 14:01 -

引用なし
パスワード
   ▼ぞう さん:
>さっそくありがとうございました。
>参照設定でMicrosoft DAO 3.6 Object Libraryにチェックを入れ、実行してみました。対象のCSVファイルを選択すると時間の計測結果のみが表示されるのですが、何か方法を間違っておりますでしょうか。

アクティブシートにCSV及びTextの内容が展開されるはずですけど?
CSVファイルをメモ帳で開くとどうなっていますか?

あ〜、CSVファイルをメモ帳で開いて別名で保存するとどうなるのかな?

【69518】Re:CSVの取込みについて
質問  ぞう  - 11/7/27(水) 15:13 -

引用なし
パスワード
   返信ありがとうございます。
CSVファイルをメモ帳で開くと、カンマで区切られたデータが出てきます。そのまま別名で保存をして、再度実行してみましたが繁栄されませんでした。
で、Windowsから出力されたCSVファイルを試してみたのですが、問題なく出力されました。やはりMacから出力されたものは何か違うのでしょうか。。。

▼Jaka さん:
>▼ぞう さん:
>>さっそくありがとうございました。
>>参照設定でMicrosoft DAO 3.6 Object Libraryにチェックを入れ、実行してみました。対象のCSVファイルを選択すると時間の計測結果のみが表示されるのですが、何か方法を間違っておりますでしょうか。
>
>アクティブシートにCSV及びTextの内容が展開されるはずですけど?
>CSVファイルをメモ帳で開くとどうなっていますか?
>
>あ〜、CSVファイルをメモ帳で開いて別名で保存するとどうなるのかな?

【69519】Re:CSVの取込みについて
発言  Jaka  - 11/7/27(水) 15:41 -

引用なし
パスワード
   最近と言うか、ここ数年Macでエクセルを触っていないので・・・・。
Macバイナリーが原因か解らんけど、除去するアプリ。

ht tp://www.vector.co.jp/soft/win95/util/se149423.html
ht tp://ww1.tiki.ne.jp/~swinepal/sunyansoft/support/macbn/macbn_sp.html

ここのAppleさんなら、原因が解るのかも?
ht tp://excelfactory.net/excelboard/excelvba/excel.cgi

おまけ、ここがVBA研究所と名乗っていたころに書いた物。何年前だ?
当時のまま今でも使ったりしてます。


Option Base 1

Sub aaaa()
  Dim シート名 As String, 基シート名 As String, 処理CNT As Long, CSV全データ行数 As Long
  Dim 書始め行 As Long, 増シート数 As Integer, 行 As Long, 列位置 As Integer
  Dim TBL() As String, カンマ数 As Integer, TBL行数 As Long, TBL行CNT As Long, 拡張子 As String
  Dim ReadData As String, 設定行 As Long, 設定列 As Long, バーお知らせ As String
  Dim 基本TBL行数 As Long, 使用TBL行数 As Long, 終了flg As Integer, 改シート行flg As Integer
  Dim 書込み最終行設定 As Long, 書込み有効残数 As Long, シート最終行入力 As String, 追加枚数 As Integer
  Dim 振分け As Variant, 振分け2 As Variant, STime As Variant, ETime As Variant
  Dim I As Long, WクォFlg As Byte, DoEvCnt As Long

  基シート名 = ActiveSheet.Name
  シート名 = 基シート名: 増シート数 = 0: 改シート行flg = 0
  CSV全データ行数 = 0: バーお知らせ = "行目から ": 終了flg = 0: カンマ数 = 0: DoEvCnt = 0
  基本TBL行数 = 500: TBL行CNT = 0: 処理CNT = 0: 改シートflg = 0: WクォFlg = 0
  
  'On Error Resume Next
  オープンファイル = Application.GetOpenFilename("Excelファイル (*.csv;*.txt), *.csv;*.txt")
  If オープンファイル <> False Then
    拡張子 = StrConv(Right(オープンファイル, 3), vbUpperCase)
    Open オープンファイル For Input As #1
  Else
    End
  End If
  
  '書込み形式入力
  Line Input #1, ReadData
  振分け = MsgBox(拡張子 & "ファイルをカンマ区切りでセルに振分けますか?" & vbCrLf & vbCrLf & _
       "振分けずに1列に読込むなら「いいえ」を。" & vbCrLf & vbCrLf & _
       "中止するならキャンセルを選択してください。", vbQuestion + vbYesNoCancel, 拡張子 & _
       "ファイル読込形式")
  If 振分け = vbYes Then
    For I = 1 To Len(ReadData)
      If Mid(ReadData, I, 1) = "," And WクォFlg = 0 Then
       カンマ数 = カンマ数 + 1
      ElseIf Mid(ReadData, I, 1) = Chr(34) And WクォFlg = 0 Then
       WクォFlg = 1
      ElseIf Mid(ReadData, I, 1) = Chr(34) And WクォFlg = 1 Then
       WクォFlg = 0
      End If
    Next
    If カンマ数 = 0 Then
     振分け2 = MsgBox("1行目データを見た所、区切りのカンマが全くありません。" & Chr(13) & _
          "強行しますか?", vbExclamation + vbYesNo, "カンマエラー")
     If 振分け2 = vbNo Then
       Close #1
       End
     End If
    ElseIf カンマ数 > 100 Then
     基本TBL行数 = 100
    ElseIf カンマ数 > 50 Then
     基本TBL行数 = 200
    End If
  ElseIf 振分け = vbNo Then
    基本TBL行数 = 15000
  Else
    Close #1
    End
  End If
  Close #1
  ReadData = Empty
  
  'CSV全データ行数カウント。速いパソコン or データ量が少ないとカウントが速過ぎて見えない。
  Set myShape1 = ActiveSheet.Shapes.AddTextEffect(msoTextEffect11, _
      "現在、" & 拡張子 & "全データ行数を" & vbCrLf & "カウントしています。 ", _
      "MS ゴシック", 28, msoFalse, msoFalse, 120, 100)
  'Application.DisplayStatusBar = True
  'Application.StatusBar = 拡張子 & "全データ行数をカウントしています 。"
  DoEvents
  DoEvents
  Open オープンファイル For Input As #1
  Do Until EOF(1)
    Line Input #1, ReadData
    CSV全データ行数 = CSV全データ行数 + 1
  Loop
  Close #1
  'Application.DisplayStatusBar = False

  'Set TxStm = Fso.OpenTextFile(Filename:=オープンファイル, IOMode:=ForReading)
  'Do Until TxStm.AtEndOfLine
  '  TxStm.SkipLine
  'Loop
  'CSV全データ行数 = TxStm.Line - 1
  'Set TxStm = Nothing
  
  myShape1.Delete
  Set myShape1 = Nothing
  DoEvents
     
  'シート最終行(改ページ行)入力
  書込み最終行設定 = Cells(Rows.Count, 1).Row
  Do
    シート最終行入力 = Application.InputBox(Prompt:=拡張子 & "全データ行数は、" & CSV全データ行数 & "行有りました。" & _
             vbCrLf & vbCrLf & "書込み最終行(改ページ行)を入力して下さい。", _
             Title:="書込み最終行(改ページ行)入力", Default:=書込み最終行設定)
    If シート最終行入力 = "False" Then
      End
    ElseIf Not (IsNumeric(シート最終行入力)) Then
      MsgBox "数字を入力して下さい。", vbExclamation, "入力エラー"
    ElseIf シート最終行入力 < 1 Or シート最終行入力 > 書込み最終行設定 Then
      MsgBox "最終行(改ページ行)は、1〜" & 書込み最終行設定 & "の間までです。", vbExclamation, "入力エラー"
    Else
      書込み最終行設定 = Int(シート最終行入力)
      Exit Do
    End If
  Loop

  Do
    Call 書込み開始位置設定(設定行, 設定列)
    If 設定行 > 書込み最終行設定 Then
      MsgBox "書込み最終行(改ページ行)" & "行より下行を" & vbCrLf & _
         "書込み開始行とすることはできません。", vbExclamation, "開始位置設定エラー"
    ElseIf CSV全データ行数 / (書込み最終行設定 - (設定行 - 1)) + Worksheets.Count - 1 > 50 Then
      追加枚数 = CSV全データ行数 / (書込み最終行設定 - (設定行 - 1)) - 1
      中止有無 = MsgBox("現在のシート枚数 " & Worksheets.Count & " 枚、追加されるシート枚数 " & 追加枚数 & " 枚。" & vbCrLf & _
           vbCrLf & "全シート枚数が50枚を超えます。" & vbCrLf & vbCrLf & "書き始め行と書込み最終行(改シート行)を設定を変えますか?" & _
           vbCrLf & vbCrLf & "見なおす場合は、一旦終了します。", vbExclamation + vbYesNo, "シート追加枚数警報")
      If 中止有無 = vbYes Then
       End
      Else
       Exit Do
      End If
    Else
      Exit Do
    End If
  Loop
  書始め行 = 設定行
  行 = 書始め行
  書始め列 = 設定列
  
  '初期TBL行数設定
  書込み有効残数 = 書込み最終行設定 - (書始め行 - 1)
  If 書込み有効残数 < 基本TBL行数 Then
    基本TBL行数 = 書込み有効残数
  ElseIf CSV全データ行数 <= 基本TBL行数 Then
    基本TBL行数 = CSV全データ行数
    終了flg = 1
  End If
  TBL行数 = 基本TBL行数
  ReDim TBL(TBL行数, カンマ数 + 1)
  
  Application.DisplayStatusBar = True
  'Application.ScreenUpdating = False
  Application.Calculation = xlManual
  
  STime = Now()
  Open オープンファイル For Input As #1
  Do Until EOF(1)
    処理CNT = 処理CNT + 1
    TBL行CNT = TBL行CNT + 1
    'Application.StatusBar = 拡張子 & "全データ " & CSV全データ行数 & "行中、" & Format(処理CNT, "000000") & "行目読込み中"
   
    'セル列方向TBL転記
    If カンマ数 = 0 Then
     Line Input #1, TBL(TBL行CNT, カンマ数 + 1)
     'TBL(TBL行CNT, カンマ数 + 1) = ReadData
    Else
     For I = 1 To カンマ数 + 1
       Input #1, TBL(TBL行CNT, I)
     Next
    End If
   
    If TBL行CNT = TBL行数 Or EOF(1) Then
     Application.StatusBar = 拡張子 & "全データ " & CSV全データ行数 & "行中、" & Format(処理CNT, "000000") & "行目読込み後、" & _
                 シート名 & "に " & 行 & バーお知らせ & TBL行数 & "行の書込み中"
     With ActiveWorkbook.Worksheets(シート名).Range(Cells(行, 書始め列), Cells(行 + TBL行数 - 1, 書始め列 + カンマ数))
       .ClearContents
       .Value = TBL
     End With
     DoEvCnt = DoEvCnt + 1
     'If DoEvCnt = 10 Then
     '  DoEvents
     '  DoEvCnt = 0
     'End If
     DoEvents
     TBL行CNT = 0
     行 = 行 + TBL行数
     書込み有効残数 = 書込み有効残数 - TBL行数
     If 終了flg = 1 Then
       Exit Do
     End If
     If CSV全データ行数 - 処理CNT > 0 Then
       '改ページ
       If 書込み有効残数 = 0 Then
        Call TBL使用シート増(基シート名, シート名, 増シート数, 設定行, 設定列)
        DoEvents
        行 = 書始め行
        書込み有効残数 = 書込み最終行設定 - (書始め行 - 1)
        If CSV全データ行数 - 処理CNT < TBL行数 Then
          TBL行数 = CSV全データ行数 - 処理CNT
        Else
          TBL行数 = 基本TBL行数
        End If
       ElseIf 書込み有効残数 < TBL行数 Then
        TBL行数 = 書込み有効残数
       ElseIf CSV全データ行数 - 処理CNT < TBL行数 Then
        TBL行数 = CSV全データ行数 - 処理CNT
       Else
        TBL行数 = 基本TBL行数
       End If
     Else
       終了flg = 1
     End If
     ReDim TBL(TBL行数, カンマ数 + 1)
    End If
  Loop
  Close #1
  Erase TBL
  ETime = Now()
  'Application.ScreenUpdating = True
  Application.Calculation = xlAutomatic
  DoEvents
  Set myShape2 = ActiveSheet.Shapes.AddTextEffect(msoTextEffect11, _
         "処理終了しました ", "MS ゴシック", 48, msoFalse, msoFalse, 120, 100)
  Application.StatusBar = 拡張子 & "全データ " & CSV全データ行数 & "行中、" & Format(処理CNT, "000000") & "行の処理終了しました。"
  'MsgBox "クリックして下さい。"
  'MsgBoxだと位置を変えられないので。
  myShape2.Delete
  Set myShape2 = Nothing
  Application.DisplayStatusBar = False
  MsgBox "TBL行数" & 基本TBL行数 & vbCrLf & STime & "-" & ETime & "=" & Format(ETime - STime, "hh:mm:ss")
End Sub

【69520】追加分
発言  Jaka  - 11/7/27(水) 15:43 -

引用なし
パスワード
   1度でUPできないので。

         '基シート名, シート名, 増シート数, 設定行, 設定列
Sub TBL使用シート増(基シート名 As String, シート名 As String, 増シート数 As Integer, 設定行 As Long, 設定列 As Long)
  Dim 使用列数 As Integer, RR As Integer, II As Integer
  With Sheets(基シート名).UsedRange
     使用列数 = .Cells(.Count).Column
  End With
  '使用列数 = Sheets(基シート名).UsedRange.Columns.Count
  For II = 1 To Worksheets.Count
    If ActiveSheet.Name = Worksheets(II).Name Then
      On Error Resume Next
      '完全な追加形式ではない場合、下記●の付いた5行のチェックをはずす。
      'シート名 = Worksheets(II + 1).Name           '●
      'If Err <> 0 Then                   '●
       増シート数 = 増シート数 + 1
       '書式をコピーする。データが多いとろくに動かない。「ディスクがいっぱいです。」とのエラーになる
       'Worksheets(基シート名).Copy after:=Worksheets(II)
       'Worksheets(II + 1).Name = 基シート名 & "_" & 増シート数
       'シート名 = Worksheets(II + 1).Name           '基シート名 & "_" & 増シート数
       'Worksheets(シート名).Range(Cells(設定行, 設定列 + カンマ数 + 1), Cells(改シート行, 設定列 + カンマ数 + 1)).ClearContents
       'Worksheets(シート名).Shapes.Range(Array("Button 1", "Button 2", "Button 3")).Delete
       '書式を追加後、コピー
       Worksheets.Add after:=Worksheets(II)
       ActiveSheet.Name = 基シート名 & "_" & 増シート数
       シート名 = Worksheets(II + 1).Name
       Application.ScreenUpdating = False
       For RR = 1 To 使用列数
         With Sheets(シート名)
           .Columns(RR).NumberFormatLocal = Sheets(基シート名).Columns(RR).NumberFormatLocal
           .Columns(RR).ColumnWidth = Sheets(基シート名).Columns(RR).ColumnWidth
         End With
       Next
       Application.ScreenUpdating = True
      '  DoEvents
      '  Err.Clear                      '●
      '  On Error GoTo 0                   '●
      'End If                         '●
      Worksheets(シート名).Select
      Exit Sub
    End If
  Next
End Sub

'注)32767行までしか認識しない。
Function 書込み開始位置設定(設定行, 設定列) As Long
  Dim エラー番号 As Integer
  Dim 入力始点位置set As Object
  On Error Resume Next
  Set 入力始点位置set = Application.InputBox(Prompt:="書込む最初のセルをクリックして下さい。", _
             Title:="書込み位置の選択", Default:=ActiveCell.Address, Type:=8)
  If 入力始点位置set Is Nothing Then
    入力始点位置set = Nothing
    End
  Else
    設定行 = 入力始点位置set.Row
    設定列 = 入力始点位置set.Column
  End If
  入力始点位置set = Nothing
End Function

【69522】Re:CSVの取込みについて
お礼  ぞう  - 11/7/27(水) 16:41 -

引用なし
パスワード
   Jakaさん
ご回答ありがとうございます。
早速実行してみましたら、一列にズラッと出てきました。
これでも規則正しければ使えるかなと思い元データと照らし合わせてみたのですが、表示されない数字などがあり、残念ながら解決できませんでした。
でも大変感謝しております。本当にありがとうございました。

▼Jaka さん:
>最近と言うか、ここ数年Macでエクセルを触っていないので・・・・。
>Macバイナリーが原因か解らんけど、除去するアプリ。
>
>ht tp://www.vector.co.jp/soft/win95/util/se149423.html
>ht tp://ww1.tiki.ne.jp/~swinepal/sunyansoft/support/macbn/macbn_sp.html
>
>ここのAppleさんなら、原因が解るのかも?
>ht tp://excelfactory.net/excelboard/excelvba/excel.cgi
>
>おまけ、ここがVBA研究所と名乗っていたころに書いた物。何年前だ?
>当時のまま今でも使ったりしてます。
>
>
>Option Base 1
>
>Sub aaaa()
>  Dim シート名 As String, 基シート名 As String, 処理CNT As Long, CSV全データ行数 As Long
>  Dim 書始め行 As Long, 増シート数 As Integer, 行 As Long, 列位置 As Integer
>  Dim TBL() As String, カンマ数 As Integer, TBL行数 As Long, TBL行CNT As Long, 拡張子 As String
>  Dim ReadData As String, 設定行 As Long, 設定列 As Long, バーお知らせ As String
>  Dim 基本TBL行数 As Long, 使用TBL行数 As Long, 終了flg As Integer, 改シート行flg As Integer
>  Dim 書込み最終行設定 As Long, 書込み有効残数 As Long, シート最終行入力 As String, 追加枚数 As Integer
>  Dim 振分け As Variant, 振分け2 As Variant, STime As Variant, ETime As Variant
>  Dim I As Long, WクォFlg As Byte, DoEvCnt As Long
>
>  基シート名 = ActiveSheet.Name
>  シート名 = 基シート名: 増シート数 = 0: 改シート行flg = 0
>  CSV全データ行数 = 0: バーお知らせ = "行目から ": 終了flg = 0: カンマ数 = 0: DoEvCnt = 0
>  基本TBL行数 = 500: TBL行CNT = 0: 処理CNT = 0: 改シートflg = 0: WクォFlg = 0
>  
>  'On Error Resume Next
>  オープンファイル = Application.GetOpenFilename("Excelファイル (*.csv;*.txt), *.csv;*.txt")
>  If オープンファイル <> False Then
>    拡張子 = StrConv(Right(オープンファイル, 3), vbUpperCase)
>    Open オープンファイル For Input As #1
>  Else
>    End
>  End If
>  
>  '書込み形式入力
>  Line Input #1, ReadData
>  振分け = MsgBox(拡張子 & "ファイルをカンマ区切りでセルに振分けますか?" & vbCrLf & vbCrLf & _
>       "振分けずに1列に読込むなら「いいえ」を。" & vbCrLf & vbCrLf & _
>       "中止するならキャンセルを選択してください。", vbQuestion + vbYesNoCancel, 拡張子 & _
>       "ファイル読込形式")
>  If 振分け = vbYes Then
>    For I = 1 To Len(ReadData)
>      If Mid(ReadData, I, 1) = "," And WクォFlg = 0 Then
>       カンマ数 = カンマ数 + 1
>      ElseIf Mid(ReadData, I, 1) = Chr(34) And WクォFlg = 0 Then
>       WクォFlg = 1
>      ElseIf Mid(ReadData, I, 1) = Chr(34) And WクォFlg = 1 Then
>       WクォFlg = 0
>      End If
>    Next
>    If カンマ数 = 0 Then
>     振分け2 = MsgBox("1行目データを見た所、区切りのカンマが全くありません。" & Chr(13) & _
>          "強行しますか?", vbExclamation + vbYesNo, "カンマエラー")
>     If 振分け2 = vbNo Then
>       Close #1
>       End
>     End If
>    ElseIf カンマ数 > 100 Then
>     基本TBL行数 = 100
>    ElseIf カンマ数 > 50 Then
>     基本TBL行数 = 200
>    End If
>  ElseIf 振分け = vbNo Then
>    基本TBL行数 = 15000
>  Else
>    Close #1
>    End
>  End If
>  Close #1
>  ReadData = Empty
>  
>  'CSV全データ行数カウント。速いパソコン or データ量が少ないとカウントが速過ぎて見えない。
>  Set myShape1 = ActiveSheet.Shapes.AddTextEffect(msoTextEffect11, _
>      "現在、" & 拡張子 & "全データ行数を" & vbCrLf & "カウントしています。 ", _
>      "MS ゴシック", 28, msoFalse, msoFalse, 120, 100)
>  'Application.DisplayStatusBar = True
>  'Application.StatusBar = 拡張子 & "全データ行数をカウントしています 。"
>  DoEvents
>  DoEvents
>  Open オープンファイル For Input As #1
>  Do Until EOF(1)
>    Line Input #1, ReadData
>    CSV全データ行数 = CSV全データ行数 + 1
>  Loop
>  Close #1
>  'Application.DisplayStatusBar = False
>
>  'Set TxStm = Fso.OpenTextFile(Filename:=オープンファイル, IOMode:=ForReading)
>  'Do Until TxStm.AtEndOfLine
>  '  TxStm.SkipLine
>  'Loop
>  'CSV全データ行数 = TxStm.Line - 1
>  'Set TxStm = Nothing
>  
>  myShape1.Delete
>  Set myShape1 = Nothing
>  DoEvents
>     
>  'シート最終行(改ページ行)入力
>  書込み最終行設定 = Cells(Rows.Count, 1).Row
>  Do
>    シート最終行入力 = Application.InputBox(Prompt:=拡張子 & "全データ行数は、" & CSV全データ行数 & "行有りました。" & _
>             vbCrLf & vbCrLf & "書込み最終行(改ページ行)を入力して下さい。", _
>             Title:="書込み最終行(改ページ行)入力", Default:=書込み最終行設定)
>    If シート最終行入力 = "False" Then
>      End
>    ElseIf Not (IsNumeric(シート最終行入力)) Then
>      MsgBox "数字を入力して下さい。", vbExclamation, "入力エラー"
>    ElseIf シート最終行入力 < 1 Or シート最終行入力 > 書込み最終行設定 Then
>      MsgBox "最終行(改ページ行)は、1〜" & 書込み最終行設定 & "の間までです。", vbExclamation, "入力エラー"
>    Else
>      書込み最終行設定 = Int(シート最終行入力)
>      Exit Do
>    End If
>  Loop
>
>  Do
>    Call 書込み開始位置設定(設定行, 設定列)
>    If 設定行 > 書込み最終行設定 Then
>      MsgBox "書込み最終行(改ページ行)" & "行より下行を" & vbCrLf & _
>         "書込み開始行とすることはできません。", vbExclamation, "開始位置設定エラー"
>    ElseIf CSV全データ行数 / (書込み最終行設定 - (設定行 - 1)) + Worksheets.Count - 1 > 50 Then
>      追加枚数 = CSV全データ行数 / (書込み最終行設定 - (設定行 - 1)) - 1
>      中止有無 = MsgBox("現在のシート枚数 " & Worksheets.Count & " 枚、追加されるシート枚数 " & 追加枚数 & " 枚。" & vbCrLf & _
>           vbCrLf & "全シート枚数が50枚を超えます。" & vbCrLf & vbCrLf & "書き始め行と書込み最終行(改シート行)を設定を変えますか?" & _
>           vbCrLf & vbCrLf & "見なおす場合は、一旦終了します。", vbExclamation + vbYesNo, "シート追加枚数警報")
>      If 中止有無 = vbYes Then
>       End
>      Else
>       Exit Do
>      End If
>    Else
>      Exit Do
>    End If
>  Loop
>  書始め行 = 設定行
>  行 = 書始め行
>  書始め列 = 設定列
>  
>  '初期TBL行数設定
>  書込み有効残数 = 書込み最終行設定 - (書始め行 - 1)
>  If 書込み有効残数 < 基本TBL行数 Then
>    基本TBL行数 = 書込み有効残数
>  ElseIf CSV全データ行数 <= 基本TBL行数 Then
>    基本TBL行数 = CSV全データ行数
>    終了flg = 1
>  End If
>  TBL行数 = 基本TBL行数
>  ReDim TBL(TBL行数, カンマ数 + 1)
>  
>  Application.DisplayStatusBar = True
>  'Application.ScreenUpdating = False
>  Application.Calculation = xlManual
>  
>  STime = Now()
>  Open オープンファイル For Input As #1
>  Do Until EOF(1)
>    処理CNT = 処理CNT + 1
>    TBL行CNT = TBL行CNT + 1
>    'Application.StatusBar = 拡張子 & "全データ " & CSV全データ行数 & "行中、" & Format(処理CNT, "000000") & "行目読込み中"
>   
>    'セル列方向TBL転記
>    If カンマ数 = 0 Then
>     Line Input #1, TBL(TBL行CNT, カンマ数 + 1)
>     'TBL(TBL行CNT, カンマ数 + 1) = ReadData
>    Else
>     For I = 1 To カンマ数 + 1
>       Input #1, TBL(TBL行CNT, I)
>     Next
>    End If
>   
>    If TBL行CNT = TBL行数 Or EOF(1) Then
>     Application.StatusBar = 拡張子 & "全データ " & CSV全データ行数 & "行中、" & Format(処理CNT, "000000") & "行目読込み後、" & _
>                 シート名 & "に " & 行 & バーお知らせ & TBL行数 & "行の書込み中"
>     With ActiveWorkbook.Worksheets(シート名).Range(Cells(行, 書始め列), Cells(行 + TBL行数 - 1, 書始め列 + カンマ数))
>       .ClearContents
>       .Value = TBL
>     End With
>     DoEvCnt = DoEvCnt + 1
>     'If DoEvCnt = 10 Then
>     '  DoEvents
>     '  DoEvCnt = 0
>     'End If
>     DoEvents
>     TBL行CNT = 0
>     行 = 行 + TBL行数
>     書込み有効残数 = 書込み有効残数 - TBL行数
>     If 終了flg = 1 Then
>       Exit Do
>     End If
>     If CSV全データ行数 - 処理CNT > 0 Then
>       '改ページ
>       If 書込み有効残数 = 0 Then
>        Call TBL使用シート増(基シート名, シート名, 増シート数, 設定行, 設定列)
>        DoEvents
>        行 = 書始め行
>        書込み有効残数 = 書込み最終行設定 - (書始め行 - 1)
>        If CSV全データ行数 - 処理CNT < TBL行数 Then
>          TBL行数 = CSV全データ行数 - 処理CNT
>        Else
>          TBL行数 = 基本TBL行数
>        End If
>       ElseIf 書込み有効残数 < TBL行数 Then
>        TBL行数 = 書込み有効残数
>       ElseIf CSV全データ行数 - 処理CNT < TBL行数 Then
>        TBL行数 = CSV全データ行数 - 処理CNT
>       Else
>        TBL行数 = 基本TBL行数
>       End If
>     Else
>       終了flg = 1
>     End If
>     ReDim TBL(TBL行数, カンマ数 + 1)
>    End If
>  Loop
>  Close #1
>  Erase TBL
>  ETime = Now()
>  'Application.ScreenUpdating = True
>  Application.Calculation = xlAutomatic
>  DoEvents
>  Set myShape2 = ActiveSheet.Shapes.AddTextEffect(msoTextEffect11, _
>         "処理終了しました ", "MS ゴシック", 48, msoFalse, msoFalse, 120, 100)
>  Application.StatusBar = 拡張子 & "全データ " & CSV全データ行数 & "行中、" & Format(処理CNT, "000000") & "行の処理終了しました。"
>  'MsgBox "クリックして下さい。"
>  'MsgBoxだと位置を変えられないので。
>  myShape2.Delete
>  Set myShape2 = Nothing
>  Application.DisplayStatusBar = False
>  MsgBox "TBL行数" & 基本TBL行数 & vbCrLf & STime & "-" & ETime & "=" & Format(ETime - STime, "hh:mm:ss")
>End Sub

【69523】Re:CSVの取込みについて
お礼  ぞう  - 11/7/27(水) 16:54 -

引用なし
パスワード
   Jakaさん追伸です。
ご紹介いただいたバイナリ除去ソフトを使ってみましたが、「バイナリは含まれていません」の表示が出てきました。
ますます不可解ですね。。。

▼ぞう さん:
>Jakaさん
>ご回答ありがとうございます。
>早速実行してみましたら、一列にズラッと出てきました。
>これでも規則正しければ使えるかなと思い元データと照らし合わせてみたのですが、表示されない数字などがあり、残念ながら解決できませんでした。
>でも大変感謝しております。本当にありがとうございました。
>

【69524】Re:CSVの取込みについて
発言  momo  - 11/7/27(水) 18:52 -

引用なし
パスワード
   ▼ぞう さん:
検証できませんが・・・こんなのではどうでしょうか?

Sub ReadFile()
Dim ReadBuf As String
Dim tbl   As Variant
With CreateObject("ADODB.Stream")
 .Type = 2
 .Charset = "UTF-8"
 .Open
 .LoadFromFile ("D:\test01.csv")
 ReadBuf = .ReadText(-1)
 .Close
End With
tbl = Split(ReadBuf, vbCrLf)
With Range("A1").Resize(UBound(tbl) + 1)
 .Value = Application.Transpose(tbl)
 .TextToColumns .Cells(1), xlDelimited, xlDoubleQuote, _
         False, False, False, True, False, False
End With
End Sub

【69525】Re:CSVの取込みについて
発言  n  - 11/7/27(水) 20:01 -

引用なし
パスワード
   >拡張子をtxt形式に直し、エクセルシートから「開く」をクリックして、テキストファイルウィザードでカンマにチェックを入れて完了を押すと正常に表示される..
..という事ですよね。
その作業をマクロ記録してみてもらえませんか。
OpenTextメソッドの引数Originがどう記録されるか、確認してみたいんですが。

それによっては
Dim x
x = Application.GetOpenFilename("csv,*.csv")
If VarType(x) = vbBoolean Then Exit Sub
Workbooks.OpenText Filename:=x, Origin:=10001, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Comma:=True
こんな感じでいけるハズ。

【69536】Re:CSVの取込みについて
お礼  ぞう  - 11/7/29(金) 10:36 -

引用なし
パスワード
   ご回答ありがとうございます。
返信が遅くなりましてすみませんでした。
やはり、通常のWindowsから出力されたデータであれば取込みは出来たのですが、Macから出力されたデータは何の反応もありませんでした。残念ですがありがとうございました。

▼momo さん:
>▼ぞう さん:
>検証できませんが・・・こんなのではどうでしょうか?
>
>Sub ReadFile()
>Dim ReadBuf As String
>Dim tbl   As Variant
>With CreateObject("ADODB.Stream")
> .Type = 2
> .Charset = "UTF-8"
> .Open
> .LoadFromFile ("D:\test01.csv")
> ReadBuf = .ReadText(-1)
> .Close
>End With
>tbl = Split(ReadBuf, vbCrLf)
>With Range("A1").Resize(UBound(tbl) + 1)
> .Value = Application.Transpose(tbl)
> .TextToColumns .Cells(1), xlDelimited, xlDoubleQuote, _
>         False, False, False, True, False, False
>End With
>End Sub

【69537】Re:CSVの取込みについて
お礼  ぞう  - 11/7/29(金) 10:39 -

引用なし
パスワード
   返信が遅くなりましてすみませんでした。
お教えいただいた内容は実は最初に試みてはみたのですが、別ウィンドウで立ち上がってしまうため、他の方法を探しておりました。ただ、Macから出力されたデータという事でなかなかうまくいかないため、この方法で何とか運用してみようかと思います。ありがとうございました。

▼n さん:
>>拡張子をtxt形式に直し、エクセルシートから「開く」をクリックして、テキストファイルウィザードでカンマにチェックを入れて完了を押すと正常に表示される..
>..という事ですよね。
>その作業をマクロ記録してみてもらえませんか。
>OpenTextメソッドの引数Originがどう記録されるか、確認してみたいんですが。
>
>それによっては
>Dim x
>x = Application.GetOpenFilename("csv,*.csv")
>If VarType(x) = vbBoolean Then Exit Sub
>Workbooks.OpenText Filename:=x, Origin:=10001, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Comma:=True
>こんな感じでいけるハズ。

【69539】Re:
お礼  ぞう  - 11/7/29(金) 11:22 -

引用なし
パスワード
   Jakaさんへ

別のサイトで変な書き込みがありまして、とんだご迷惑をお掛けしました。そちらのサイトで、外部データの取込みを教わりましたが、この方法で何とか運用でカバーさせようかと考えております。
本当にありがとうございました。

【69549】Re:
発言  解読不能  - 11/7/31(日) 18:30 -

引用なし
パスワード
   ▼ぞう さん:
>Jakaさんへ
>
>別のサイトで変な書き込みがありまして、とんだご迷惑をお掛けしました。そちらのサイトで、外部データの取込みを教わりましたが、この方法で何とか運用でカバーさせようかと考えております。
>本当にありがとうございました。

本当に変な書き込み、というか、変な誘導をする人がいますね。

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