『マクロコード内日付の書式設定変更について』(パナ) マクロ初心者です。 引き継いだ資料のマクロ修正がしたいのですが、どうしたらいいか分からず・・・。 ご理解いただける方、教えていただけませんか?? 元々の日付表示がYYYY/MM/DDとなっているリストを、見かけ上(YYYYMMDD)に 変換しています。 しかしながら、数式バーを見るとYYYY/MM/DDとなっているんです。 そのコードが↓ Sub Macro1() Dim LastRow As Long Dim sDay As String, eDay As String With Worksheets("Sheet1") '実行シート LastRow = .Range("A" & .Rows.Count).End(xlUp).Row .Range("F2:F" & LastRow).NumberFormatLocal = "yyyymmdd" 例えばこのコードの後、どこかに =TEXT(F2,"YYYYMMDD")をして、 【変換したセルをコピー+形式を選択して貼り付け→値貼り付け】 というコードを付け足せばいいのでしょうか?? 初心者で、私にはまだまだ理解が出来ず、質問も うまく出来ていないかもしれませんが、ご理解いただける方、コメントお願いいたします。 ---- > 元々の日付表示がYYYY/MM/DDとなっているリストを、見かけ上(YYYYMMDD)に > 変換しています。 > しかしながら、数式バーを見るとYYYY/MM/DDとなっているんです。 数式バーの中身もシリアル値から YYYYMMDD の文字列、若しくは数値にしたい ということですか? (seiya) ---- 衝突しました。 同じ内容ですが、載せておきます。 元々の日付表示がYYYY/MM/DDとなっているリストを 見かけ上(YYYYMMDD)に変換しています。  ↓ 数式バーを見るとYYYY/MM/DDとなっている これで正常です。 現在入っている日付を、YYYYMMDD の形の 数値若しくは文字列に変換したい (数式バーにもYYYYMMDDの様にしたい) と思われての質問ですか? それとも、数式バーを見たときに YYYYMMDD で 表示されないから「これはおかしい」と思って 質問されているのですか? (HANA) ---- さらに衝突しました。 .NumberFormatLocal = "yyyymmdd" このコードは 数式バーの中身がYYYY/MM/DDとなっているものをセルの書式設定表示形式で 見かけ上YYYYMMDDに「見えるように」しているので、セルの値を「変換」してい るのではありません。   セルの表示上そうなっているだけでは都合が悪いのでしたら、その理由(その後に 利用するのにどんな不都合があるから、とか)も書いていただくと、 コードを変更しなくても済むかも知れません。 (みやほりん)(-_∂)b ---- (seiya)さん >数式バーの中身もシリアル値から YYYYMMDD の文字列、若しくは数値にしたい >ということですか? 質問不足で申し訳ございません。 おっしゃるように、数式バーの中身も文字列にしたいということです。 ---- (HANA)さん >それとも、数式バーを見たときに YYYYMMDD で >表示されないから「これはおかしい」と思って >質問されているのですか? おかしいと思っているのではなく、現在入っている日付を、文字列に出来たらと 思って質問いたしました。 ---- (みやほりん)(-_∂)bさん >セルの表示上そうなっているだけでは都合が悪いのでしたら、その理由(その後に >利用するのにどんな不都合があるから、とか)も書いていただくと、 >コードを変更しなくても済むかも知れません。 理由としては、今あるエクセルデータを加工して、 独自のシステムにアップロードするのですが、その際に日付は文字列じゃないと 正常にアップロードが完了しないのです・・・。 みなさん、コメントくださってありがとうございます。 また、分かりにくい質問で申し訳ございませんでした。 日付から文字列への変換マクロは可能でしょうか?? 教えてください。 (パナ) ---- 範囲を選択してから実行。 Sub test() Dim r As Range For Each r In Selection r.Value = r.Text Next End Sub (seiya) ---- (seiya)さん 早速試してみました。 変換したい日付の範囲を選択してから、マクロ実行してみました。 感動です。 マクロで変換出きる事は確信し・・・。 更に質問ですが、範囲を選択しなくても変換する事は出来ないでしょうか? また、一番最初の質問で表示した途中までのコード。 その後に組み込めばいいのでしょうか?? 教えていただいたコードをどの位置に追加すればいいのか分かりません。 お手数おかけいたしますが、もう少し教えていただけませんか?? 何卒よろしくお願いいたします。 (パナ) ---- 下記のようにして試してください。 With Worksheets("Sheet1") '実行シート LastRow = .Range("A" & .Rows.Count).End(xlUp).Row ' ここから With .Range("F2:F" & LastRow) .NumberFormatLocal = "yyyymmdd" For Each r In .Cells r.Value = r.Text Next End With ' ここまでを追加 (seiya) ---- (seiya)さん コメントありがとうございます。 早速下記のように追記し実行してみました。 しかしながら、コンパイルエラーが出ました・・・。 >For Each r In .Cells の『r』の部分が青くマークされました。 何がいけなかったのでしょうか?? Sub Macro1() Dim LastRow As Long Dim sDay As String, eDay As String With Worksheets("Sheet1") '実行シート LastRow = .Range("A" & .Rows.Count).End(xlUp).Row .Range("F2:F" & LastRow).NumberFormatLocal = "yyyymmdd" For Each r In .Cells r.Value = r.Text Next End With (パナ) ---- パナさん 投稿してからすぐ修正したのですが、間に合わなかったようです。 もう一度私のコードで試してください。 (seiya) ---- (seiya)さん 訂正ありがとうございます。 また、実行してみました。 やはり同じ箇所が青くマークされ、『コンパイルエラー』 が出てしまします。 何度も質問しまして申し訳ございません。 自分で修正内容が少しでも分かればいいのですが、コンパイルエラーも よく理解できず・・。 再度お教えくださると助かります。 Sub Macro1() Dim LastRow As Long Dim sDay As String, eDay As String With Worksheets("Sheet1") '実行シート LastRow = .Range("A" & .Rows.Count).End(xlUp).Row With .Range("F2:F" & LastRow) .NumberFormatLocal = "yyyymmdd" For Each r In .Cells r.Value = r.Text Next End With (パナ) ---- コンパイルエラー ですか? Sub Macro1() Dim LastRow As Long, r As Range '<- 追加 Dim sDay As String, eDay As String With Worksheets("Sheet1") '実行シート LastRow = .Range("A" & .Rows.Count).End(xlUp).Row With .Range("F2:F" & LastRow) .NumberFormatLocal = "yyyymmdd" For Each r In .Cells r.Value = r.Text Next End With ' これ以降は見ていませんが End With End Sub まであるのですよね? (seiya) ---- (seiya)さん はい。コンパイルエラーと出てしまいます。 End With End Sub まであると思います。 下記がEnd Subまでのコードです。 Sub Macro1() Dim LastRow As Long Dim sDay As String, eDay As String With Worksheets("Sheet1") '実行シート LastRow = .Range("A" & .Rows.Count).End(xlUp).Row With .Range("F2:F" & LastRow) .NumberFormatLocal = "yyyymmdd" For Each r In .Cells r.Value = r.Text Next End With .Columns("C:D").Insert Shift:=xlToRight .Range("C2:C" & LastRow).FormulaR1C1 = "=VLOOKUP(RC[-1],品番リスト!R1C4:R561C5,2,0)" .Range("D2:D" & LastRow).FormulaR1C1 = "=VLOOKUP(RC[-2],品番リスト!R1C4:R561C19,16,0)" .Range("C1:D1").Value = Array("P品番", "仕コード") With .Columns("C:D") .Value = .Value .AutoFit End With sDay = Format(Date - Day(Date) + 1, "yyyy/m/d") eDay = Format(DateAdd("M", 2, sDay) - 1, "yyyy/m/d") .Range("Q1:T1").Value = Array("P品番", "仕コード", "納期日", "納期日") myFilter .Range("A1:O" & LastRow), "21291", sDay, eDay, "内示(21291)" myFilter .Range("A1:O" & LastRow), "<>21291", sDay, eDay, "内示(21291以外)" sDay = Format(DateValue(eDay) + 1, "yyyy/m/d") eDay = Format(DateAdd("ww", 11, Date) - Weekday(Date) + vbFriday, "yyyy/m/d") myFilter .Range("A1:O" & LastRow), "21291", sDay, eDay, "情報(21291)" myFilter .Range("A1:O" & LastRow), "<>21291", sDay, eDay, "情報(21291以外)" .Range("Q1:T2").ClearContents End With End Sub 申し訳ございません。 もう少しだけお付き合いいただけますよう何卒よろしくお願いいたします。 (パナ) ---- それではこうしましょう。 コードを元に戻してから Sub Macro1() Dim LastRow As Long Dim sDay As String, eDay As String With Worksheets("Sheet1") '実行シート LastRow = .Range("A" & .Rows.Count).End(xlUp).Row .Range("F2:F" & LastRow).NumberFormatLocal = "yyyymmdd" test .Range("F2:F" & LastRow) '<- この一行を挿入 . . . End With End Sub の次に Sub test(ByRef rng As Range) Dim r As Range For Each r In rng r.Value = r.Text Next End Sub としてください。 (seiya) ---- (seiya)さん 何度も何度もありがとうございます。 当初の私の質問に対し、完璧なお答えいただきまして 感謝します!! 後から後から申し訳ないのですが、私のマクロの知識がないが故に お手数おかけする事は承知の上でお願いがあるのですが・・・。 今回教えていただいたコードを実行すると、要望どおり数式バーにはYYYYMMDDという 具合に出てくるのですが、いざエクセルシートを見ると、#########となっています。 これは、セルの書式設定がユーザー定義になっているからだと思われ、マクロを実行したあと、 その書式を"標準"にかえれば、セル内もYYYYMMDDと表示されます。 これは、仕方のないことなのでしょうか?? できることなら、その最後のハンド修正を無くし、マクロ内で指示できればと思いました。 それから、実は、先ほど記載しましたコードには続きがあって、 End Subで終わっているので、 そこまででいいのかと思ったのですが、 今回ご提案いただいたコードを追記しましたところ、それ以降の作業が正常に動かなくなって しまいました。 コードを記載すればいい訳ではないことは重々承知ですし、最初のEnd Subまででいいと思った とはいえ、次々質問をしてしまうことをお許しください。 元々の全部のコードを記載してみました。 このコードのどこに追記したら正常に作動しますでしょうか?? Sub Macro1() Dim LastRow As Long Dim sDay As String, eDay As String With Worksheets("Sheet1") '実行シート LastRow = .Range("A" & .Rows.Count).End(xlUp).Row .Range("F2:F" & LastRow).NumberFormatLocal = "yyyymmdd" .Columns("C:D").Insert Shift:=xlToRight .Range("C2:C" & LastRow).FormulaR1C1 = "=VLOOKUP(RC[-1],品番リスト!R1C4:R561C5,2,0)" .Range("D2:D" & LastRow).FormulaR1C1 = "=VLOOKUP(RC[-2],品番リスト!R1C4:R561C19,16,0)" .Range("C1:D1").Value = Array("P品番", "仕コード") With .Columns("C:D") .Value = .Value .AutoFit End With sDay = Format(Date - Day(Date) + 1, "yyyy/m/d") eDay = Format(DateAdd("M", 2, sDay) - 1, "yyyy/m/d") .Range("Q1:T1").Value = Array("P品番", "仕コード", "納期日", "納期日") myFilter .Range("A1:O" & LastRow), "21291", sDay, eDay, "内示(21291)" myFilter .Range("A1:O" & LastRow), "<>21291", sDay, eDay, "内示(21291以外)" sDay = Format(DateValue(eDay) + 1, "yyyy/m/d") eDay = Format(DateAdd("ww", 11, Date) - Weekday(Date) + vbFriday, "yyyy/m/d") myFilter .Range("A1:O" & LastRow), "21291", sDay, eDay, "情報(21291)" myFilter .Range("A1:O" & LastRow), "<>21291", sDay, eDay, "情報(21291以外)" .Range("Q1:T2").ClearContents End With End Sub Sub myFilter(myRng As Range, mCode As String, msDay As String, meDay As String, MakeShName As String) With myRng.Parent .Range("Q2:T2").Value = Array("<>#N/A", mCode, ">=" & msDay, "<=" & meDay) myRng.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=.Range("Q1:T2"), Unique:=False Worksheets.Add after:=Sheets(Sheets.Count) ActiveSheet.Name = MakeShName .Range("A1").CurrentRegion.Copy Sheets(MakeShName).Range("A1") .ShowAllData End With End Sub (パナ) ---- Sub test(ByRef rng As Range) Dim r As Range For Each r In rng r.Value = r.Text Next rng.NumberFormat = "General" '<--挿入 End Sub してみてください。 あと、ざっと見ただけですが。 > sDay = Format(Date - Day(Date) + 1, "yyyy/m/d") > eDay = Format(DateAdd("M", 2, sDay) - 1, "yyyy/m/d") 既に、各値は単なる数値になってしまっているので、このようなFormatにはなっていませんよね? sDay = Format(Date - Day(Date) + 1, "yyyymmdd") eDay = Format(DateAdd("M", 2, sDay) - 1, "yyyymmdd") とかに変更したらどうなりますか? 私としては、コードを元に戻して実行して必要なら最後に日付を変換した方が よいような気がしますが? (seiya) ---- (seiya)さん ありがとうございます。 下記の通り教えてた抱いたコードを追記してみました。 日付欄は、#######から数字に変わりました。 その後の処理は、やはり実行されず、処理が止まってしまいました。 エラーは『方が一致しません』でした。 大変申し訳ないのですが、どこに間違いがあるのかご指摘いただけませんか? Sub Macro1() Dim LastRow As Long Dim sDay As String, eDay As String With Worksheets("Sheet1") '実行シート LastRow = .Range("A" & .Rows.Count).End(xlUp).Row .Range("F2:F" & LastRow).NumberFormatLocal = "yyyymmdd" test .Range("F2:F" & LastRow) .Columns("C:D").Insert Shift:=xlToRight .Range("C2:C" & LastRow).FormulaR1C1 = "=VLOOKUP(RC[-1],品番リスト!R1C4:R561C5,2,0)" .Range("D2:D" & LastRow).FormulaR1C1 = "=VLOOKUP(RC[-2],品番リスト!R1C4:R561C19,16,0)" .Range("C1:D1").Value = Array("P品番", "仕コード") With .Columns("C:D") .Value = .Value .AutoFit End With sDay = Format(Date - Day(Date) + 1, "yyyymmdd") eDay = Format(DateAdd("M", 2, sDay) - 1, "yyyymmdd") .Range("Q1:T1").Value = Array("P品番", "仕コード", "納期日", "納期日") myFilter .Range("A1:O" & LastRow), "21291", sDay, eDay, "内示(21291)" myFilter .Range("A1:O" & LastRow), "<>21291", sDay, eDay, "内示(21291以外)" sDay = Format(DateValue(eDay) + 1, "yyyymmdd") eDay = Format(DateAdd("ww", 11, Date) - Weekday(Date) + vbFriday, "yyyymmdd") myFilter .Range("A1:O" & LastRow), "21291", sDay, eDay, "情報(21291)" myFilter .Range("A1:O" & LastRow), "<>21291", sDay, eDay, "情報(21291以外)" .Range("Q1:T2").ClearContents End With End Sub Sub test(ByRef rng As Range) Dim r As Range For Each r In rng r.Value = r.Text Next rng.NumberFormat = "General" End Sub Sub myFilter(myRng As Range, mCode As String, msDay As String, meDay As String, MakeShName As String) With myRng.Parent .Range("Q2:T2").Value = Array("<>#N/A", mCode, ">=" & msDay, "<=" & meDay) myRng.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=.Range("Q1:T2"), Unique:=False Worksheets.Add after:=Sheets(Sheets.Count) ActiveSheet.Name = MakeShName .Range("A1").CurrentRegion.Copy Sheets(MakeShName).Range("A1") .ShowAllData End With End Sub (パナ) ---- Macro1 を Sub Macro1() Dim LastRow As Long Dim sDay As String, eDay As String With Worksheets("Sheet1") '実行シート LastRow = .Range("A" & .Rows.Count).End(xlUp).Row .Range("F2:F" & LastRow).NumberFormatLocal = "yyyymmdd" .Columns("C:D").Insert Shift:=xlToRight .Range("C2:C" & LastRow).FormulaR1C1 = "=VLOOKUP(RC[-1],品番リスト!R1C4:R561C5,2,0)" .Range("D2:D" & LastRow).FormulaR1C1 = "=VLOOKUP(RC[-2],品番リスト!R1C4:R561C19,16,0)" .Range("C1:D1").Value = Array("P品番", "仕コード") With .Columns("C:D") .Value = .Value .AutoFit End With sDay = Format(Date - Day(Date) + 1, "yyyy/m/d") eDay = Format(DateAdd("M", 2, sDay) - 1, "yyyy/m/d") .Range("Q1:T1").Value = Array("P品番", "仕コード", "納期日", "納期日") myFilter .Range("A1:O" & LastRow), "21291", sDay, eDay, "内示(21291)" myFilter .Range("A1:O" & LastRow), "<>21291", sDay, eDay, "内示(21291以外)" sDay = Format(DateValue(eDay) + 1, "yyyy/m/d") eDay = Format(DateAdd("ww", 11, Date) - Weekday(Date) + vbFriday, "yyyy/m/d") myFilter .Range("A1:O" & LastRow), "21291", sDay, eDay, "情報(21291)" myFilter .Range("A1:O" & LastRow), "<>21291", sDay, eDay, "情報(21291以外)" .Range("Q1:T2").ClearContents test .Range("F2:F" & LastRow) '<- ここに移動 End With End Sub   ではまずいですか? (seiya) ---- どこかで見たコードですね。 [[20090731152039]]『特定データを抜出し別シートに貼り付け』(ともP) 日付が文字列に成っていないといけないのは Sheet1のシートだけ? Sheet1のシート以外? 最終的には全部(5枚)? (HANA) ---- (seiya)さん お返事遅くなりまして申し訳ございません。 ご提案いただいたとおり、再度実行してみました。 結論としては、エラーとなし『型が一致しません』となりました。 その前に教えていただいたコード .Range("F2:F" & LastRow).NumberFormatLocal = "yyyymmdd" test .Range("F2:F" & LastRow) は実行し、見かけ上も数式バーもyyyymmddとなりましたが、 今回の .Range("Q1:T2").ClearContents test .Range("F2:F" & LastRow) '<- ここに移動 End With End Sub では、数式バーはyyyy/mm/ddと表示されてしまいました。 追記した場所が良くなかったのでしょうか。 また、 Sub test(ByRef rng As Range) Dim r As Range For Each r In rng r.Value = r.Text Next rng.NumberFormat = "General" End Sub をする事によって、それ以降のコードが作動しなくなってしまうのでしょうか?? 何度もスイマセンが何卒ご回答の程よろしくお願いします。 (HANA)さん コメントありがとうございます。 質問された内容についてですが、 最終的には全部(5枚)変換したいと思っております。 何卒ご提案の程よろしくお願いいたします。 (パナ) ---- > .Columns("C:D").Insert Shift:=xlToRight がありましたね。 > test .Range("F2:F" & LastRow) を test .Range("H2:H" & LastRow) に変更してください。 (seiya) ---- (seiya)さん また、『型が一致しません』というエラーで処理ストップと なってしまいました・・・。 ヘルプを開いてみたのですが、 【変数またはプロパティの型が正しくありません。たとえば、整数値が必要な変数では、 文字列全体が 整数型として認識されない限り、文字列値を格納することはできません。】 と説明があり、コレが少し気になったのですが、日付を文字列にしてしまう為に その後の処理に問題が発生し、エラーとなるのでしょうか? 時間とお手数をおかけしてしまい、申し訳ございません・・・。 (パナ) ---- Debug したとき、どの行がハイライトされていますか? (seiya) ---- (seiya)さん 実行したあと、コード表ではなく、エクセルシート上に『型が一致しません』 と表示され、そのポップアップには、『OK』及び『ヘルプ』というボタンしかありません。 OKをクリックすると、処理が中断された状態で、そのままです。 自らAlt+F11でコード表を出しても、ハイライトされていません・・・。 コンパイルエラーの時はハイライトされていたのですが。 この説明でご理解いただけますでしょうか?? (パナ) ---- .Columns("C:D").Insert Shift:=xlToRight があるので、処理後の日付列は H列になりますよね? Macro1を全て元通りに戻して実行し、H列が日付の列になるのを確認してください。 (seiya) ---- もう少しスマートな挿入場所が有りそうですが。。。 Macro1 だけ Sub Macro1() Dim LastRow As Long Dim sDay As String, eDay As String Dim wsDay As String, weDay As String With Worksheets("Sheet1") '実行シート LastRow = .Range("A" & .Rows.Count).End(xlUp).Row test .Range("F2:F" & LastRow) .Columns("C:D").Insert Shift:=xlToRight .Range("C2:C" & LastRow).FormulaR1C1 = "=VLOOKUP(RC[-1],品番リスト!R1C4:R561C5,2,0)" .Range("D2:D" & LastRow).FormulaR1C1 = "=VLOOKUP(RC[-2],品番リスト!R1C4:R561C19,16,0)" .Range("C1:D1").Value = Array("P品番", "仕コード") With .Columns("C:D") .Value = .Value .AutoFit End With sDay = Format(Date - Day(Date) + 1, "yyyy/m/d") eDay = Format(DateAdd("M", 2, sDay) - 1, "yyyy/m/d") wsDay = Format(sDay, "yyyymmdd") weDay = Format(eDay, "yyyymmdd") .Range("Q1:T1").Value = Array("P品番", "仕コード", "納期日", "納期日") myFilter .Range("A1:O" & LastRow), "21291", wsDay, weDay, "内示(21291)" myFilter .Range("A1:O" & LastRow), "<>21291", wsDay, weDay, "内示(21291以外)" sDay = Format(DateValue(eDay) + 1, "yyyy/m/d") eDay = Format(DateAdd("ww", 11, Date) - Weekday(Date) + vbFriday, "yyyy/m/d") wsDay = Format(sDay, "yyyymmdd") weDay = Format(eDay, "yyyymmdd") myFilter .Range("A1:O" & LastRow), "21291", wsDay, weDay, "情報(21291)" myFilter .Range("A1:O" & LastRow), "<>21291", wsDay, weDay, "情報(21291以外)" .Range("Q1:T2").ClearContents End With End Sub 後の二つはそのまま。 (HANA) ---- (seiya)さん >Macro1を全て元通りに戻して実行し、H列が日付の列になるのを確認してください。 元々のコードで実行し、H列が日付の列になっていました。 ---- (HANA)さん ご提案ありがとうございます。 バッチリ作動し、求めたい形となりました。 今までのやり取りをご理解いただき コメントくださってホントにありがとうございました。 ちなみに・・・。 wsDay = Format(sDay, "yyyymmdd") weDay = Format(eDay, "yyyymmdd") について、いろいろなヘルプで『wsDay』を検索してみましたが HITせず、恐らくyyyy/mm/dd を yyyymmdd に変換する というコードだと思うのですが、その解釈でよろしいでしょうか? それは、今回のように日付に限らず、数値を文字列に変換するという ことに使えるのでしょうか?? (パナ) ---- えっと・・・『wsDay』は、私が勝手につけた変数名なので。。。 Dim LastRow As Long Dim sDay As String, eDay As String Dim wsDay As String, weDay As String ~~~~~ ~~~~~ LastRow や sDay や eDay と同じです。 コードの初め頃に出てくる > LastRow = .Range("A" & .Rows.Count).End(xlUp).Row この部分で、LastRow と言う変数には A列の入力が有る一番下のセルの行数が入ります。 > sDay = Format(Date - Day(Date) + 1, "yyyy/m/d") この部分で、sDay と言う変数には 今日の年月日 - 今日の日付 +1 = 今月の一日の日付 が、yyyy/m/d の形で入ります。 今日は 2009/8/28 なので、2009/8/1 と言う文字列が入ります。 >wsDay = Format(sDay, "yyyymmdd") その日付を yyyymmdd になおして wsDay に入れます。 sDayが 2009/8/1 なら wsDayは 20090801 です。 >yyyy/mm/dd を yyyymmdd に変換するというコードだと思うのですが、 >その解釈でよろしいでしょうか? やっている事はそうですが、丸覚えをすると応用ができないと思います。 最初に書いて居られるように、ワークシート上では TEXT関数を使って =TEXT(F2,"YYYYMMDD") の様に書きますね。 マクロでそれにあたる関数が Format関数です。 ですから、TEXT関数の様に使えば良いと思います。 今回のエラーを想像すると ワークシート上で A列を文字列に設定し 2009/8/1 と 20090801 を入力 B列に TEXT関数で yyyymmdd と yyyy/m/d に変換しようとすると [A] [B] [1] 2009/8/1 20090801 ←=TEXT(A1,"yyyymmdd") [2] 20090801 #VALUE! ←=TEXT(A2,"yyyy/m/d") B2は #VALUE! に成ります。 文字列で入力された 2009/8/1 は 20009年の8月1日 と考えて処理をしてくれますが 文字列で入力された 20090801 は そうは思ってくれない様です。 (yyyymmddのつもりなのか何なのか、エクセル君にわかるわけないですし  20090801をシリアル値と考えると「何年の話し?」って事に成りますから  当然と言えば当然ですが。。。) ですから sDay = Format(Date - Day(Date) + 1, "yyyymmdd") eDay = Format(DateAdd("M", 2, sDay) - 1, "yyyymmdd") 上の行でsDayに入った 20090801 が ~~~~ ここで 日付として計算できず、エラーになっていたのではないかと思います。 (HANA) ---- (HANA)さん 具体的にご説明いただきまして、本当にありがとうございます!! 例を使って説明していただいたお陰で、とっても分かりやすく、 且つ、今回間違えてその上理解できたので、今後今回の事を思い出して 応用が出来そうです。 しかしながら、まだまだ他のコードについては全くの初心者なので、 勉強が必要ですが・・・。 本の少しだけ、コードの構成が分かった気がします。 変数というのがどういうものなのか、どう使うのかぐらいですが・・・。 後はコード(関数)を理解としないといけないですね。 また、なぜ処理が止まってしまったのかも納得できました。 なにからなにまで、ありがとうございました。 感激です!! (パナ) ---- (HANA)さん 再度質問なのですが、よろしいでしょうか?? コードをずっと見ていて、少しずつ解釈して行こうと思っているのですが・・・。 下記のコードの意味を教えていただけませんか? .Range("F2:F" & LastRow).NumberFormatLocal = "yyyymmdd" 先ほど教えていただいたFormat関数が途中出てきているのですが、 F2の列をどうしている事になるのですか?? お手数おかけいたしますが、コメントよろしくお願いいたします。 (パナ) ---- というか、NumberFormatLocalは変数という事ですか? (パナ) ---- (HANA)さん 何度もスイマセン・・・。 実は、元々のコードと、HANAさんが教えてくださったコードを見比べていたのです。 で、何がいけなかったのか、どうしたら改善できたのかを見ていて、 .NumberFormatLocal = "yyyymmdd" というコードがHANAさんのコードにはなかったのです。 例えば、求める結果を変更したいとき、 F列の納期日のところが、見かけ上yyyymmdd・数式バーyyyy/mm/ddという前提で 処理をしてきましたが、見かけも、数式バーもyyyy/mm/ddという場合では、 HANAさんのコードでは処理が走りませんでした。 元々のコード表の .Range("F2:F" & LastRow).NumberFormatLocal = "yyyymmdd" を変更し .Range("F2:F" & LastRow).NumberFormatLocal = "yyyy/mm/dd" に変更してみたら処理が走りました。 もちろん、求めたい形はHANAさんに教えていただいたコードでうまく行くのですが、 F列がyyyy/mm/ddだった場合はどこをどう変更したらいいのか分からなかったのです。 お手数ですが、教えていただけると助かります。 (パナ) ---- えっと、ファイルを消してしまって 試せないのでお伺いするのですが F列の日付が  数式バーに yyyy/mm/dd と表示されていて  セルにも yyyy/mm/dd と表示されていたら 私が載せたコードが動かない ・・・って事ですか? で、その場合は  .Range("F2:F" & LastRow).NumberFormatLocal = "yyyy/mm/dd" を入れると動くようになる? でも、F列は最初から yyyy/mm/dd と表示されているのですよね? >求めたい形はHANAさんに教えていただいたコードでうまく行くのですが ・・・上手く行くってこと? >例えば、求める結果を変更したいとき、 【どの様に変更したいのか】をお伺いしないといけない ってことかな・・・? どの様に変更したいのでしょう? (HANA) ---- >F列の日付が >数式バーに yyyy/mm/dd と表示されていて >セルにも yyyy/mm/dd と表示されていたら >私が載せたコードが動かない >・・・って事ですか? そうなんです。 >で、その場合は >.Range("F2:F" & LastRow).NumberFormatLocal = "yyyy/mm/dd" >を入れると動くようになる? いえ。HANAさんのコードで試したのではなくて、もともと私が使っていたコードで、 Sub Macro1() Dim LastRow As Long Dim sDay As String, eDay As String With Worksheets("Sheet1") '実行シート LastRow = .Range("A" & .Rows.Count).End(xlUp).Row .Range("F2:F" & LastRow).NumberFormatLocal = "yyyymmdd"   <=ココの部分を変更しました .Columns("C:D").Insert Shift:=xlToRight .Range("C2:C" & LastRow).FormulaR1C1 = "=VLOOKUP(RC[-1],品番リスト!R1C4:R561C5,2,0)" .Range("D2:D" & LastRow).FormulaR1C1 = "=VLOOKUP(RC[-2],品番リスト!R1C4:R561C19,16,0)" .Range("C1:D1").Value = Array("P品番", "仕コード") With .Columns("C:D") .Value = .Value .AutoFit End With sDay = Format(Date - Day(Date) + 1, "yyyy/m/d") eDay = Format(DateAdd("M", 2, sDay) - 1, "yyyy/m/d") .Range("Q1:T1").Value = Array("P品番", "仕コード", "納期日", "納期日") myFilter .Range("A1:O" & LastRow), "21291", sDay, eDay, "内示(21291)" myFilter .Range("A1:O" & LastRow), "<>21291", sDay, eDay, "内示(21291以外)" sDay = Format(DateValue(eDay) + 1, "yyyy/m/d") eDay = Format(DateAdd("ww", 11, Date) - Weekday(Date) + vbFriday, "yyyy/m/d") myFilter .Range("A1:O" & LastRow), "21291", sDay, eDay, "情報(21291)" myFilter .Range("A1:O" & LastRow), "<>21291", sDay, eDay, "情報(21291以外)" .Range("Q1:T2").ClearContents End With End Sub Sub myFilter(myRng As Range, mCode As String, msDay As String, meDay As String, MakeShName As String) With myRng.Parent .Range("Q2:T2").Value = Array("<>#N/A", mCode, ">=" & msDay, "<=" & meDay) myRng.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=.Range("Q1:T2"), Unique:=False Worksheets.Add after:=Sheets(Sheets.Count) ActiveSheet.Name = MakeShName .Range("A1").CurrentRegion.Copy Sheets(MakeShName).Range("A1") .ShowAllData End With End Sub これです。 ただしこれは、結果的に納期日がyyyy/mm/ddになってしまうので、 HANAさんが教えてくださったコードで求めたい形となっているのです。 今困っている事は、元々のデータのF列が、今まで使っていたのは セルの書式設定が【ユーザー定義】設定となっていて、エクセルシート上、 見かけはyyyymmddなのですが、数式バーを見るとyyyy/mm/ddとなっているので、 そのセルの書式設定が【日付】となり、見かけも数式バーもyyyy/mm/ddになった場合は 処理が走らなかったのです。 これは、コードの変更をしなきゃいけないんだと思って、考えていたのです。 求めたい結果を変更したいのではなく、処理前のデータが変わったときは コードがどうなるのか、知りたかったのです。 このような説明で分かりますでしょうか?? お手数おかけいたしますが、何卒よろしくお願いいたします。 (パナ) ---- すみません、遅くなりました。 もう一度確認させてください。 通常は最初の段階で、 F列の日付が「20091008」の様に表示されていて 数式バーには「2009/10/8」と表示されている。 のですか? そしてこの状態で、最後に載せられたコードの > .Range("F2:F" & LastRow).NumberFormatLocal = "yyyymmdd"   <=ココの部分を変更しました が【無い】状態で実行をすると、エラーになりますか? または、コード実行前に F列の日付を「2009/10/8」の表示に変更して  (数式バーには「2009/10/8」と表示されている。) 最後に載せられたコードの > .Range("F2:F" & LastRow).NumberFormatLocal = "yyyymmdd"   <=ココの部分を変更しました が【無い】状態で実行をすると、エラーになりますか? この部分は、表示形式を変更しているだけなので どうなっていても関係ないと思いますが。。。 まずは、コード内で表示形式の変更を行うのではなく 実行前に表示形式を変更しておいて 本当に表示形式が影響しているのかどうか 確認してみてもらえますか? ちなみに、コードが シートモジュールに書いてあるのではないかと思いますので 標準モジュールに移動させておいていただくのが良いと思います。 標準モジュールは、コードが書いてあるウィンドウのメニューで  挿入(I)→ 標準モジュール(M) と進むと挿入できます。 (HANA) ---- (HANA)さん こちらこそ、遅くなりまして申し訳ございません。 >もう一度確認させてください。 >通常は最初の段階で、 >F列の日付が「20091008」の様に表示されていて >数式バーには「2009/10/8」と表示されている。 >のですか? 通常は、F列の日付「2009/10/8」 数式バー「2009/10/8」 と表示されています。 当初質問していたときは F列の日付「20091008」で数式バー「2009/10/8」だったのですが、 変更になったため、コードを変更しなければと思い立ったのです・・・。 >そしてこの状態で、最後に載せられたコードの >> .Range("F2:F" & LastRow).NumberFormatLocal = "yyyymmdd"   <=ココの部分を変更しました >が【無い】状態で実行をすると、エラーになりますか? > >または、コード実行前に >F列の日付を「2009/10/8」の表示に変更して > (数式バーには「2009/10/8」と表示されている。) >最後に載せられたコードの >> .Range("F2:F" & LastRow).NumberFormatLocal = "yyyymmdd"   <=ココの部分を変更しました >が【無い】状態で実行をすると、エラーになりますか? いいえ。HANAさんに教えていただく前のコードではエラーになりませんでした。 >まずは、コード内で表示形式の変更を行うのではなく >実行前に表示形式を変更しておいて >本当に表示形式が影響しているのかどうか >確認してみてもらえますか? 早速実行してみました。 HANAさんに教えていただいたコードで、実行前に、F列のセルの書式設定にて表示形式を 【日付】に変更し「2009/10/9」とし、実行しましたら、 Sheet1の「納期日」は数式バーも表示も「40102」となりました。 そして、その後できるはずの4つのシートについては、シート自体は出来上がるものの、 内容は1行目の項目だけ表示されあとは空白となっています。 また、教えていただいたとおり、標準モジュールに変更いたしました。 度々申し訳ございませんが、またアドバイスいただけると助かります。 何卒よろしくお願いいたします。 (パナ) ---- 済みません、わかりました。 Sub test のコードの内容が   r.Value = r.Text なので、 yyyymmddで表示されている時は yyyymmddの文字列に成りますが yyyy/mm/ddで表示されているときは シリアル値が返されるようです。 エクセルは日付を「シリアル値」と言う値で管理して居ます。 1 と入力されているセルの表示形式を日付にすると 「1900/1/1」と表示されますね。 つまり エクセルで「シリアル値の1」と言えば 1900/1/1 を表します。 今回表示された「40102」と言うセルには 2009/10/16 が 入っていたのですね。1900/1/1から 40102日後 です。 先にどの様に表示されていても、yyyymmdd にしたいのですから Format関数を使って変換することにしてみます。 '------ Sub test(ByRef rng As Range) Dim r As Range For Each r In rng r.Value = Format(r.Value, "yyyymmdd") Next rng.NumberFormat = "General" End Sub '------ これで試してみて下さい。 (HANA) ---- (HANA)さん バッチリうまく行きました。 本当に感謝いたします。 書式設定をyyyy/mm/ddにして処理すると、 シリアル値で認識されるので、今回のようなエラーになったのですね・・・。 今後、使いこなせるようになりたいと思います。 本当にありがとうございました。 (パナ) ---- 上手く行きましたか 良かったです。 メインのコードばかり見ていたので なかなか気づけずに済みませんでした。 既に完成している部分ですが (私も良くやってしまうことなので気づいたときに) 修正しておいた方が良いと思う点が 一箇所有ります。 シートの右側に 縦スクロールのバーが有ると思います。 コードを一度実行すると、その中の四角がやたらと小さく成りますよね。 原因は↓の部分で With .Columns("C:D") .Value = .Value .AutoFit End With この部分は   C:D列全体について    値として再度データを入れ直し    オートフィットをする と言う処理をしています。 使っていない所の値まで入れ直す必要は無いので   C:D列の最終行までの範囲の    セルに返されている値を値として入れ直し   C:D列をオートフィット にしておいた方が良さそうに思います。 コメントも書いててきとうに載せておきますので 必要な範囲と差し替えて頂ければと思います。 '↓C,D列を挿入 .Columns("C:D").Insert Shift:=xlToRight '↓C列の範囲に数式を入力 .Range("C2:C" & LastRow).FormulaR1C1 = "=VLOOKUP(RC[-1],品番リスト!R1C4:R561C5,2,0)" '↓D列の範囲に数式を入力 .Range("D2:D" & LastRow).FormulaR1C1 = "=VLOOKUP(RC[-2],品番リスト!R1C4:R561C19,16,0)" '↓C,D列の範囲を値に変更 .Range("C2:D" & LastRow).Value = .Range("C2:D" & LastRow).Value '↓C1,D1セルに見出しを入力 .Range("C1:D1").Value = Array("P品番", "仕コード") '↓C,D列の列幅を調整 .Columns("C:D").AutoFit (HANA)