1

Excelファイルのデータに対していくつかのアクションを実行し、そのすべてのデータをセミコロンで区切られたCSV /テキストファイルに変換するVBAコードがあります(以下のコード)。

今、必要なのは、既存のマクロに VBA コードを追加して列ヘッダー (「申請日」など) を見つけ、すべての日付を YYYY-MM-DD 形式に変換することだけです。この列の元の値には固定の日付形式がありません。

Public Sub ExportToCsvFile(FName As String, _
    Sep As String, SelectionOnly As Boolean, _
    AppendDataOnExistingFile As Boolean)

Dim WholeLine As String
Dim FNum As Integer
Dim RowNdx As Long
Dim ColNdx As Integer
Dim FirstRow As Long
Dim LastRow As Long
Dim FirstCol As Integer
Dim LastCol As Integer
Dim CellValue As String


Application.ScreenUpdating = False
On Error GoTo EndMacro:
FNum = FreeFile

If SelectionOnly = True Then
    With Selection
        FirstRow = .Cells(1).Row
        FirstCol = .Cells(1).Column
        LastRow = .Cells(.Cells.Count).Row
        LastCol = .Cells(.Cells.Count).Column
    End With
Else
    With ActiveSheet.UsedRange
        FirstRow = .Cells(1).Row
        FirstCol = .Cells(1).Column
        LastRow = .Cells(.Cells.Count).Row
        LastCol = .Cells(.Cells.Count).Column
    End With
End If

If AppendDataOnExistingFile = True Then
    Open FName For Append Access Write As #FNum
Else
    Open FName For Output Access Write As #FNum
End If

For RowNdx = FirstRow To LastRow
    WholeLine = ""
    For ColNdx = FirstCol To LastCol
        If Cells(RowNdx, ColNdx).Value = "" Then
            CellValue = Chr(34) & Chr(34)
        Else
           CellValue = Cells(RowNdx, ColNdx).Value
           CellValue = Replace(Replace(CellValue, Chr(150), Chr(45)), Chr(151), Chr(45))
           CellValue = Replace(Replace(CellValue, Chr(60), Chr(60) & Chr(32)), Chr(10), "<br />")
           CellValue = Chr(34) & Replace(CellValue, Chr(34), Chr(34) & Chr(34)) & Chr(34)
        End If
        WholeLine = WholeLine & CellValue & Sep
    Next ColNdx
    WholeLine = Left(WholeLine, Len(WholeLine) - Len(Sep))
    Print #FNum, WholeLine
Next RowNdx

EndMacro:
On Error GoTo 0
Application.ScreenUpdating = True
Close #FNum

End Sub

Sub ExportToSemiColonCsv()
    Dim FileName As Variant
    Dim Sep As String
    FileName = Application.GetSaveAsFilename(InitialFileName:=vbNullString, FileFilter:="CSV Files (*.csv),*.csv")
    If FileName = False Then
        Exit Sub
    End If

    ExportToCsvFile FName:=CStr(FileName), Sep:=";", _
       SelectionOnly:=False, AppendDataOnExistingFile:=True
End Sub

実際に正しい方向に向けることができる古い質問は見つかりませんでした。前もって感謝します。

更新 1: 既に FORMAT(CellValue,"yyyy-mm-dd") を試しましたが成功しませんでした。

更新 2: また、文字列変数のセル値を読み取ってから、次のように日付型に変換し直しました。

If IsDate(CellValue) Then
      Dim str1 As String
      str1 = Cells(RowNdx, ColNdx).Value
      Dim DateValue As Date
      DateValue = CDate(str1)
      CellValue = Format(DateValue, "yyyy-mm-dd")
End If

実際、コード to が実行されていないようです (ただし、コンパイル エラーはありません)。

更新 3:.NumberFormat最後に、 と を使用し て解決でき.Textます。最終的なコードと制限については、以下の私の回答を参照してください。

4

2 に答える 2

1

さて、ついに、 と を使用して問題を解決することができましNumberFormat.Text。@Ed Heywood-Lonsdale の忍耐力に感謝しますが、あまり役に立ちませんでした。今私のコードは次のようになります:

Public Sub ExportToCsvFile(FName As String, _
    Sep As String, SelectionOnly As Boolean, _
    AppendDataOnExistingFile As Boolean)

Dim WholeLine As String
Dim FNum As Integer
Dim RowNdx As Long
Dim ColNdx As Integer
Dim FirstRow As Long
Dim LastRow As Long
Dim FirstCol As Integer
Dim LastCol As Integer
Dim CellValue As String


Application.ScreenUpdating = False
On Error GoTo EndMacro:
FNum = FreeFile

If SelectionOnly = True Then
    With Selection
        FirstRow = .Cells(1).Row
        FirstCol = .Cells(1).Column
        LastRow = .Cells(.Cells.Count).Row
        LastCol = .Cells(.Cells.Count).Column
    End With
Else
    With ActiveSheet.UsedRange
        FirstRow = .Cells(1).Row
        FirstCol = .Cells(1).Column
        LastRow = .Cells(.Cells.Count).Row
        LastCol = .Cells(.Cells.Count).Column
    End With
End If

If AppendDataOnExistingFile = True Then
    Open FName For Append Access Write As #FNum
Else
    Open FName For Output Access Write As #FNum
End If

For RowNdx = FirstRow To LastRow
    WholeLine = ""
    For ColNdx = FirstCol To LastCol

        If Cells(RowNdx, ColNdx).Value = "" Then
            CellValue = Chr(34) & Chr(34)
        Else
           CellValue = Cells(RowNdx, ColNdx).Value
            If IsDate(CellValue) Then
                Cells(RowNdx, ColNdx).NumberFormat = "yyyy-mm-dd"
                CellValue = Cells(RowNdx, ColNdx).Text
            End If
           CellValue = Replace(Replace(CellValue, Chr(150), Chr(45)), Chr(151), Chr(45))
           CellValue = Replace(Replace(CellValue, Chr(60), Chr(60) & Chr(32)), Chr(10), "<br />")
           CellValue = Chr(34) & Replace(CellValue, Chr(34), Chr(34) & Chr(34)) & Chr(34)
        End If

        WholeLine = WholeLine & CellValue & Sep
    Next ColNdx
    WholeLine = Left(WholeLine, Len(WholeLine) - Len(Sep))
    Print #FNum, WholeLine
Next RowNdx

EndMacro:
On Error GoTo 0
Application.ScreenUpdating = True
Close #FNum

End Sub

Sub ExportToSemiColonCsv()
    Dim FileName As Variant
    Dim Sep As String
    FileName = Application.GetSaveAsFilename(InitialFileName:=vbNullString, FileFilter:="CSV Files (*.csv),*.csv")
    If FileName = False Then
        Exit Sub
    End If
    ExportToCsvFile FName:=CStr(FileName), Sep:=";", _
       SelectionOnly:=False, AppendDataOnExistingFile:=True
End Sub

このマクロにはまだ 1 つの問題があります。1900 年より前の日付を処理できないことです。これは、Excel の不完全な意図的なバグです。VBA は負の日付値をサポートしているため、おそらくマクロ内でこれを行う方法を見つけるでしょう。したがって、0100 から 1900 までの日付もサポートされます。

上記の私のマクロが誰かに役立つことを願っています。

于 2013-07-01T06:37:18.533 に答える
0

多分何か...

Next RowNdx

for i = 0 to 25
    column = chr(64 + i)
    header = Range(column & "1")
    if header = "Application Data" then
        columns(column).EntireColumn.NumberFormat = "yyyy-mm-dd;@"
        msgbox "Column " & column & "Has been formatted"
    end if
next

EndMacro:

列 AA 以降を検索する場合は、2 番目のループが必要で、文字列を連結します。(例: 列 = chr(64+i) & chr(64+j))

于 2013-06-28T08:21:17.320 に答える