2016-09-23 69 views
3

テーブルがあります。クライアントのジョブIDに応じて各クライアントジョブの情報を入力する必要があり、VBA内でvlookupを使用して情報を取得します。Excel VBA - セルに入力すると保存された値の形式が変更されます

Dim jobID as double, path as String, creationDate as date 
For i = 2 to 100 
    jobID = Sheet11.Cells(i, 1).Value 
    path = Application.WorksheetFunction.VLookup(jobID, Sheet9.Range("A:G"), 7, False) 
    creationDate = Application.WorksheetFunction.VLookup(jobID, Sheet9.Range("A:M"), 13, False) 
    Sheet11.Cells(i, 6).Value = creationDate 
    Sheet11.Cells(i, 8).Value = path 
Next i 

「180,28,60,91,40,178」または「179,143,141,142,178」とあり、「一般的な」フォーマットのようなシート9表情でパス。シート9の作成日は、「2015-11-12 11:44」のようになり、yyyy-mm-dd h:mmのカスタム日付形式を持ちます。しかし、記憶された値が図示のようにシート11に入力されたとき、パスのいくつかは数字に変換された。 「179,143,141,142,178」は「179143141142178」になりましたが、一部は私が意図したように文字列にとどまっていました。 "180,28,60,91,40,178"。ほとんどの日付も時間情報(h:mm情報)を失い、yyyy-mm-dd形式でsheet11に入力され、一部の形式は元の形式を維持しました。

誰かが日付のすべての情報を維持し、文字列として保存されたパスが数字になるのを防ぐのに役立つだろうか?

+0

を行うための最も簡単な方法です。 –

答えて

1

Excelは、データのエラーと思われるものを修復するために最善を尽くしています。

標準千セパレータは、3桁ごとにコンマを入れます。これは数字を表現する標準的な方法です。 179,143,141,142,178は実数として見ることができます。

Excelで180,28,60,91,40,178のような値が表示される場合、カンマで区切られた2桁の数字は数値を表す標準的な方法ではないため、テキストとして扱うようになっています。

セルの配置を手動で変更していない場合は、列を広げて値を確認します。デフォルトでテキスト値はセル内で左揃えになります。数値と日付(数値と見なされます)は、セル内でデフォルトで右揃えになります。これは、Excelが「何と思うか」が数字であり、それが「考えている」テキストであることを素早く表示します。

ターゲットパスを[一般]ではなくテキストとしてフォーマットします。時間の値を含むように、対象の日付を書式設定します。

Dim jobID as double, path as String, creationDate as date 
For i = 2 to 100 
    jobID = Sheet11.Cells(i, 1).Value 
    path = Application.WorksheetFunction.VLookup(jobID, Sheet9.Range("A:G"), 7, False) 
    creationDate = Application.WorksheetFunction.VLookup(jobID, Sheet9.Range("A:M"), 13, False) 
    Sheet11.Cells(i, 6).NUMBERFORMAT = "yyyy-mm-dd h:mm" 
    Sheet11.Cells(i, 6).Value = creationDate 
    Sheet11.Cells(i, 8).NUMBERFORMAT = "@" 
    Sheet11.Cells(i, 8).Value = path 
Next i 

補遺:

あなたの元の値がテキストと数字のマッシュアップ[あり得ることを私に発生しました。ソース行を特定し、それを使用してRange.Text propertyを取得する方が適切かもしれません。

Dim jobID as double, path as String, creationDate as date, rw as variant 
For i = 2 to 100 
    jobID = Sheet11.Cells(i, 1).Value 
    rw = Application.Match(jobID, Sheet9.Columns("A"), 0) 
    if not iserror(rw) then 
     path = Sheet9.Cells(rw, "G").TEXT 'this will return whatever is displayed; not the underlying value 
     creationDate = Sheet9.Cells(rw, "M").VALUE2 
     Sheet11.Cells(i, 6).NUMBERFORMAT = "yyyy-mm-dd h:mm" 
     Sheet11.Cells(i, 6).Value = creationDate 
     Sheet11.Cells(i, 8).NUMBERFORMAT = "@" 
     Sheet11.Cells(i, 8).Value = path 
    end if 
Next i 
2

あなたはここでセルの書式を設定したくない場合は、それをあなたが値上コピーする前に、先セルのNumberFormatを設定する必要があり

Sheet11.Cells(i, 8).Value = "'" & path 
+0

私は 'Chr(39)'が好きですが '' 'はできます。 – Jeeped

+0

Chr(39)は7文字です。 "'"は3:D –

+0

...であり、 'vbNullString'は12文字で、' '"は2ですが、 'vbNullString'はより速く実行されます。 – Jeeped

関連する問題