プロが教える店舗&オフィスのセキュリティ対策術

Sub 点検()

Dim buf As String
Dim Path As String
Dim day As Variant
Dim man1 As String
Dim man2 As String
'-----------------------------------------------------------------------------
'ファイル選択
'-----------------------------------------------------------------------------
'このファイルがあるフォルダのパスを取得
Path = ThisWorkbook.Path
'該当するファイル名だけを取って来る (エクセルファイルだけ)
buf = Dir(Path & "\" & "点検.xlsx")
'指定したファイルを開く
Workbooks.Open Path & "\" & buf
'-----------------------------------------------------------------------------
'検索値の表示
'-----------------------------------------------------------------------------
MsgBox "置換前のシートは" & vbLf & "「" & Worksheets("年度ー月指定").Range("B4").Value & "年度" & Worksheets("年度ー月指定").Range("B5").Value & "月」のデータです"
'-----------------------------------------------------------------------------
'置換後の値を入力し、該当のセルに読み込ませる
'-----------------------------------------------------------------------------
label:
day = Application.InputBox(prompt:="置換後の「年度」を入力してください。記入例:2021/04/01 半角(キャンセル不可)", _
Title:="日付入力", _
Default:="2021/04/01")
If Not IsDate(day) Then
MsgBox "日付入力が誤っています。正しく入力してください(入力されるまで繰り返します)"
GoTo label:
End If
MsgBox day & "で置換します"
'入力値をセルに入れる
Worksheets("年度ー月指定").Range("B8").Value = day
'入力値を年度/月に分ける
Worksheets("年度ー月指定").Range("B9").Value = (Year(day))
Worksheets("年度ー月指定").Range("B10").Value = (Month(day))
'-----------------------------------------------------------------------------
'置換する範囲の選択 (日付~全員分) 【点検】
'-----------------------------------------------------------------------------
Range("D1:AH109").Select
'-----------------------------------------------------------------------------
'置換作業
'-----------------------------------------------------------------------------
'年度
Selection.Replace What:=Worksheets("年度ー月指定").Range("B4").Value, Replacement:=Worksheets("年度ー月指定").Range("B9").Value, LookAt:=xlPart
'月
Selection.Replace What:=Worksheets("年度ー月指定").Range("B5").Value, Replacement:=Worksheets("年度ー月指定").Range("B10").Value, LookAt:=xlPart

''-----------------------------------------------------------------------------
'''置換後の値を置換前に投入 置換後の値を削除
''-----------------------------------------------------------------------------
''置換後の値を置換前に投入
' Worksheets("年度ー月指定").Range("B3").Value = Worksheets("年度ー月指定").Range("B8").Value
' Worksheets("年度ー月指定").Range("B4").Value = Worksheets("年度ー月指定").Range("B9").Value
' Worksheets("年度ー月指定").Range("B5").Value = Worksheets("年度ー月指定").Range("B10").Value
''置換後の値を削除
' Worksheets("年度ー月指定").Range("B8:B10").ClearContents
''-----------------------------------------------------------------------------
''保存のメッセージ
''-----------------------------------------------------------------------------
MsgBox "完了しました。必ず保存してください"
End Sub



置換を実施するマクロを作成したいです。
多くのフォルダを置換するため、「ボタン用」ファイルを作成し、
各ボタンを押すと各フォルダ内のマクロが実行されていくというものを考えています。
マクロ作成は初心者です。

置換の行は、「マクロの記録」から引っ張っています。

>上記のプログラムで実施したところ
4 月のファイルから5月のファイルに変換したら、
なぜか、読み込みファイルデータの値の5が6になっていてうまく置換されていません。
同様に5月→6月にすると、投入データの6が7になります。





>環境
大元のフォルダ:①置換用フォルダ
        ②置換元ファイル

①置換用フォルダ
・実行ファイル用
(ここで「点検ファイル用」ボタンを押したら、点検ファイルのマクロが始まる的な仕様です)
・点検ファイル(年度/月を指定し、指定されたものを読み込み、置換)
 シートは「指定用のシート」「置換用(置換元フォルダと同じ形式)」のものがあります
 「指定用シート」は、まず2020/01/01と入力すると
  年度と月に分けてセルに設定しています

・保守ファイル
・完了ファイル

②置換元フォルダ

・2020年度「管理」.xlsx
・2021年度「管理」.xlsx
各月のデータがシートごとに管理されている(各シート名:4月/5月/6月・・・)

となっています。

質問者からの補足コメント

  • Worksheets("年度ー月指定").Range("B8").Value = day
    If Month(day) <= 3 Then
    年度 = Year(day) - 1
    Worksheets("年度ー月指定").Range("B9").Value = 年度 & "年度"
    Else
    年度 = Year(day)
    Worksheets("年度ー月指定").Range("B9").Value = 年度 & "年度"
    End If
    月 = (Month(day))
    Worksheets("年度ー月指定").Range("B10").Value = MonthName(月)
    >「年度/月」にできました。ですが検索する文字が「●月月」になってしまいました

      補足日時:2021/05/16 15:37
  • 補足は解決できました!
    しかし、
    参照先が 
    ①~\2020\2020年度管理表\●月  現在このフォルダのエクセルファイルを参照しているとして
    年度が変更になった場合
    ②~\2021\2021年度管理表¥●月.xlsx に置換したいのですが
    今のコード(「年度」「月」)だとフォルダ移動ができません。

    フォルダを「2021」ではなく「2021年度」に変更する以外に手はないのでしょうか。

      補足日時:2021/05/16 16:14

A 回答 (2件)

こんばんは


掲示のコードは選択範囲のデータが、B4セルの値と同じ値がB9セルの値に書き替えられ、同様にB5セルの値と同じ値がB10セルの値に書きられるもので
+1される処理はありません。

したがって事象を想像すると
書き替え先シートには参照式や関数式があり、該当部分は =?セル+1などとなっているのでは無いかと推察いたします。

余談ですが
記録マクロを元にとの事で仕方ないかも知れませんが、記録時に該当シートを記録できるように手順を工夫した方が良いです。
もし記録できなかった場合でも、書き直し、成型などをする時にシートなどを明示しましょう。

Range("D1:AH109").Select は、どのブックでどのシートでしょうか。

また、この実行コードは例えば 
Worksheets("年度ー月指定").Range("B5").Valueが 3 の時に
2021/04/1(デフォルト)で実行した場合、書き替え範囲にある 例えば 3は4に 13は14に333は444に434は444になります。
これで問題ないデータなのでしょうか?疑問です。

完全一致のみ書き替えたり、月や年を加えたり、対象データにもよりますが、
そもそも、数式が入っているとしたら範囲でReplaceがで妥当なのかも
検討が必要と思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!

①書き替え先シートには参照式や関数式があり、該当部分は =?セル+1などとなっているのでは無いかと推察いたします。
>すみません。
 書き換え先の参照式に誤りがありました。ありがとうございます!

②記録マクロを元にとの事で仕方ないかも知れませんが、記録時に該当シートを記録できるように手順を工夫した方が良いです。
もし記録できなかった場合でも、書き直し、成型などをする時にシートなどを明示しましょう。
Range("D1:AH109").Select は、どのブックでどのシートでしょうか。

以下のように、シートが変わる部分を、明示する認識で大丈夫でしょうか?
Worksheets("設備点検").Select
MsgBox day & "設備点検シートを開きます"
Worksheets("設備点検").Range("D1:AH109").Select

③Worksheets("年度ー月指定").Range("B5").Valueが 3 の時に
2021/04/1(デフォルト)で実行した場合、書き替え範囲にある 例えば 3は4に 13は14に333は444に434は444になります。
これで問題ないデータなのでしょうか?疑問です。

完全一致のみ書き替えたり、月や年を加えたり、対象データにもよりますが、そもそも、数式が入っているとしたら範囲でReplaceがで妥当なのかも
検討が必要と思います。

入力した値(今回のコードでは「2021/05/01」)を
「2021年度」「5月」という表記への変更の仕方と、
変更後の置換の仕方がわからず、数値のみ置換するものにしております。
 いろいろ探しては見たのですが、うまくいかず・・・。

【年度ー月指定シートの中身は】
現在「点検シート」の値
(行列)  A   :B
1:  年/月/日 2021/6/1
2:   年度    2021
3:   月     6

置換後の値
行列  A   :B
1: 年/月/日 「2021/05/01」 ←入力値の記憶場所
2:  年度   「2021」
3:  月     「5」

このB4、B9には「年度」、B3、B10には「月」を入れて
それを置換したいとは思っているんですが・・・。

お礼日時:2021/05/16 14:55

>補足は解決できました!


色々調べて試していけば、解決できると思っていました。

>②~\2021\2021年度管理表¥●月.xlsx に置換したいのですが
今のコード(「年度」「月」)だとフォルダ移動ができません。
フォルダを「2021」ではなく「2021年度」に変更する以外に手はないのでしょうか。

これは、ご質問が良く理解できないのですが、
セル範囲の文字列置き換えでなくファイルパスの文字列での書き替えです。
Replaceを使用したいのであれば、パスをString型変数に代入しておき
Replace 関数を使用してその文字列に書き替え処理をすれば良いです。

ファイルの移動やフォルダの作成などを希望なら
CreateObject("Scripting.FileSystemObject")などを使いと良いかも知れません。
いずれにしても書き替えたファイルをどのように扱うのかなどを明確にする必要があります。また、
既にご質問から離れるご質問であると共にコードにあるファイルパスは
Path = ThisWorkbook.Path であり、これは、VBA実行ブックと同じフォルダ内にある事を意味していますので、新しく保存したファイルに対してはこのVBAを実行しないと言う事になると思います。
そのあたりを整理して別のご質問としてスレッドをたててください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!