1

ワークシート全体またはある範囲のデータをあるワークブックから別のワークブックにコピーしようとしています。データを含むすべてのセルを選択し、新しく作成したワークシートに貼り付けることで、これを手動で正常に行うことができます (日付形式は維持されます)。ただし、VBA を使用してこれを実行しようとすると、12 日を超える日付はすべてテキスト [米国 (m/dd/yyyy)/オーストラリア (dd/mm/yyyy) 形式の変更] に変換されます。最初にセルを米国形式の日付にフォーマットしようとしましたが、これは役に立ちません。何か提案はありますか?

参考までに - ソース データは VBA によって開かれた CSV ファイルからのものです - 日付の値はテキスト (例: "2/08/2013" または "31/07/2013") で、開くときに自動的に日付に変換されます (IsNumber = True およびIsText = False)。

開いている CSV は次のようになります (3000 奇数行のサンプル): 「日付」フィールドと「最終更新」フィールドは dd/mm/yyyy hh:mm 形式であることに注意してください。

Id          Title     Division  Status  Date                Last update
REQ:7619    Job Details ICTIS   InProg  31/07/2013 13:03    6/08/2013 15:51
REQ:7617    Job Details ICTIS   InProg  31/07/2013 12:06    2/08/2013 11:34
REQ:6994    Job Details ICTIS   Open    31/07/2013 12:05    31/07/2013 12:05
REQ:7613    Job Details MNHD    User    31/07/2013 12:01    1/08/2013 15:59
INC:79210   Job Details ICTIS   Open    31/07/2013 12:00    31/07/2013 12:00

コードの簡単な抜粋:

'Select all Data Cells
Sheets(1).Cells(1, 1).Activate
ActiveCell.SpecialCells(xlLastCell).Select
LastRow = ActiveCell.Row

'Format Date Fields to avoid automatic translation issue
'This does not help problem... so commented out
'Columns("M:M").Select
'Selection.NumberFormat = "m/d/yyyy"

'Select all data in sheet and copy
range("A2:" & LastCol & LastRow).Select
selection.Copy

'Rest of code moves to previous sheet and copies into cell A8

上記のコードを実行した後の同じファイル。day>12 の日付は、day<=12 の日付とは異なる方法で処理されることに注意してください。2013 年 7 月 31 日には「PM」が追加され、2013 年 6 月 8 日と 2013 年 2 月 8 日は日と月が入れ替わっています。

Id          Title     Division  Status  Date                Last update
REQ:7619    Job Details ICTIS   In Progress 31/07/2013 1:03:49 PM   8/06/2013 15:51
REQ:7617    Job Details ICTIS   In Progress 31/07/2013 12:06:31 PM  8/02/2013 11:34
REQ:6994    Job Details ICTIS   Open    31/07/2013 12:05:50 PM  31/07/2013 12:05:50 PM
REQ:7613    Job Details MNHD    With User   31/07/2013 12:01:46 PM  8/01/2013 15:59
INC:79210   Job Details ICTIS   Open    31/07/2013 12:00:52 PM  31/07/2013 12:00:52 PM

私の簡単な修正は、コードを 2 つの部分に分割することでした。MsgBox によってプロンプトが表示された手動のコピー/貼り付けです。あまりエレガントではありません!! そしてエラーになりやすい。

4

3 に答える 3

3

私は過去にまったく同じ問題を抱えていました。マクロを使用して CSV を開いたときに問題が発生することを確認できます。VBA Excel を実行すると、デフォルトで米国の日付形式を使用して開きますが、CSV を手動で開くと、ローカルの日付形式が使用されます。何らかの回避策を必要としない簡単な修正方法は、次のようにローカルの日付形式を使用して CSV を開くように VBA に指示することです。

私の壊れたコードの関連行:

Set wbkData = Workbooks.Open(strDataDir & strDataFName)

そして固定回線:

Set wbkData = Workbooks.Open(strDataDir & strDataFName, local:=True)
于 2016-04-28T03:13:29.700 に答える
0

Excel は、既定のシステム形式を使用して、セルに日付を入力したときに日付を解釈する方法を決定します。米国では、「3/2/2013」と入力すると、3 月 2 日と解釈されます。オーストラリアでは、2 月 3 日と同じキーストロークが解釈されます。セルの書式設定を変更しても、発見したように違いはありません。

システム形式と互換性のない日付をコピーすると、テキストに変換されます (たとえば、月が 20 です)。CSVファイルを開いた時点で実際に問題が発生していると思います。

問題がコピー操作にある場合は、操作する前に日付をテキストに変換できます。=Text(a1, "m/d/yyyy")

編集: ワークブックの 1 つは米国形式で、もう 1 つはオーストラリア形式である必要があります。何が起こっているのかについていくつかのアイデアがありますが、確かなことは言えません。両方のブックが同じ Excel インスタンスで開かれていることを確認してください。両方のワークブックがコードによって開かれている場合、問題はありません。タスク マネージャーのプロセス リストを調べて、Excel.exe が 1 回だけ表示されるようにします。

また、あなたのコードが誤って再計算を引き起こし、何らかの問題を引き起こす可能性があるかどうかもわかりません. このコードはそれを修正する必要があります:

'get source worksheet
Dim ws As Worksheet
Set ws = Sheets(1)
ws.Activate

'copy all but first row
Call ws.UsedRange.Offset(1, 0).Resize(rowsize:=ws.UsedRange.Rows.Count - 1).Copy

'activate second sheet
Dim wsDest As Worksheet
Set wsDest = Sheets(2)
wsDest.Activate
wsDest.Paste

'de-activate copy mode
Application.CutCopyMode = False

また、コード エディター ウィンドウを使用してコードをステップ実行し (F8 キーを押す)、どの行がデータの変更を引き起こしているかを正確に確認できます。

于 2013-08-05T08:46:54.030 に答える
0

この回答では、説明したエラーを達成する2つの方法について説明します。これらの方法のいずれかが実行していることと一致する場合、コードを修正してエラーを回避できる場合があります。それでも不十分な場合は、解決策を提案する前に、コードをさらに確認する必要があります。回答に完全なコードを追加するか、プロフィールのアドレスを使用してメールで送信することができます。

エラーを複製するために多くの実験を行いましたが、2 つの方法で日付をミドル エンディアン形式に変換できるようになりました。(ミドル エンディアンは、スモール エンディアンおよびビッグ エンディアンと呼ばれる d/m/y および y/m/d 形式の m/d/y 日付形式の学術的な記述として好まれているようです。)

根本的な問題は、Excel には同じ効果を得るために常にいくつかの方法があるということです。ここでの効果は、文字列から日付への変換です。

アプローチ 1 は、国コードを使用してローカルの日付形式を決定することです。現地の日付形式が d/m/y である国に住んでいる場合、この方法では「2013 年 6 月 8 日」は「2013 年 8 月 6 日」に変換されます。

アプローチ 2 は、英国、オーストラリア、および他の多くの国で "*dd/mm/yyyy" である Excel の既定の日付形式を使用することですが、"*dd/mm/yyyy" に対応する NumberFormat を VBA に要求すると、"m" が与えられます。 /d/yyyy」。アプローチ 2 は、「2013 年 6 月 8 日」を「2013 年 6 月 8 日」に変換します。これは私の質問で詳しく説明されています: .NumberFormat は、日付と時刻で間違った値を返すことがあります

CSV ファイルをインポートし、日付/時刻列の形式を「一般」に指定すると、アプローチ 1 が使用されます。その日付を破損するには、次のようなコードで移動する必要があります。

Dim CopyDate As String
CopyDate = Cell1.Value
Cell2.Value = CopyDate          ' This uses Approach 2

CSV ファイルをインポートし、日付/時刻列の形式を「テキスト」に指定すると、値はテキストのままになります。Excel にテキストを評価させるメソッドを使用してそのテキスト値を移動すると、アプローチ 2 を使用して日付に変換されます。

お役に立てれば。

于 2013-08-10T13:12:01.343 に答える