Excel VBA質問箱 IV

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

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


26766 / 76732 ←次へ | 前へ→

【55295】Re:テキストファイル(CSV)に変換
回答  Hirofumi  - 08/4/25(金) 23:16 -

引用なし
パスワード
   こんなのでも

Option Explicit

Public Sub OutPutCsv()

  Dim vntFileName As Variant
  Dim rngTarget As Range
  Dim strPrompt As String
  Dim strTitle As String
  
  strPrompt = "Csv出力するRangeを選択して下さい"
  strTitle = "Csv出力"
  
  On Error GoTo ErrorHandler
  
  '選択範囲の取得
  Set rngTarget = ActiveSheet.UsedRange
  
  'Default出力名の設定
  vntFileName = ThisWorkbook.Path & "\" & "TestFile"
  
  '出力名を取得
  If Not GetWriteFile(vntFileName, ThisWorkbook.Path) Then
    GoTo ErrorHandler
  End If
  
  'ファイルに出力
  CsvWrite vntFileName, rngTarget, vbCr
  
  MsgBox "処理が終了しました", vbInformation
  
ErrorHandler:

  Set rngTarget = Nothing
  
End Sub

Private Sub CsvWrite(ByVal strFileName As String, _
           ByVal rngTarget As Range, _
          Optional strRetCode As String = vbCrLf)

  Dim dfn As Integer
  Dim i As Long
  Dim j As Long
  Dim strBuf As String
  Dim lngCount As Long
  Dim vntField As Variant
    
  '空きファイル番号を取得します
  dfn = FreeFile
  '出力ファイルをOpenします
  Open strFileName For Output As dfn
    
  With rngTarget
    lngCount = .Columns.Count
    For i = 1 To .Rows.Count
      '1行分のDataをシートから読みこむ
      vntField = .Item(i, 1).Resize(, lngCount)
      '出力1レコード作成
      strBuf = ComposeLine(vntField, "@") & strRetCode
      '1レコード書き出し
      Print #dfn, strBuf;
    Next i
  End With
  
  '出力ファイルを閉じる
  Close #dfn
  
End Sub

Private Function ComposeLine(vntField As Variant, _
            Optional strDelim As String = ",") As String
'  レコード作成

  Dim i As Long
  Dim strResult As String
  Dim strField As String
  Dim lngFieldEnd As Long
  Dim vntFieldTmp As Variant
  
  'もし、データが複数なら
  If VarType(vntField) = vbArray + vbVariant Then
    vntFieldTmp = vntField
  Else
    ReDim vntFieldTmp(1 To 1, 1 To 1)
    vntFieldTmp(1, 1) = vntField
  End If
  'データ数の取得
  lngFieldEnd = UBound(vntFieldTmp, 2)
  'データ数繰り返し
  For i = 1 To lngFieldEnd
    'Csv1出力の場合
    strField = PrepareCsv1Field(vntFieldTmp(1, i))
    '結果変数にフィール文字列を加算
    strResult = strResult & strField
    'データカウントがデータ数未満の場合
    If i < lngFieldEnd Then
      '区切り文字を結果変数に加算
      strResult = strResult & strDelim
    End If
  Next i
  
  ComposeLine = strResult
  
End Function

Private Function PrepareCsv1Field(ByVal vntValue As Variant) As String

' Csv1出力形式の調整

  Dim i As Long
  Dim lngPos As Long
  Const strQuot As String = """"
  
  '引数の変数内部形式に就いて
  Select Case VarType(vntValue)
    Case vbString  '文字列型
      'ダブルクォーツの処理
      i = 1
      lngPos = InStr(i, vntValue, strQuot, vbBinaryCompare)
      Do Until lngPos = 0
        vntValue = Left(vntValue, lngPos) & strQuot & Mid(vntValue, lngPos + 1)
        i = lngPos + 2
        lngPos = InStr(i, vntValue, strQuot, vbBinaryCompare)
      Loop
      '両端にダブルクォーツを付加
      vntValue = strQuot & vntValue & strQuot
    Case vbDate   '日付型
      '日付が時分秒を持つなら
      If TimeValue(vntValue) > 0 Then
        vntValue = Format(vntValue, "yyyy/mm/dd h:mm:ss")
      Else
        vntValue = Format(vntValue, "yyyy/mm/dd")
      End If
  End Select
  
  PrepareCsv1Field = CStr(vntValue)

End Function

Private Function GetWriteFile(vntFileName As Variant, _
            Optional strFilePath As String) As Boolean

  Dim strFilter As String
  Dim strInitialFile As String
  
  'フィルタ文字列を作成
  strFilter = "CSV File (*.csv),*.csv," _
        & "Text File (*.txt),*.txt"
  '既定値のファイル名を設定
  strInitialFile = vntFileName
  '読み込むファイルの有るフォルダを指定
  If strFilePath <> "" Then
    'ファイルを開くダイアログ表示ホルダに移動
    ChDrive Left(strFilePath, 1)
    ChDir strFilePath
  End If
  '「ファイルを保存」ダイアログを表示
  vntFileName _
    = Application.GetSaveAsFilename(vntFileName, strFilter, 2)
  If vntFileName = False Then
    Exit Function
  End If

  GetWriteFile = True
  
End Function
1 hits

【55281】テキストファイル(CSV)に変換 KOCCI 08/4/25(金) 15:53 質問
【55283】Re:テキストファイル(CSV)に変換 ハチ 08/4/25(金) 16:12 発言
【55284】Re:テキストファイル(CSV)に変換 neptune 08/4/25(金) 16:18 発言
【55285】Re:テキストファイル(CSV)に変換 テト 08/4/25(金) 16:33 回答
【55289】Re:テキストファイル(CSV)に変換 KOCCI 08/4/25(金) 18:38 発言
【55290】Re:テキストファイル(CSV)に変換 VBWASURETA 08/4/25(金) 19:36 発言
【55288】Re:テキストファイル(CSV)に変換 Yuki 08/4/25(金) 17:06 発言
【55295】Re:テキストファイル(CSV)に変換 Hirofumi 08/4/25(金) 23:16 回答
【55327】Re:テキストファイル(CSV)に変換 KOCCI 08/4/28(月) 9:05 発言
【55473】Re:テキストファイル(CSV)に変換 kanabun 08/5/6(火) 9:33 回答
【55486】Re:テキストファイル(CSV)に変換 KOCCI 08/5/7(水) 12:42 質問
【55488】Re:テキストファイル(CSV)に変換 neptune 08/5/7(水) 13:22 発言
【55489】Re:テキストファイル(CSV)に変換 kanabun 08/5/7(水) 13:48 回答
【55491】Re:テキストファイル(CSV)に変換 kanabun 08/5/7(水) 14:52 発言
【55492】Re:テキストファイル(CSV)に変換 neptune 08/5/7(水) 15:30 発言
【55493】Re:テキストファイル(CSV)に変換 kanabun 08/5/7(水) 16:36 お礼
【55496】Re:テキストファイル(CSV)に変換 neptune 08/5/7(水) 22:09 お礼

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