[[20090928172659]] 『CSVファイルから年月日の摘出について』(まき) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『CSVファイルから年月日の摘出について』(まき)

OS: Vista、エクセル: 2003

いつも色々参考にさせて頂いております。
そんなに難しいマクロでは無いと思うのですが、もう1週間も悩んでいるのでお助け
願います。

マクロでCSVファイルを開き、そこから年月日を取得したいと思うのですが、年と日
が入れ替わってしまいます。現行のマクロは次の通りです。また、CSVファイルの年月日
は、yy-mm-ddで入力されています。

 Dim 年 As Long, 月 As Long, 日 As Long, 保存年月日 As String
 Dim 読込ファイル名 As String
    Workbooks.Open Filename:="C:\My Documents\CFカードデーター\ZL00020.CSV"

    Windows("ZL00020.CSV").Activate

        With Sheets("ZL00020")
            .Range("F4").Select
            .Range("F4") = "=Year(A2)"
            .Range("F5").Select
            .Range("F5") = "=Month(A2)"
            .Range("F6").Select
            .Range("F6") = "=Day(A2)"
            年 = Range("F4")     '年のみを摘出
            月 = Range("F5")    '月のみを摘出
            日 = Range("F6")      '日のみを摘出
            年月日 = 年 & "-" & 月 & "-" & 日 
            .Range("F10") = 年月日
        End With

ちなみに、同ファイルを手動で開きF4に=Year(A2)と入力すると、正しく年を4桁で取得
出来ます。マクロだと駄目で、開いたファイルをCSV形式で保存するとddが20ddとなって
しまいます。同マクロは、

            csvバックアップ名 = 年月日 & "_" & csvファイル名
            ActiveWorkbook.SaveAs Filename:= _
            パス & "\保存ファイル\" & csvバックアップ名
です。
また、csv形式はワードパットで開く様にOS上設定しています。

以上よろしくお願い致します。


 表示形式を指定してみてはどうでしょうか?

  Dim 年 As Long, 月 As Long, 日 As Long, 保存年月日 As String
  Dim 読込ファイル名 As String
  Dim d As Date
  Workbooks.Open Filename:="C:\My Documents\CFカードデーター\ZL00020.CSV"
  With Sheets("ZL00020")
    d = CDate(.Range("A2").Value)
    .Range("F4").Value = Year(d)
    .Range("F5").Value = Month(d)
    .Range("F6").Value = Day(d)
    With .Range("F10")
      .NumberFormatLocal = "yy-mm-dd"
      .Value = d
    End With
  End With

 ただ、またCSVで保存するのであれば表示形式は意味を持たないので
 Format関数で文字列にするなどの工夫が必要です
 (momo)

momo 様

おはようございます、まきです。

早速のご連絡ありがとうございました。
上記マクロを試してみましたが、CSVファイルをマクロで開くと、yy-mm-ddが20dd-yy-mmとなって
しまいます。(具体的に09-10-18が20dd-9-10とセルがなる)同ファイルを手動で開くとyyyy-mm-dd
で正しく表示されます。ここから直さないと駄目な様に感じますが。。。。

以上よろしくお願い致します。


 元のCSVファイルの中はどんな感じになっているのですか?
 (CSVをテキストで開いた場合のデータ)
 (momo)

 まきさん、

 メニュー[データ]−[外部データの取り込み]−[データの取り込み]

 区切り文字をカンマにして、フィールドのデータ型を指定できると思いますが?
 (seiya)

momo様、seiya様

お返事頂ありがとうございました。sampleのcsvファイルは、次の通りです。
ワードパットで開いた状態

 "日付","時刻","経過時間","回転トルク","回転トルクMAX"
 "09/09/18","11:17:47","    0","    0","    0"
 "09/09/18","11:17:52","    5","  150","  150"
 '----数十行
 "日付","時刻","経過時間","回転トルク","回転トルクMAX"
 "09/09/18","11:19:26","    0"," 1150"," 1150"
 "09/09/18","11:19:31","    5"," 2650"," 2650"
 '----数十行

です。momo様のvbaから強制的に次の様にすれば目的のデーターは取れましたが。。。。

  With Sheets("ZL00020-1")
    d = CDate(.Range("A2").Value)
    .Range("F4").Value = Year(d)
    .Range("F5").Value = Month(d)
    .Range("F6").Value = Day(d)
    With .Range("F10")
      .NumberFormatLocal = "yy-mm-dd"
      .Value = d
    End With
    '強制的に修正
    年 = Left(d, 2) & Right(Left(d, 7), 2)
    .Range("G4").Value = 年
    月 = Right(d, 2)
    .Range("G5").Value = 月
    日 = Right(Left(d, 4), 2)
    .Range("G6").Value = 日
    .Range("G10").Value = 年 & "-" & 月 & "-" & 日

  End With

何となく納得が出来ません。。。→最終的にはこれでもいいのですが。。。

seiya様の方法を使うと、何故か年月日が入手出来ません。詳しくデバッグしていませんが。。。

  Dim d As Date

    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;C:\My Documents\ZL00020.CSV", Destination:=Range( _
        "A1"))
        .Name = "ZL00020"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 932
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With

  With Sheets("Sheet1")
    d = CDate(.Range("A2").Value)
    .Range("F4").Value = Year(d)
    .Range("F5").Value = Month(d)
    .Range("F6").Value = Day(d)
    With .Range("F10")
      .NumberFormatLocal = "yy-mm-dd"
      .Value = d
    End With
  End With

以上よろしくお願い申し上げます。


 >.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1)

 「日付」は 5 にならないといけないと思いますが?

 >.TextFileColumnDataTypes = Array(5, 1, 1, 1, 1)

 では?
 (seiya)


seiya 様

こんばんは、まきです。

ご指摘の場所を5に変更しましたが、セルに年月日が入ってきませんでした。最後のEnd With後に

  Range("A1").Activate

と入れましたが、 Range("A1")がActivateになりません。With Sheets("Sheet1")の宣言が悪いのでしょうか?

以上よろしくお願い致します。


 1) >ご指摘の場所を5に変更しましたが、セルに年月日が入ってきませんでした
    なんか変ですね...
   >同ファイルを手動で開くとyyyy-mm-dd で正しく表示されます
   なのですよね?

   QueryTableでインポートする際に各フィールド(列)のデータ型・形式を指定できると思うのですが
   試しましたか?

 2) Sheet1をSelectしてからじゃないと、ActiveSheetのRange("a1")がSelectされているはずです。

 With Sheets("Sheet1")
     .Select   '<- 挿入
     d = CDate(.Range("A2").Value)

 (seiya)
 

 おじゃまします。

 "09/09/18" のような 日付データのあるCSVを
 Workbooks.Openメソッドで 開くとき、Excel2002 以降なら Local引数というのがありますから
 これを True にしてOpenしてみてください。

 Sub Try1()
      Dim myCSV
      myCSV = Application.GetOpenFilename("CSV,*.csv")
      If VarType(myCSV) = vbBoolean Then Exit Sub

      Workbooks.Open myCSV, Local:=True   '◆ ここ

      Dim 年 As Integer
      Dim 月 As Integer
      Dim 日 As Integer
      Dim csvファイル名 As String
      Dim csvバックアップ名 As String
      Dim myPath As String

      With ActiveSheet '------ CSVファイル
          .Range("F4").FormulaLocal = "=YEAR(A2)"
          .Range("F5").FormulaLocal = "=MONTH(A2)"
          .Range("F6").FormulaLocal = "=DAY(A2)"
          年 = Range("F4").Value     '年のみを摘出
          月 = Range("F5").Value     '月のみを摘出
          日 = Range("F6").Value     '日のみを摘出
          .Range("F10").Value = 年 & "-" & 月 & "-" & 日

          If MsgBox("保存しますか", vbOKCancel) = vbOK Then
              csvファイル名 = Dir$(myCSV)
              myPath = Replace(myCSV, csvファイル名, "")
              csvバックアップ名 = myPath & .Range("F10").Value & "_" & csvファイル名
              Application.EnableEvents = False
              .Parent.SaveAs csvバックアップ名, FileFormat:=xlCSV, Local:=True '◆ 念のため ここも(^^
              Application.EnableEvents = True
          End If
      End With

 End Sub

  (kanabun)


 参考URL です

 [XL2000]VBAを使用してテキストを開くと正しい日付形式で認識されない
http://support.microsoft.com/default.aspx?scid=kb;ja;416875&Product=xlw2kINT

   (kanabun)


kanabun様、 seiya様

こんにちは、まきです。

seiya様
すいませんでした、seiya様からのご指摘の通りで動きました。(私が誤って、他のボタンに張ってしま
いました → (m_m) ) 【momo様、seiya様】のVBAで>.TextFileColumnDataTypes = Array(5, 1, 1, 1, 1)
を修正した後でOKです。

kanabun様
上記の通り記述した所、2003では問題無く動作しました。しかし、今回のVBAは2000〜2007を対象に作り
込みを行っています。ユーザーフォームに下記の通りver表示を張り、不具合時に連絡をもらう様にして
あります。

 ' フォームがアクティブになるイベント
 Private Sub UserForm_Activate()
    Dim hWnd As Long
    Dim Wnd_STYLE As Long
    Dim ver As Long
    Dim vew As Long

    hWnd = GetActiveWindow()
    Wnd_STYLE = GetWindowLong(hWnd, GWL_STYLE)
    Wnd_STYLE = Wnd_STYLE And (Not WS_SYSMENU)
    SetWindowLong hWnd, GWL_STYLE, Wnd_STYLE
    DrawMenuBar hWnd

    ver = Val(Application.Version)

    If ver = 9 Then
        vew = 2000
    End If

    If ver = 11 Then
        vew = 2003
    End If

    If ver = 12 Then
        vew = 2007
    End If

    ver_view.Value = vew

 End Sub

MSのwebでは、2000時にはレジストリを変更する様なので、他の人に修正してもらうのは危険なので、
seiya様からの方法で手直しを検討してみます。まだ、2000のPCでデバッグしていない為に、新たな不具
合が生じるかもしれませんので、その節にはよろしくお願い致します。

以上よろしくお願い致します。


kanabun様

まきです。先ほどの返事の中で書き忘れてしまったので、追記致します。
Range(F10)部に0-0-0となるので、Dim 年 As IntegerをStringやLongに変えても同じなので(F4〜6はOK)
ブレークポイントを入れてみた所、

          年 = Range("F4").Value     '年のみを摘出

の所がEmptyとなっています。Range(F4)には、正しく入力されているのに?
そこで下記の通り使いした所、F11に正しい年月日が入力されました。

          .Range("F10").Value = 年 & "-" & 月 & "-" & 日
          '--> 0-0-0 ↓追記
          .Range("F11").Value = .Range("F4") & "-" & .Range("F5") & "-" & .Range("F6")
          '--> 2009/10/18 正解

どうして、0-0-0となってしまうのでしょうか?(表題の質問からずれてしまいますが。)

以上よろしくお願い致します。


 そのコードは標準モジュールに書かれていますか?
 (seiya)

seiya様

こんにちは(今晩は?)、まきです。

現在はデバッグの為、試しのシート上にボタンをおいて確認しています。
最終的には、ユーザーフォーム上にボタンを配置し、新規のシートに結果を出す様に作る予定です。
同ユーザーフォーム上の標準モジュールは、次の通り配置します。(これだけじゃ分からないかと
思いますが。。。)

 Sub Auto_Open()
 Dim 読込ファイル名 As String

    読込ファイル名 = Application.ThisWorkbook.Name

    If 読込ファイル名 = "印刷画面.xls" Then
        Application.Visible = False  '画面を隠す
        UserForm1.Show
    Else
    End If

 End Sub

フォームの流れは、開始と言うボタンを押すと、CFカードに入っている数十個のCSVファイルから、
年月日、開始完了時間(含む経過時間)、ある数値の最大値のみを摘出し、エクセルの印刷画面用に準備
したシートにファイル毎に取得した数値を入力すると言う物です。
私は普段は営業職なので、たまにしかVBAを使用しないから、もう頭の中が@@です。

以上よろしくお願い致します。


 >現在はデバッグの為、試しのシート上にボタンをおいて確認しています。

 ということは、シートモジュールに書かれていますね?

 シートモジュール上の Range は Me.Range となり、書かれたシートを参照してしまいます。

          年 = .Range("F4").Value     '年のみを摘出
          月 = .Range("F5").Value     '月のみを摘出
          日 = .Range("F6").Value     '日のみを摘出

 のように、"."を付けてActiveSheetを参照させてください。
 (seiya)


seiya様

おはようございます、@まきです。

seiya様からご指摘頂きました通り、kanabun様のVBAを修正した所、正しくdataを(年月日)を表示する

事が出来ました。もちろん、seiya様のVBAも問題ございません。ありがとうございました。

5件前にも書きましたが、kanabun様のVBAの場合、2000ではVBAのみで回避出来ない為、seiya様からの

助言通り外部データの取り込みで対応してゆきます。上記VBAだと、2000時に何カ所かエラーになってい

ますので、とりあえず2003で(デバッグPC)全ての動作確認後、修正してゆきます。この度はありがとう

ございました。


   > 上記VBAだと、2000時に何カ所かエラーになってい 
   > ますので、とりあえず2003で(デバッグPC)全ての動作確認後、修正してゆきます

   とりあえず、一点だけ
   > .TextFilePlatform = 932 
      →  Excel 2000 の場合は、xlWindows で

    (kanabun)


kanabun様

おはようございます、まきです。

kanabun様が言われている所で駄目でした。同様に直したのですが、ユーザーフォームで実際に組込動か

した所、デバッグのシート上で同じシートに入れる際には問題無かったのですが、ユーザーフォーム→

tempシート(csvを読み込むだけの一時作業book)で行う場合、VBAで行うと駄目で(クエリーが見つからな

い→確か?)メニューからツール→マクロ→マクロだと代入されると言う現象が起きました。配布先に

確認した所、2000のPCは無いとの事なので(下が2002だったので)、結局kanabun様からの方法を使用し

ました。有り難うございました。


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.