QA@IT

Excelのマクロについて

2862 PV

CSVファイルからXLSファイルにデータインポートするマクロ(①)を実施し、XLSファイルに①のマクロを含むブックを内包するマクロで複製し
XLSファイル名の「年」に該当する部分をカウントアップしたファイル名で保存するマクロ(②)を実施しています。

②のマクロを行う際に、①のマクロのコードに記述しているファイル名の「年」に該当する部分も
カウントアップして表示されるようにしたいのですが、苦慮しております。アドバイスをお願いします。

H25ABC.XLSというファイルがあります。
複製すると、ファイル名は、H26ABC.XLSになりますが、①のマクロの内容は、H25ABC.XLSの状態のままです。
Hは平成、25は25年度の事です。

① CSVファイルからデータをインポートするマクロ(H25ABC.XLSで実行します)


Sub データコピー()
    Application.ScreenUpdating = False

    Workbooks.Open "C:\フォルダ\ZZZ.csv"

    Set MyRange = Range("A:A").Find(What:="売上")
    If MyRange Is Nothing Then
        MsgBox "検索失敗"
        Exit Sub
    Else
        MyRange.Offset(0, 1).Copy Workbooks("H25ABC.xls").ActiveSheet.Range("B4")
    End If

    Set MyRange = Range("C:C").Find(What:="値引")
    If MyRange Is Nothing Then
        MsgBox "検索失敗"
        Exit Sub
    Else
        MyRange.Offset(0, 1).Copy Workbooks("H25ABC.xls").ActiveSheet.Range("C4")
    End If

    Set MyRange = Range("G:G").Find(What:="純売")
    If MyRange Is Nothing Then
        MsgBox "検索失敗"
        Exit Sub
    Else
        MyRange.Offset(0, 1).Copy Workbooks("H25ABC.xls").ActiveSheet.Range("E4")
    End If

    Windows("ZZZ.CSV").Close

    Set book1 = ActiveWorkbook
    book1.Save
    Range("A1").Activate
    Application.ScreenUpdating = True
End Sub

② ①のマクロを含むブックを内包するマクロでコピー、その際に「年」に該当する部分をカウントアップしたファイル名で保存するマクロ(H25ABC.XLSで実行します)

Sub ボタン2Click()
    Dim fName As String, flg As Boolean, i As Integer, myNum
    Dim FSO As Object
    On Error Resume Next

    fName = ThisWorkbook.Name
    flg = False

    For i = 1 To Len(fName)
        If Mid(fName, i, 1) Like "[0-9]" Then
            flg = True
            myNum = myNum & Mid(fName, i, 1)
        Else
            If flg Then Exit For
        End If
    Next i

    If myNum = "" Then Exit Sub
    fName = Replace(fName, myNum, myNum + 1, 1, 1)

    Set FSO = CreateObject("Scripting.FileSystemObject")
    FSO.CopyFile ThisWorkbook.FullName, ThisWorkbook.Path & "\" & fName
    Set FSO = Nothing
End Sub

H25ABC.XLSで、②のマクロを実施すると、Excelのファイル名の「年」に該当する部分はアップします。(H25ABC.XLS→H26ABC.XLS)
しかしH26ABC.XLSの①のマクロのコードにあるH25ABC.xlsは、H25ABC.xlsという記述のままです。
そしてH26ABC.XLSで①のマクロを実施してもファイル名が異なる(H25ABC.XLSという 記述の為)為に、実行不可です。
②のマクロを実施する時に、①のマクロの「年」に該当する部分をカウントアップするように記述を変更する事は可能でしょうか?

H26ABC.XLSでマクロを実施した場合、①のマクロの「年」に該当する部分は、H27ABC.XLSになります。
H27ABC.XLSでマクロを実施した場合、①のマクロの「年」に該当する部分は、H28ABC.XLSになります。
1ずつ上げて行きたく思います。

ご教授ください。

よろしくお願いします。

  • ファイル名をThisWorkbook.Nameにするだけでできました。本当にありがとうございました -

回答

整理させていただきますが、

  • H25ABC.xlsというExcelブックファイルがあり、①のマクロを含む。
  • ②のマクロによって翌年や翌々年に向けてファイル名の元号をカウントアップしながらH25ABC.xlsをコピーすることができる。
  • ところが①のマクロには自ブックを表す"H25ABC.xls"が直接書き込まれているのでファイル名が変わると①のマクロが動かない。
  • マクロ内のコードをマクロによって書きかえることができるか。

という事ですね。

結論から言えば別の方法でできます。

まずマクロのコードをマクロから書きかえる事はできません(書き換えというかコード追加は無理をすればできますがイレギュラーなやり方な上、現在はセキュリティ設定の変更も必要だったりするのでできないと思っておいていいでしょう)。
ですが、マクロの中から自ブックのファイル名を取得できます。

ThisWorkbook.Nameで、そのマクロが属するブックの名前が取得できます。
似たようなものに ファイル名だけでなくパスも取得できる ThisWorkbook.FullName、パスだけを取得できる ThisWorkbook.Pathなどもあります。

(新規作成して)一度も保存されていないBookで取得すると期待通りの値が取れないかもしれませんので気を付けてください。

例えば

MyRange.Offset(0, 1).Copy Workbooks("H25ABC.xls").ActiveSheet.Range("B4")

となっている部分を

MyRange.Offset(0, 1).Copy Workbooks( ThisWorkbook.Name ).ActiveSheet.Range("B4")

というようにしてみてはいかがでしょうか

編集 履歴 (1)
ウォッチ

この質問への回答やコメントをメールでお知らせします。