2017-08-19 17 views
2

日付をテキスト形式から日付形式(カスタム)dd/mm/yyyy hh:mmに変更したい。私はウェブサイト内のすべてのタイプの同様の質問を読んできましたが、何も私にとってはうまくいかないようです。変更を適用しても、日付はテキスト形式にとどまります。 VBAでDate関数を使用する方法はありますか?または、一般的に、どのように私は最終的にそれを動作させることができるかに関する任意のアイデア。私の日付は「TMS」という名前のExcelシートからの視覚化で、テキスト形式です。宛先シートは「トラッカー」です。日付はウェブサイトから「TMS」シートにインポートされるので、Excelの内部でフォーマットの変更を自動的に実行する必要があります。私のコードは以下の通りです。とても有難い!!VBAのテキスト形式から日付形式への日付

以下のコードは、日付形式が機能する固定コードですが、最初の行の値を他の行にコピーして貼り付けるだけで、すべての行に対してループを実行しません。言い換えれば、最初の行は完全に動作しますが、もう一方の行は正常に動作しません。

Sub Tracker() 

Sheets("TMS").Select 
lastrow = Range("B" & Rows.Count).End(xlUp).Row 
With Range("G2:G" & lastrow) 
If Not IsEmpty(Range("G2:G" & lastrow)) Then 
.value = .Parent.Evaluate("DATE(MID(" & .Address & ",7,4),MID(" & .Address & ",4,2),LEFT(" & .Address & ",2))+RIGHT(" & .Address & ",4)") 
End If 
End With 
Sheets("Tracker").Select 
lastrow = Range("B" & Rows.Count).End(xlUp).Row 
With Range("AG2:AG" & lastrow) 
.Formula = "=VLOOKUP(B2,TMS!B:G,6,FALSE)" 
.value = .value 
End With 

End Sub 
+0

あなたの日付は、ほとんどの場合、数字ではなくテキストとして保存されます。 B6に日付があると仮定すると '= istext(b6)'がtrueを返したらそれをExcelのシリアル日付に変換する必要があります。それが完了したら、カスタムフォーマットを適用して日付機能を使用することができます。 –

+0

それはテキストです!どのようにシリアル日付に変換できますか? –

+0

値を配列にコピーし、内容を削除し、セルの形式を日付として変更し、内容を配列から貼り付けます。すべての日付です。 – Tehscript

答えて

3

単にあなたWith Range("G2:G" & lastrow)部分に追加します。

.Value = .Parent.Evaluate("DATE(MID(" & .Address & ",7,4),MID(" & .Address & ",4,2),LEFT(" & .Address & ",2))+RIGHT(" & .Address & ",4)") 

これはワンステップでの数値のすべての文字列を変更する必要があります:)

EDIT
Evaluateは、この配列を返すように望んでいないとして方法は、我々は単にINDEX経由でそれを強制的に:

.Value = .Parent.Evaluate("INDEX(DATE(MID(" & .Address & ",7,4),MID(" & .Address & ",4,2),LEFT(" & .Address & ",2))+RIGHT(" & .Address & ",4),)") 
+0

素晴らしい1つのダーク。私がVBAコードを書くのは、私がエクセル式を行うのと同じくらい簡単です。それが1行の修正であるという事実を愛してください。 –

+0

@ForwardEd私はそれをセルに書いています - >メモ帳にコピー - > 'A1'を' '&.Address&" ' - に置き換えるだけで、' .Value = .Parent.Evaluate(...) 'と' D –

+0

素敵な小さなトリック –

0

は私があなたのワークシートが編成されているかわかりませんが、日付がSheets("TMS").Range("G2:G" & lastrow)にインポートさを考慮し、あなただけの.NumberFormat = "mm/dd/yyyy hh:mm"を使用して、書式を変更することはできません、あなたは完全なテキストとペーストを取り除く必要がありますそれらを日付として。

また、シートを選択しないでください。あなたのコードはこれに似たように見えるはずです。私が間違っていると思われる場合は、部品を修正してください。上記画像における

Sub Tracker() 
Dim lastrow As Long 
Dim arr() As Date 
With Sheets("TMS") 
    lastrow = .Range("B" & .Rows.Count).End(xlUp).Row 
    ReDim arr(lastrow) As Date 
    For i = 2 To lastrow 
     arr(i) = .Range("G" & i).Value 
    Next i 

    .Range("G2:G" & lastrow).Delete 
    For i = 2 To lastrow 
     .Range("G" & i) = arr(i) 
    Next i 
    .Range("G2:G" & lastrow).NumberFormat = "mm/dd/yyyy hh:mm" 
End With 
With Sheets("Tracker") 
    lastrow = .Range("B" & .Rows.Count).End(xlUp).Row 
    With .Range("AG2:AG" & lastrow) 
     .Formula = "=VLOOKUP(B2,TMS!B:G,6,FALSE)" 
     .NumberFormat = "mm/dd/yyyy hh:mm" 
    End With 
End With 
End Sub 
+0

システム設定「20/07/2017 01:30」に基づくとおそらくdatetimeと解釈できません。 'mm/dd/yyyy'を検索すると、月が20の場合はエラーが返されます。そのような場合は、会話は起こらず、文字列のままになります。それをセルに再入力すると、同じ結果で終了することがあります(月と日が間違った日付で終わる日付を除いて...)。 –

3

POC

、私は、バック時間を含む日付シリアルにテキストからの様々な構成要素に変換するために使用する数式を図示しています。 F2のフォーマットは、正しく表示するためのカスタムフォーマットとして設定されていました。

+0

私は、OPには異なる問題。 '' 20/08/2017'をセルに挿入して、あなたの答えに書かれているようにフォーマットを変更してみてください。私が間違っていれば私を正す? – Tehscript

+1

私の答えは、コードを書き直してテキスト形式の日付をシリアル日付形式に再フォーマットして残りのコードを使用してカスタム形式に再フォーマットするためのツールを与えることでした。最初の質問のコメントに記載されているように、Excel式を使用できるVBAコマンドがあります。だから、すべてのコードを書いているだけで、私は変換プロセスのステップを助けるかもしれない部分を提供していました。 @Tehscript –

+0

そして、私はもう一度悪い男になって、短い解決策を与えます:P –

0

このコードを試してください。

Sub Tracker() 
    Dim vDB, vT, vD 
    Dim i As Long 
    With Sheets("TMS") 
     lastrow = .Range("B" & Rows.Count).End(xlUp).Row 
     With .Range("G2:G" & lastrow) 
      vDB = .Value 
      If IsDate(vDB(1, 1)) Then 
      Else 
       For i = 1 To UBound(vDB, 1) 
        vT = Split(vDB(i, 1), " ") 
        vD = Split(vT(0), "/") 
        vDB(i, 1) = DateSerial(vD(2), vD(1), vD(0)) + Val(Trim(vT(1))) 
       Next i 
      End If 
      .Value = vDB 
      .NumberFormat = "mm/dd/yyyy hh:mm" 
     End With 
    End With 
    With Sheets("Tracker") 
     lastrow = .Range("B" & Rows.Count).End(xlUp).Row 
     With .Range("AG2:AG" & lastrow) 
      .Formula = "=VLOOKUP(B2,TMS!B:G,6,FALSE)" 
      .NumberFormat = "mm/dd/yyyy hh:mm" 
      .Value = .Value 
     End With 
    End With 
End Sub