• ベストアンサー

VBAでしょうか!?

フォルダの中には日付(xxx6_19)がファイル名の複数のCSVファイルがあります。 エクセルでメニュー画面を作成しワンクリックで当フォルダ内の一番最近のファイルを開き、尚且つ1つの項目を並び替えて上位5位までを表示させる方法を教えて下さい!

質問者が選んだベストアンサー

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.6

>更新日時でソートし昨日・今日の日付分の行を薄く塗りつぶす! cvsファイルを呼び出すために使っているブックの標準モジュールに貼り付けます。 少し不明点が・・・。ソートは逆順にしています。(昇順はxlAscendingにします) 昨日、今日をどうつかむか・・・。今はパソコンの機械日付<Now()>を今日にしています。 薄く塗りつぶす・・・。カラーインデックス15等を適当に使っています。 csvデータの最初は表題と考えています。(ソートに関係します) うまくいけばいいですね。では。 Public Sub CSVdataSort() Const ksYMD = "AM" '更新日時の列名 Dim w As Workbook 'ブック Dim CsvShtName As String 'csvファイルを読み込んだブック Dim CsvFileCot As Integer 'csvファイルの個数 For Each w In Application.Workbooks If Right(w.Name, 3) = "csv" Then CsvShtName = w.Name: CsvFileCot = CsvFileCot + 1 End If Next If Len(CsvShtName) = 0 Then 'ファイルなしの場合 MsgBox "CVSファイルがありません": Exit Sub End If If CsvFileCot > 1 Then MsgBox "CVSファイルが複数あります。中断します": Exit Sub End If '元のシートから読み込んだCVSファイルを操作 Windows(CsvShtName).Activate 'アクティブにする Cells.Select 'シートを選択 Cells.EntireColumn.AutoFit '列幅を自動調整する ActiveSheet.UsedRange.Select 'データ部分を選択 '更新日時で降順にソート Dim sKey As Range 'ソートキー Set sKey = Range(ksYMD & "2") Selection.Sort Key1:=sKey, Order1:=xlDescending, Header:=xlGuess '今日、昨日の行に色を付ける Dim rg As Range '更新日時データ範囲 Dim rgRow As Long '色を付ける行 Dim rowNum As Integer 'データ範囲の行数 Dim colNum As Integer 'データ範囲の列数 With ActiveSheet rowNum = .UsedRange.Rows.Count colNum = .UsedRange.Columns.Count For Each rg In .Range(ksYMD & "2:" & ksYMD & rowNum) rgRow = rg.Row With Range(Cells(rgRow, 1), Cells(rgRow, colNum)) If rg = Int(Now()) Then '今日 .Interior.ColorIndex = 15 'カラーインデックス15 End If If rg = Int(Now() - 1) Then '昨日 .Interior.ColorIndex = 34 'カラーインデックス34(36も薄い色?) End If End With Next Range("A1").Select End With End Sub

keyman
質問者

お礼

パソコン復旧作業の為、少し空いてしまいました。その間に回答ありがとうございます。アドバイス通り作業すると順調にいきました!そこでしめとしてB、C、D列を非表示にしたいのですが・・・「もっと早言えよ!」と言われそうですが・・・それと基本的な事ですが現在メニュー画面としてボタンを2つ用意し,1つ目は検索用として特定フォルダから最新ファイルを選択、もう1つはそれを更新日時でソートし尚且つ今日昨日の行に色を付けるように出来ました。本当にありがとうございます。作業上、便宜を図るために1つ目のボタンをクリックし、最新ファイルを検索後”その表示したシート上に2つ目のボタン作成し実行、若しくは最新ファイル選択後、一旦メニュー画面に戻り2つ目のボタンをクリック!”ってな具合にしたいのですが。どちらかと言えば後者の方を・・・ 意味分かります!?ようは処理させたところにボタンがあり連続して作業が出来るようにしたいのですが。もちろんワンクリックすべての処理が出来ればそれに越したことはありません。何も分からずして毎回ずうずうしくてすみません・・・非表示の分とあわせてよろしくお願いします。 ~~~現在パソコンが不安定な状態でいつフリーズするかヒヤヒヤしながら作業している毎日です。

その他の回答 (5)

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.5

ANo#2に下記の4行を追加し実行結果のイミディエイトウインドウの内容を補足して下さい。最初の2、3件と最後の2、3件を見たいので、途中はカットしてもらってかまいません。それに、ダイアログのメッセージは私の作ったダイアログの文言でしょうか。 myDir = "C:\My Documents\" 'ご自分のフォルダを指定してください。\あり myFileName = "*.csv" '月日は4桁 Debug.Print myDir & myFileName & ":初期値" '*** 追加 *** Dummy = Dir(myDir & myFileName) Debug.Print myDir & Dummy & ":検索1回目" '*** 追加 *** While Len(Dummy) > 0 YMD8new = ymdHenkan(Dummy) If YMD8old < YMD8new Then mySchFileName = Dummy YMD8old = YMD8new End If Dummy = Dir Debug.Print myDir & Dummy & ":継続検索" '*** 追加 *** Wend Debug.Print myDir & mySchFileName & ":検索結果" '*** 追加 *** If mySchFileName <> "" Then

keyman
質問者

お礼

アドバイス通りコード追加して実行したところ イミディエイトウインドウに検索・検索結果が順に表示され・・ 検索結果をよくみるとちゃんと指定したフォルダから 最新日時のファイルを検索していました。 なにかよくわからないまま解決したような感じで・・ 本当にありがとうございます。 あつかましいですがその開いたファイルを次の処理として 更新日時でソートし昨日・今日の日付分の行を薄く塗りつぶす! このようにしたいのですが、マクロをどこに書くのか分からず、 また書く場所によって違いますよね!? ようは最新ファイルを開いたあとその処理をしたいのですが? ファイルの内容は A列 B列 C列・・・ AL列   AM列 名前 住所 TEL  登録日時  更新日時 といった具合に配列してあります。

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.4

拡張子(.csv)があるようなのでANO.#2を使います。 確認ですが、ご自分のフォルダを指定してください。\あり」 の「ご自分のフォルダ」はcsvファイルがあるフォルダです。「\あり」は「C:\xxxxx\xxxxx\」のように登録して最後に「\」が必要ということです。 また、下記の様にしてみて下さい。実行した後、イミディエイトウインドウ(もしくはデバッグウインドウ)を開いて、開こうとしたファイル名を確かめてください。ドライブ名+フォルダ名+ファイル名になっていて、各々は\でつながっているでしょうか。何も表示されなかったら、拡張子が.csvではないか、指定したフォルダに.csvファイルがないような気がします。 最後のメセージを修正したのは、マクロからのメッセージかどうか確かめたいからです。確認をお願いします。また、マクロの先頭に「Option Explicit」が無ければ入力してください。スペルミスがあるかもしれません。マクロはコピーして貼り付けられました? それと、Excelのバージョンは? 途中から・・・ myDir = "C:\My Documents\" 'ご自分のフォルダを指定してください。\あり myFileName = "*.csv" '月日は4桁    :    : If mySchFileName <> "" Then Debug.Print myDir & mySchFileName  '*** 追加します *** Workbooks.Open Filename:=myDir & mySchFileName Else MsgBox "ファイルがありません(マクロのメセージ)" '*** 修正します *** End If End Sub

keyman
質問者

お礼

本当に事細かくアドバイスありがとうございます。 しかし、結論からいいますとダメでした。 アドバイス通り試みイミデイエイトウインドウで確認したところ、 なにも表示されていませんでした。 拡張子も表示していますし、ファイルのあるフォルダ名も入力ミスはないと思います。(ファイルのプロパティから{場所}をコピーしてあてはめています) バージョンはExcel2000です。 尚、マクロはコピーできています。 コード等全くわからない為、応用が利かないのが現実です。 もう一度ファイル名を確認します「101010-keymans-2001-6-21.csv」 といった具合です。 度重なる内容不十分で大変申し訳ありません。

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.3

修正する箇所は1箇所です。フォルダをセットし、最後に\があればいいです。 多分、そうされてのことだと思い、なぜ動かないか考えてみました。 私は、csvファイルということで、ファイルの拡張子がcsvだと決めて作っています。#1の「お礼」にあるファイル名から推測すると拡張子が無いような気がします・・・下記に拡張子が無いcsvファイルを読めるようにしてみました。拡張子が無ければこちらを試してください。 Sub CommandButton1_Click() Dim myDir As String 'ファイルガあるドライブとフォルダ Dim myFileName As String '探すファイル名(ワイルドカード) Dim Dummy As String '作業用ファイル名と見つかったファイル名 Dim mySchFileName As String '作業用ファイル名と見つかったファイル名 Dim YMD8old, YMD8new As Long 'ファイルがもつ月日 myDir = "C:\My Documents\" 'ご自分のフォルダを指定してください。\あり myFileName = "*.*" Dummy = Dir(myDir & myFileName) While Len(Dummy) > 0 If InStr(Dummy, ".") = 0 Then YMD8new = ymdHenkan(Dummy) If YMD8old < YMD8new Then mySchFileName = Dummy YMD8old = YMD8new End If End If Dummy = Dir Wend If mySchFileName <> "" Then Workbooks.OpenText Filename:=myDir & mySchFileName, DataType:=xlDelimited Else MsgBox "ファイルがありません" End If End Sub 'ファイル名の年月日を8桁にする Function ymdHenkan(myFileName As String) Dim wkFLname As String 'ワーク Dim L As Integer 'カウンタ Dim yy, mm, dd As String '年、月、日 Dim pot(4) As Integer '「-」の位置 Dim potIdx As Integer '「-」の位置の順 wkFLname = myFileName & "-" For L = Len(wkFLname) To 1 Step -1 If Mid(wkFLname, L, 1) = "-" Then potIdx = potIdx + 1 pot(potIdx) = L End If If potIdx = 4 Then Exit For Next yy = Mid(wkFLname, pot(4) + 1, pot(3) - 1 - pot(4)) mm = Right("0" & Mid(wkFLname, pot(3) + 1, pot(2) - 1 - pot(3)), 2) dd = Right("0" & Mid(wkFLname, pot(2) + 1, pot(1) - 1 - pot(2)), 2) Debug.Print ymdHenkan ymdHenkan = Val(yy & mm & dd) End Function

keyman
質問者

お礼

事細かく回答頂き本当にありがとうございます。 しかし解決されませんでした・・・前回と同じように「ファイルが見つかりません」と表示されます。おっしゃるように拡張子は表示していませんでした。で表示させて試みてもダメでした・

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.2

VBEのシート(Sheet1等)のコードウインドウに貼り付けてマクロを実行してください。 年4桁、月・日(1桁か2桁)の一番最近のファイルを開きます。 「myDir」はご自分のドライブ+フォルダに変更してください。 Excel2000だとSplit、InStrRev関数等を使って書けますが、Excel95、97でも動くようにしてあります。 Sub CommandButton1_Click() Dim myDir As String 'ファイルガあるドライブとフォルダ Dim myFileName As String '探すファイル名(ワイルドカード) Dim Dummy As String '作業用ファイル名と見つかったファイル名 Dim mySchFileName As String '作業用ファイル名と見つかったファイル名 Dim YMD8old, YMD8new As Long 'ファイルがもつ年月日(比較用) myDir = "C:\My Documents\" 'ご自分のフォルダを指定してください。\あり myFileName = "*.csv" '月日は4桁 Dummy = Dir(myDir & myFileName) While Len(Dummy) > 0 YMD8new = ymdHenkan(Dummy) If YMD8old < YMD8new Then mySchFileName = Dummy YMD8old = YMD8new End If Dummy = Dir Wend If mySchFileName <> "" Then Workbooks.Open Filename:=myDir & mySchFileName Else MsgBox "ファイルがありません" End If End Sub 'ファイル名の年月日を8桁にする Function ymdHenkan(myFileName As String) Dim wkFLname As String 'ワーク Dim L As Integer 'カウンタ Dim yy, mm, dd As String '年、月、日 Dim pot(4) As Integer '「-」の位置 Dim potIdx As Integer '「-」の位置の順 wkFLname = myFileName & "-" For L = Len(wkFLname) To 1 Step -1 If Mid(wkFLname, L, 1) = "-" Then potIdx = potIdx + 1 pot(potIdx) = L End If If potIdx = 4 Then Exit For Next yy = Mid(wkFLname, pot(4) + 1, pot(3) - 1 - pot(4)) mm = Right("0" & Mid(wkFLname, pot(3) + 1, pot(2) - 1 - pot(3)), 2) dd = Right("0" & Mid(wkFLname, pot(2) + 1, pot(1) - 5 - pot(2)), 2) ymdHenkan = Val(yy & mm & dd) End Function

keyman
質問者

お礼

回答ありがとうございます。早速試みたところ”ファイルが見つかりません!”とダイアログ表示されてしまいました。初歩的な質問で大変申し訳ありませんが、 >myDir = "C:\My Documents\" 'ご自分のフォルダを指定してください。\あり’この1行だけ入れ替えればいいんですよね!?

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.1

少々条件が・・・ ファイル名の日付(xxx6_19)の意味があいまい(xxxは?)なので月日5桁で考えています。(6月1日は06_01、12月1日は12_01)9月までが月1桁だと判定に苦しみそうです。ファイル名には年月日以外の数値がないとか別の条件があれば簡単ですが。 また、年をどうされているか分かりませんが、Left(Right(Dummy, 9), 5)を少し変形すれば対応できるでしょう。(今はファイル名から月日を切り取っています) 下記は、月日5桁で一番大きいファイル名を探し、開いています。別シートになります。 この後、  1.データ→並べ替えで上位5番目までを見る、または  2.データ→フィルタ→オートフィルタでトップテンを選んで上位または下位5を選択 1または2も自動にする?のはキー記録でできそうですが・・・ コントロールツールボックスのボタンのマクロ。「myDir」を合うように変更してください。 Private Sub CommandButton1_Click() Dim myDir As String 'ファイルガあるドライブとフォルダ Dim myFileName As String '探すファイル名(ワイルドカード) Dim Dummy, mySchFileName As String '作業用ファイル名と見つかったファイル名 Dim chkMD As String 'ファイルがもつ月日 myDir = "C:\My Documents\" 'ご自分のフォルダを指定してください。\あり myFileName = "*.csv"        '月日は4桁 Dummy = Dir(myDir & myFileName) While Len(Dummy) > 0 If chkMD < Left(Right(Dummy, 9), 5) Then chkMD = Left(Right(Dummy, 9), 5) mySchFileName = Dummy End If Dummy = Dir Wend If mySchFileName <> "" Then Workbooks.Open Filename:=myDir & mySchFileName Else MsgBox "ファイルがありません" End If End Sub

keyman
質問者

お礼

回答ありがとうございます。内容不十分ですみません。日々更新されるファイル名は「000001-sdfghfj-2001-6-21」といった具合です。データ並び替えは上手くいったんですがフォルダ内より最新ファイル取り出し(検索)が上手くいかず・・

関連するQ&A

  • Windows10 右クリックメニュー 新規作成

    Windows10 右クリックメニュー 新規作成 Windows10において、デスクトップやフォルダなどで右クリックをしたときに出る「右クリックメニュー」があると思うのですが、そこにある 新規作成 からWordファイルやExcelファイルなどの作成ができると思います。しかし何故か画像のようにExcelファイルの作成項目が無くなってしまいました。 この場合、どうしたらもう一度Excelファイルの新規作成の項目を出すことが出来るでしょうか?

  • 今開いているエクセルのファイル名をセルに取り込みたい

    日付(yymmdd.txt)の付いた名前のテキストファイルを 自動的にエクセルにCSVで取り込む様に、マクロを組みました。なので、このファイル名に日付が付いているので、この日付をどうにかしてエクセルに取り込みたいのですが、方法をご存知無いですか? TXTとエクセルは同じフォルダに入れて管理する予定なので、エクセルファイルの居るフォルダ内のファイル名を取り込むのでも構いません。 どなたか良い案ありませんか? よろしくおねがいします。

  • VBAで複数のフォルダから最新のファイルを検索してコピーするには?

    はじめましてこんにちは!エクセルを少しいじり始めた者です。 エクセルのVBAで複数のフォルダから最新更新日のファイルを検索して特定シートのセルD1からF20までをコピーして貼り付けるにはどのようにコードを書いたらいいのでしょうか?具体的に申し上げますと、ある特定のフォルダの中に複数のフォルダが入っており、複数のフォルダにはそれぞれ同じ名前の後に日付が入っていて、さらにその中には同じファイル名の後に日付が付いているファイルがあります。(「日本」フォルダの中に「日本200401」、「日本200402」、「日本200403」フォルダが入っていてさらにそれぞれのフォルダ内には「全国200401」」、「全国200402」、「全国200403」みたいな感じでフォルダ名と同じ日付が付いたファイルが入っています。) その複数のフォルダの中から最新更新日時のファイルだけを開いて特定のシートからデータをコピーして貼り付けるにはどのようにコードを記述したら良いのでしょうか?

  •  エクセル2000でのVBA作成してほしいです。

     エクセル2000でのVBA作成してほしいです。  上記の通り、エクセルのVBAを作成して頂きたいです。 フォルダの中に約140個のcsv形式のファイルがあります。ファイル名は時間です。例えば、朝の6時00分15秒の場合は、「060015.csv」で、これが、五分置きのファイルで、139個あります。このファイルのB8~B263をエクセルのシート1のC11から、横に左詰めで貼り付けたいのです。今までは、エクセルで、開く→貼り付けたい所を選択→貼り付けでやっていたのですが。自分で、VBAについて勉強できればいいのですが、今まで、プログラミングを触ったことがないのと時間的余裕がなくて困っています。お力を貸して頂ければ幸いです。

  • 特定のcsvファイルが開けない

    色々調べてみたのですが表題の件がどうしても分かりません。 すみませんがよろしくお願い致します。 「あいう.csv」というファイルを開こうとすると『ファイルあいう.csvを作成できません。 ファイルの作成先フォルダを右クリックし、ショートカットメニューの[プロパティ]をクリックして、 そのフォルダへのアクセス権を確認してください。』という表示が出ます。 メールで送ってもらった同じファイル名のファイルも開けなくなっていました。 表示どおりにファイルのプロパティを開いてもアクセス権を確認する場所がどこだか分かなくて困っています。 よろしくお願い致します。

  • エクセルVBAでCSVを読み込んで別ファイルにまとめたいです。

    エクセルVBA初心者の者です。 マクロの記録でできたコードをいじって、 なんとか動くものができるレベルです。 Aというフォルダに20~40行程度の内容のCSVファイルが 数百個あります。開けてみないと何行あるのかわかりません。 そのAフォルダのCSVの内容をエクセルで開いて、別のエクセルファイルの一枚のシートにまとめたいのです。 最初にCSVファイル名を一枚のシートのA列に書き出すところ まではやれたのですが、それを順番に読み込んでコピペの 流れができません。 CSVファイル名読み込み 読み込んだファイル1つめCSV開く CSVの20~40行をコピー 別のエクセルファイルのシートに貼り付け 1つめCSV閉じる ↓ 読み込んだファイル2つめCSV開く 繰り返し こういうやり方じゃない方がいいのかもわかりません。 もしかして考え方も違うのでしょうか? サンプルコード教えていただけるとありがたいです。 よろしくお願いします。

  • タブで区切られたXXX.csvファイルをエクセルで開くには

    中身はタブで区切られた「XXX.csv」というファイルをエクセルでうまく開くにはどのようにすれば可能でしょうか? Excell2000を使用しています。 XXX.csvファイルをクリックすると、エクセルで開きますが、タブ区切りされておらず、セルAにすべて入ってしまいます。(行への展開は正しい) そのため、はじめにエクセルを開いておいて、ファイル名を指定しますが、これもうまくいきません。 どのようにすれば、タブ区切りという指定が出来て、Excellへ展開することが出来るのでしょうか?

  • 複数EXCELのセルデータを違うセルに移したい

    昨日、複数のエクセルのファイルを1つのファイルの1枚のシートにするやり方を質問させていただきました。csvファイルでしたのでできなかったことがわかりました。お答えいただいた方本当にありがとうございました。助かりました。教えてgooのやり方がわからずコメントを書けませんでしたのでここに書かせていただきます。 参考:http://okwave.jp/qa/q7735457.html さらに質問なのですがどなたかお願いいたします。 今、一枚のシートに日付ごとに項目が入っているのですが、項目の前の列にそれぞれ日付をつけるやり方があれば教えていただければと思います(下図のようになっています)。できればいらない部分は排除したいです。 図としましては        B列  C列 (数字は行の番号です。)       3      日付       4   いらない部分      5   ※  項目       6   ※   項目       7   日付 のような形になっています。 日付はC列の3行目からランダムに入っています。次の日付までB列の前に先の日付を入れたいです。(4,5の※部分にC3の日付を入れたいです)。あと出来ればいらない部分は消したいです。 または複数のEXCEL(.CSV)ファイルから1つのファイルの1枚のシートにする際にそれを行えたら嬉しいです。 複数のファイルの場合は   B列  C列         (数字は行の番号です。)   3    日付※ 4   いらない部分 5    ※ 項目         :   の形になっていてC列の3行目に日付が入っているのとC列4行目にいらない部分が入っているのはどのファイルも変わりありません。 わかる方がいらっしゃいましたらぜひともよろしくお願いします。また、CSVファイルになっていますのでお願いします。(図がへなへなになってしまって申し訳ありません)

  • 【Microsoft Excel】 .csv 以外のCSVファイルをExcelで開きたい!

    .csv 以外のCSVファイルをExcelで開きたいのですがどうしたらよいでしょうか? abcd.csvというExcelで問題なく開けるCSVファイルがあるとします。 これの拡張子を.xxx(又はその他、独自設定の拡張子)に変更して、Excelで開けるようにしようと思ったのです。 フォルダオプション>ファイルタイプ>新規(ボタン)」で「新しい拡張子の作成」ダイアログが開き、そこで ・ファイルの拡張子=.xxx ・関連付けられているファイル タイプ=Microsoft Excel CSV ファイル と設定して、abcd.xxxをダブルクリックでExcelが起動&ファイルオープンするまではいったのです。(アイコンも.csvファイルといっしょになりました。) しかし、 aaa,bbb ccc,ddd という内容のファイルが セルA1=aaa,bbb セルA2=ccc,ddd となり、csvファイルとして認識してくれていないみたいなのです。 ちなみに、元の.csvの場合にはちゃんと セルA1=aaa セルB1=bbb セルA2=ccc セルB2=ddd とExcelは表示してくれます。 どうにか上手い方法は無いものでしょうか! よろしくお願いいたします。

  • csvをVBAを使ってエクセル形式で保存したい

    タイトルのとおりなのですが、csvをVBAを使ってエクセル形式で保存したいのですが、その際ひとつ条件がありまして作成するエクセルファイルをcsvと同じ名前にしたいと思っています。  csvのファイル名は都度変わってしまうため私の現在の知識ではVBAを作成することができません。  教えて下さい。よろしくお願いします。

専門家に質問してみよう