[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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)
おはようございます、まきです。
早速のご連絡ありがとうございました。
上記マクロを試してみましたが、CSVファイルをマクロで開くと、yy-mm-ddが20dd-yy-mmとなって
しまいます。(具体的に09-10-18が20dd-9-10とセルがなる)同ファイルを手動で開くとyyyy-mm-dd
で正しく表示されます。ここから直さないと駄目な様に感じますが。。。。
以上よろしくお願い致します。
元のCSVファイルの中はどんな感じになっているのですか? (CSVをテキストで開いた場合のデータ) (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)
こんばんは、まきです。
ご指摘の場所を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)
こんにちは、まきです。
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でデバッグしていない為に、新たな不具
合が生じるかもしれませんので、その節にはよろしくお願い致します。
以上よろしくお願い致します。
まきです。先ほどの返事の中で書き忘れてしまったので、追記致します。
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)
こんにちは(今晩は?)、まきです。
現在はデバッグの為、試しのシート上にボタンをおいて確認しています。
最終的には、ユーザーフォーム上にボタンを配置し、新規のシートに結果を出す様に作る予定です。
同ユーザーフォーム上の標準モジュールは、次の通り配置します。(これだけじゃ分からないかと
思いますが。。。)
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様からご指摘頂きました通り、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様が言われている所で駄目でした。同様に直したのですが、ユーザーフォームで実際に組込動か
した所、デバッグのシート上で同じシートに入れる際には問題無かったのですが、ユーザーフォーム→
tempシート(csvを読み込むだけの一時作業book)で行う場合、VBAで行うと駄目で(クエリーが見つからな
い→確か?)メニューからツール→マクロ→マクロだと代入されると言う現象が起きました。配布先に
確認した所、2000のPCは無いとの事なので(下が2002だったので)、結局kanabun様からの方法を使用し
ました。有り難うございました。
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.