2017-02-22 23 views
0

私のプログラムでは、インポートプログラムと一致するexcel関数への書き出しを作成しました。Excelにエクスポートするときの日付形式の変更

インポートプログラムでいくつかの妥当性チェックが実行されていますが、ExcelシートがMM/dd/yyyyとして書式設定されているため、それらの一部が失敗していますが、ほとんどがdd/MM/yyyyとして保存されています。

私の輸出プログラムを見た後、私はグリッドでエクスポートする前に、日付はすべて正しくdd/MM/yyyyと書かれているので、問題はここにはありません。

エクスポートされたExcelファイルを開くと、一部の日付がMM/dd/yyyyとして保存されていることがわかります。

私のPCの地域設定は正しく、UKに設定されており、列のExcel形式を確認した後でも、dd/MM/yyyyに設定されていることがわかります。

これは間違っている可能性がありますか?なぜ、輸出されるのが違うのですか?

グリッドに見られるような値(正しいフォーマットは - 、2016年1月6日のトップ2行 'レートワンスタート' を参照してください)ルーチン輸出で

enter image description here

コード

Dim formatRange As Excel.Range 
formatRange = xlWorksheet.Range("F2", "F99000") 
formatRange.NumberFormat = "dd/MM/yyyy" 

formatRange = xlWorksheet.Range("I1", "I99000") 
formatRange.NumberFormat = "dd/MM/yyyy" 

formatRange = xlWorksheet.Range("J1", "J99000") 
formatRange.NumberFormat = "dd/MM/yyyy" 

formatRange = xlWorksheet.Range("M1", "M99000") 
formatRange.NumberFormat = "dd/MM/yyyy" 

formatRange = xlWorksheet.Range("N1", "N99000") 
formatRange.NumberFormat = "dd/MM/yyyy" 

formatRange = xlWorksheet.Range("Q1", "Q99000") 
formatRange.NumberFormat = "dd/MM/yyyy" 

For k As Integer = 1 To dgvExport.Columns.Count 
    xlWorksheet.Cells(1, k) = dgvExport.Columns(k - 1).HeaderText 
Next 

Dim eStr As String = "" 
Dim nStr As String = "" 

Me.Cursor = Cursors.WaitCursor 

For i = 0 To dgvExport.RowCount - 1 
    For j = 0 To dgvExport.ColumnCount - 1 
    Try 
     eStr = Trim(dgvExport(j, i).Value) 
     nStr = eStr.Replace(vbCr, "").Replace(vbLf, "") 
     xlWorksheet.Cells(i + 2, j + 1) = nStr 
    Catch 
     xlWorksheet.Cells(i + 2, j + 1) = dgvExport(j, i).Value 
    End Try 

    Next 
Next 

私はエクスポートされたExcelファイル(日付のいくつかは、いくつかであるのに対し、/ MMをddをしている注目MM/DD)

enter image description here

+0

日付データ型として日付をExcelに渡すようにしてください。現在、私は思っている文字列として渡しており、Excel OMはアメリカの方を話すので、実際のExcel日付に変換するときにはm/d/yの順序が必要です。 – jkpieterse

+0

@jkpieterseどうすれば日付として渡すのですか?いくつかは正しいフォーマットであるが、すべてではないというのは奇妙だ。 – David

+1

@David奇妙ではない。 VBAはUS(MDY)形式を使用して変換しています。あなたが思った*正しい日付は実際には最初の2桁が12を超えるテキスト文字列です。他のものは間違って変換されています - あなたのデータを米国の設定に従ってVBAに変換するため、 '1-jun-16'と' 6-Jan-16'の最初の行を見てください。 'vb.net'の日付と文字列については不明です。 –

答えて

1

@jkpieterseが提案したように、私はちょうど実際の日付のデータ型として日付の値を渡す必要がありました。これを行うために、For Eachループを修正しました。

オリジナル:

For i = 0 To dgvExport.RowCount - 1 
    For j = 0 To dgvExport.ColumnCount - 1 
    Try 
     eStr = Trim(dgvExport(j, i).Value) 
     nStr = eStr.Replace(vbCr, "").Replace(vbLf, "") 
     xlWorksheet.Cells(i + 2, j + 1) = nStr 
    Catch 
     xlWorksheet.Cells(i + 2, j + 1) = dgvExport(j, i).Value 
    End Try 
    Next 
Next 

作業バージョン:

For i = 0 To dgvExport.RowCount - 1 
    For j = 0 To dgvExport.ColumnCount - 1 
    Try 
     If j <> 5 AndAlso j <> 8 AndAlso j <> 9 AndAlso j <> 12 AndAlso j <> 13 AndAlso j <> 16 Then 
     eStr = Trim(dgvExport(j, i).Value) 
     nStr = eStr.Replace(vbCr, "").Replace(vbLf, "") 
     xlWorksheet.Cells(i + 2, j + 1) = nStr 
     Else 
     xlWorksheet.Cells(i + 2, j + 1) = Convert.ToDateTime(dgvExport(j, i).Value).GetDateTimeFormats(Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat) 
     End If 
    Catch 
     xlWorksheet.Cells(i + 2, j + 1) = dgvExport(j, i).Value 
    End Try 

    Next 
Next 

評価されている現在の列のインデックスは、次にとしてエクスポート、日付が含まれている列のいずれでもない場合、これは、意味そうであれば、それを日付時刻に変換します。日付の時刻は、その形式がスレッドの現在のカルチャ形式と同じです。

これは夢のように機能しています。

+0

このエクスポートに多数のレコードが含まれている場合は、最初にバリアント配列にすべてのデータを入力してから、コードを1行のコードでワークシートに書き込むほうが速くなります。 – jkpieterse

関連する問題