2016-11-29 8 views
0

私はExcel VBAの初心者です。私は最近、私はCSVファイルをインポートできるように、ボタンをクリックするだけで(必要なオプションを選択する)私の個人的なワークブックに次のマクロをインストールするために管理:マクロを使用してCSVをインポートするときに、一貫性のない日付書式設定

Sub OpenTextFile() 

    filetoopen = Application.GetOpenFilename("Text Files (*.txt;*.csv), *.txt;*.csv") 
    If filetoopen = Null Or filetoopen = Empty Then Exit Sub 

    Workbooks.OpenText Filename:=filetoopen, _ 
    Origin:=65001, DataType:=xlDelimited, Comma:=True 

End Sub 

それは動作します。しかし、それは一貫して機能しません。私はさまざまなCSVファイル(すべてはISO 8601の日付システムであらかじめフォーマットされています)に使用しますが、結果は異なります。その中には日出力がDD/MM/YYYY hh:mmであるものもありますが、それ以外の場合はわかりません(00:00,0、または50:00,0など)。私は手動で行の内容を選択し、長い日付にフォーマットを変更することができますので、少なくとも私はデータがテキストではなく日付として認識されると確信しています。

日付の形式がすべて同じであることを確認するにはどうすればよいですか?これは何に依存していますか?

ありがとうございます!

+0

問題のようなサウンドは、コンテンツまたはインポートではなく、書式設定によるものです。日付の列に日付書式を適用するようにマクロを拡張することができます。しかし、そうするには、これらを特定するシステムが必要です。すべての日付列にフィールド名に*日付*が含まれていますか? –

答えて

2

Windowsのローカライズ(デフォルトの区切り文字、日付と数字の形式)は扱いにくい可能性があるため、さまざまな日付形式がExcelにインポートされると悪名高くなります。

1つのファイルをインポートするだけで、Windowsのローカリゼーションを混乱させないでください。

繰り返しCSV-ファイルをインポートすると、私は次のようなアプローチを使用します。

  1. 私はセットアップ問題のCSV-ファイルのschema.ini -fileを。さらに情報のためthisを参照してください

  2. Iのいずれか

    • クエリシンプルSELECT *簡単な前処理を可能にし、SQLおよびADODBとCSVファイル、(レコードをフィルタリング、列の並べ替え、...) 。結果として得られるADODB.Recordsetをワークブックに出力することができます。

    • ブックのリンクテーブルをADODB.Connectionに設定しました。データは簡単なマクロまたは右クリックで更新できます。

いずれかの方法:IMO schema.ini -filesでの作業は

  • は、あなたのExcelワークブックまたはVBAコードを調整することなく、任意のタのデータと数フォーマットを処理することを可能にする次のような利点があります
  • シンプルで透明な構造、可読性
  • 設定の1つのセット。それぞれのExcelシートまたはデータベースは、同じschema.ini-ファイルを使用してデータを処理できます。

編集:これは出発点を提供する可能性があります。

  1. あなたは
  2. メモ帳で開いて、あなたのCSVファイル保存フォルダにschema.iniという名前の新しいテキストファイルを作成(またはより良い:メモ帳を++)、それ

    [yourfile.csv] 
    CharacterSet = ANSI 
    ColNameHeader = FALSE 
    Format = Delimited(;) 
    DateFormat = "DD.MM.YYYY" 
    DateTimeFormat = "DD.MM.YYYY hh:nn,ss" 
    Col1 = yourdatefield DateTime 
    Col2 = somelongfield Long 
    
  3. にこれをペーストした後、次の調整読書enter link description here

    • ファイル名
    • 形式(デリミタは何ですか、または固定されています)
    • DateFormatおよび/またはDateTimeFormat。あなたの希望の列ヘッダーと列データ型の共通のmm
    • の代わりに、分がnnであることを理解してください。これにはColNameHeader = FALSEが必要です。
  4. SQLステートメントを実行してADOレコードセットを返すことができるVBAでADO接続を設定します。あなたには、いくつかの混合時間小数書き込みを述べた(50:00,0):

  5. は、レコードセット

注意してこれ

SELECT * FROM [Text;DATABASE=C:\Users\yourFolder].yourfile.csv

  • 作品のようなSQL文を実行します。カラム内の任意の数字が時間単位を参照する限り、例えば、秒または分の場合、フィールドをDateTime -fieldと宣言することに問題はありません。解決あなたのインポート、SQLで00:00,50のようなものではなく、50秒の半分分を意味している場合、FORMAT()のようなSQLのものでそれを変換し、その後、テキストとしてそれを読むために必要とされるかもしれない、LEFT()

  • +0

    入力いただきありがとうございます。しかし、私は最適なワークフローを探しているわけではありません。インポート時にVBAを使用して日付フォーマットを処理する可能性について具体的に質問しています。 「データソースとファイル接続」は私の最初の本能的なアプローチでした。しかし、私が必要とするのは、私の必要なことは、私の部署の同僚に「ねえ、リボンにインストールしたこのボタンをクリックして、データのインポート - >インポート - >テキスト - >区切り文字&UTF8->カンマ "です。 Excelを教えたくないので、時間を節約するのに役立ちます。 –

    +0

    完全に有効なポイントは、関連付けることができます! –

    0

    :しかし

    :問題はExcelではなく、私にCSVファイルを提供するサービスにあります。どうやら、彼らは自分のウェブからCSVをダウンロードする2つのオプションを持っていて、日付のフォーマットを違うものにしています。そのうちの1人は正しくISO-8601を使用しますが、もう1つは日付文字列の最後に ".0"を追加しているため、Excelが反転してテキスト文字列として扱われます。

    どうもありがとうございます。

    関連する問題