LoginSignup
8
9

More than 5 years have passed since last update.

ExcelファイルをCSV出力する

Last updated at Posted at 2014-04-17

ExcelファイルをCSV出力する

  • OracleにデータをローディングするうえでCSVに変換する必要があったので書いた
  • Excelで「名前を付けて保存」でCSVで保存することはできるけど、書式設定されたセルは、生のデータではなく書式に合わせて表示されている形式のままCSVで保存されるため、書式をクリアする必要があった
  • ので、VBAでビャッとCSV化する処理を作成する

* シンタクスハイライトはvbaとかvbとかvbsとか、MS系は非対応なんですね↓
* vba苦手なので、お作法とかあったら教えてほしい。。

vba

Sub メイン処理()

    ' 定数定義
    Const File_Full_Path_Cell As String = "D2" ' エクセルのパスを入力したセル
    Const Export_File_Path_Cell As String = "D4"   ' 出力先パスを入力したセル
    Const Data_File_Name_Cell As String = "D5" ' 出力ファイル名を入力したセル

    ' 変数定義
    Dim Return_Code As Integer       ' 戻り値
    Dim File_Full_Path As String ' パス
    Dim Export_File_Path As String   ' 出力先パス
    Dim Data_File_Name As String ' ファイル名

    ' このブックのオブジェクトを生成
    Dim objSH As Worksheet
    Set objSH = ThisWorkbook.ActiveSheet

    ' このブックのセル情報を取得
    File_Full_Path = objSH.Range(File_Full_Path_Cell)
    Export_File_Path = objSH.Range(Export_File_Path_Cell)
    Data_File_Name = objSH.Range(Data_File_Name_Cell)

    '''''''''''''''''''''''
    ' 処理開始
    '''''''''''''''''''''''

    ' ファイルのオープン
    MsgBox File_Full_Path_Cell & ":" & vbCrLf & File_Full_Path & vbCrLf & "を処理します。"
    Return_Code = ファイルオープン(File_Full_Path)

    ' エクセルデータの書式変換
    If Return_Code = 0 Then
        Return_Code = 書式変更()
    End If

    ' CSV形式にエクスポート
    If Return_Code = 0 Then
        Return_Code = CSVエクスポート(Export_File_Path & "\" & Data_File_Name)
    End If


    '''''''''''''''''''''''
    ' 終了処理
    '''''''''''''''''''''''

    If Return_Code = 0 Then
        MsgBox "処理が正常終了しました。"
    Else
        MsgBox "処理を終了します。処理中にエラーまたは取り消し処理が発生しています。"
    End If

End Sub





Function 書式変更() As Integer
'
' Excel上で%表示されている列を、ただの値として表示するようにする
'

    ''''''''''''
    ' 定数定義
    ''''''''''''
    Const Market_Size As String = "F"         ' マーケットサイズ列
    Const Market_Share As String = "G"        ' マーケットシェア列

    ' 書式変換処理
    Columns(Market_Size & ":" & Market_Size).Select
    Selection.NumberFormatLocal = "G/標準"

    Columns(Market_Share & ":" & Market_Share).Select
    Selection.NumberFormatLocal = "G/標準"


    書式変更 = 0

End Function


Function ファイルオープン(Path As String) As String
'
' 指定したパスにあるファイルをオープン
'

    ' 変数定義
    Dim Return_Code As Integer
    Dim pos As Long
    Dim Path_Name As String
    Dim File_Name As String
    Dim Work_Book As Workbook


    ' 変数初期化
    Return_Code = 0

    ' ファイル名取得
    pos = InStrRev(Path, "\")
    Path_Name = Left(Path, pos)
    File_Name = Mid(Path, pos + 1)


    ' ファイルが既に開いているかチェック
    For Each Work_Book In Workbooks
        If Work_Book.Name = File_Name Then
            MsgBox File_Name & vbCrLf & "はすでに開いています。"
            Return_Code = 9
        End If
    Next Work_Book

    ' ファイル存在チェック
    If Dir(Path) = "" Then
        MsgBox Path & vbCrLf & "が存在しません。"
        Return_Code = 9
    End If

    ' ファイルオープン
    If Return_Code = 0 Then
        Workbooks.Open Path
    End If

    ' リターン
    ファイルオープン = Return_Code


End Function


Function CSVエクスポート(File_Name As String) As Integer
'
' 指定したパスにあるファイルをCSV形式で保存
'

    ' 定数定義
    Const Extension As String = ".csv" ' 拡張子

    ' 変数定義
    Dim Return_Code As Integer
    Dim File_Name_With_Extension As String ' 拡張子込のファイルフルパス

    ' 変数初期化
    Return_Code = 0

    ' 出力ファイル名を生成
    File_Name_With_Extension = File_Name & Extension

    ' 下記保存時に、上書き確認メッセージで「いいえ」を選択した際にアベンドしないようにする
    On Error Resume Next

    ' ファイル作成
    Sheets(1).Select
    ActiveWorkbook.SaveAs FileName:=File_Name_With_Extension, FileFormat:=xlCSV

    ' 上書き確認メッセージで「いいえ」を選択した
    If Err.Number > 0 Then
        MsgBox "保存されませんでした"

        ' 開いたエクセルを閉じる
        Application.DisplayAlerts = False
        ActiveWindow.Close
        Application.DisplayAlerts = True

        Return_Code = 9
    End If

    ' エラーハンドリングの設定を初期化(エラー時はアベンドするように戻す)
    On Error GoTo 0

    If Return_Code = 0 Then
        ' ファイルは閉じてしまう
        Application.DisplayAlerts = False
        ActiveWindow.Close
        Application.DisplayAlerts = True
    End If

    CSVエクスポート = Return_Code

End Function
8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9