[[20210623090246]] 『VBA ファイルの保存場所について』(まさる) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA ファイルの保存場所について』(まさる)

こんにちは。VBA初心者ですがお力を貸していただけないでしょうか?

現在以下のようにエクセルのファイルをフォルダに保存しております。

Sub 保存()

    a = Range("A1").Value
    b = Format(Now(), "mmdd-hhmmss")
    c = a & "_" & b & ".xlsm"
    d = ThisWorkbook.path & "\" & c

    ThisWorkbook.SaveAs Filename:=d

End Sub

"A1"は個人名が入力されており、誰が何時に作成保存したのかがわかるようにしております。
そこでご質問なのですが、現在このブックが保存されている同一フォルダ内にもうひとつフォルダを作成し、たとえば特定の文字等が入力されているときにはそのフォルダに保存するにはどうすればよいでしょうか?

ご存知かと思われますが、現在このファイルが格納されているフォルダに保存されていますが、セル"B1"に特定の文字が入力されている場合同一フォルダ内に作成した新たなフォルダに保存するといった具合です。

以上よろしくお願いします。

< 使用 Excel:Office365、使用 OS:Windows10 >


instr関数で、含まれているかの判断ができます。

新たなフォルダは、
「d = ThisWorkbook.path & "\" & c」
の行でやっているように、「& "\フォルダ名" &」を文字列結合させればよいかと。
(az) 2021/06/23(水) 09:39


早速のアドバイスありがとうございます。
当方の無知で大変もうしわけございませんが、
具体的にコードはどのように記載すればよいでしょうか?
(まさる) 2021/06/23(水) 09:53

もしかして新たなフォルダを作るコードということでしょうか?
とりあえずなら
http://officetanaka.net/excel/vba/statement/MkDir.htm
余裕があれば FileSystemObject を勉強すると良いと思います。
http://officetanaka.net/excel/vba/filesystemobject/filesystemobject.htm
(名無し) 2021/06/23(水) 12:37

いえフォルダはすでにあります。
もしかしてそんなに難しいコードが必要なのでしょうか?

単純にIFでの条件式を利用してそれぞれのフォルダに保存するようにすればよいと思ったのですが、、
もうひとつのフォルダパスを指定するコードがわからないのです。

ThisWorkbook.SaveAs Filename "c\フォルダの場所¥ファイル名"で指定してもうまくそのフォルダに保存されません。
指定方法が間違っているのでしょうか?
(まさる) 2021/06/23(水) 13:22


ちょっと状況がわからないので確認です。

■1
提示のコードを整理するとこんな感じになろうかとおもいます。

    Sub 整理()
        ThisWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & ActiveSheet.Range("A1").Value & "_" & Format(Now(), "mmdd-hhmmss")
    End Sub

これを、例えば山田さんが動かすと↓のようになっていくとおもうのですが、

 C:\hogehoge
 ├元々のマクロブック.xlsm
 ├山田_0623-095037.xlsm
 ├山田_0623-100240.xlsm
 ├山田_0623-100302.xlsm
 └山田_0624-134837.xlsm

「セル"B1"に特定の文字が入力されている場合同一フォルダ内に作成した新たなフォルダに保存」とは↓のようになればいいのですか?

 C:\hogehoge
 ├元々のマクロブック.xlsm
 ├山田_0623-095037.xlsm
 ├山田_0623-100240.xlsm
 ├山田_0623-100302.xlsm
 ├山田_0623-100302.xlsm
 └新たなフォルダ_0624-134837   ←セル"B1"に特定の文字が入力されている場合
  └山田_0624-134837.xlsm

■2
存在しないフォルダには保存できないので、実際には

 1) B1セルに特定の文字があるか判定する
 【条件を満たす】
 2-1) ↑が真の場合、フォルダを作成する★
 2-2) 名前を付けて(別名で)保存する↑に保存する
 【条件を満たさない】
 3) 名前を付けて(別名で)自ブックと同じフォルダに保存する

といったプロセスになろうかとおもいます。
このとき、フォルダ名はどういうルールで作成するのですか?(★の部分の処理です)

■3
提示されたコードだと、フォルダパスを「ThisWorkbook.Path」で取得しています。
そして、条件を満たしたときは【新しく作った】フォルダに保存すると仰っています。
ということは、何度もそのマクロを動かすと↓のようになりますが、それで構わないのですか?(そういう設計なのですか)

 (見やすさの観点からいくつかのファイルは除外してます)
 C:\hogehoge
 ├元々のマクロブック.xlsm
 └新たなフォルダ_0623-095037
  ├山田_0623-095037.xlsm
  └新たなフォルダ_0623-100240
   └新たなフォルダ_0623-100302
    └新たなフォルダ_0624-134837

要は、自ブックが保存されてるフォルダの下位に新規フォルダを作る設計にするなら、条件を満たしていたらどんどん下位フォルダを作っちゃうと思いますがそれでよいのかという確認です。

(もこな2) 2021/06/23(水) 13:33


詳しい説明ありがとうございます。
まさに1の状態だと思います。

もともとフォルダ内に該当ファイルがあります。
通常はご指摘どおり1の前半部分のように保存されていきます。

そのフォルダ内に別のフォルダをあらかじめ用意し特定の条件に一致するファイルは
そちらに保存されるというようにしたかったのです。

├元々のマクロブック.xlsm ←フォルダAとします

 ├山田_0623-095037.xlsm
 ├山田_0623-100240.xlsm
 ├山田_0623-100302.xlsm
 ├山田_0623-100302.xlsm
フォルダ内A内にあるフォルダB(事前にフォルダは作っています) ←特定の条件のとき
└山田_0624-134837.xlsm

なので、通常保存はフォルダA
特定の条件のときはフォルダBに保存をしたいです。

わかりにくい説明で申し訳ございません。
よろしくお願いします。

(まさる) 2021/06/23(水) 15:35


 ↑の条件ならば、ご提示のコード内に書くのであれば、
 d = ThisWorkbook.Path & "\フォルダB\" & c
 azさんの説明をよく読むと理解できると思うのですが

 >ThisWorkbook.SaveAs Filename "c\フォルダの場所¥ファイル名"
 これがVBEからコピー&ペーストしたものだとしたら間違っています。
 ・c\のcがCドライブのことなら、C:←ドライブを表す(コロン「:」が必要)
 ・同cが変数であるのなら c & "\フォルダの場所¥ファイル名"
 (変数は""で囲まない。&で繋ぐ)(azさんのアドバイス通り)
 になるのではないでしょうか。

(名無し) 2021/06/23(水) 21:36


思っているのとは違うでしょうけど、私なら自ブックをそのまま保存するんじゃなくて、必要なシートを新規ブックに【コピー】してから保存しますかね。
    Sub さんぷる()
        Dim フォルダ As String
        With ActiveSheet
            If .Range("B1").Value = "特定の文字" Then
                フォルダ = ThisWorkbook.Path & "\フォルダB\"
            Else
                フォルダ = ThisWorkbook.Path & "\"
            End If

            .Copy
            Workbooks(Workbooks.Count).SaveAs _
                Filename:=フォルダ & .Range("A1").Value & "_" & Format(Now(), "mmdd-hhmmss")

            Workbooks(Workbooks.Count).Close
        End With
    End Sub

(もこな2) 2021/06/25(金) 15:48


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.