Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows XP全般 : Excel 2013)
ブック名が固定されていないエクセルブックをコピーしたい
投稿日時: 17/08/18 10:57:25
投稿者: どすこい

所定のフォルダ配下に配置されるエクセル(必ず1個)を、マクロでブックごとバックアップ用にコピーしたいのですが、「ファイル名または番号が不正です」というエラーが出てしまいます。
 
C:\AAA のフォルダ配下にある「●●●.xlsx」(←●●●部分は常に変動する)を
C:\AAA のフォルダ配下に「バックアップ用●●●.xlsx」というファイル名にしてコピーしたいです。
 
どなたかコマンドをご存知の方、教えてください。

投稿日時: 17/08/18 11:00:36
投稿者: どすこい

ちなみに、コピーしたいエクセルは常に閉じているので、FileCopyコマンドを使わなければいけないことは
調査済みです。。

回答
投稿日時: 17/08/18 11:10:01
投稿者: WinArrow
投稿者のウェブサイトに移動

>C:\AAA のフォルダ配下にある「●●●.xlsx」(←●●●
は、どのように取得するのですか?
 
例えば
 
Dim 元ファイル AS String
という変数に取得したとしたとして
その値は、
「C:\AAA\●●●.xlsx」
となります。
 
問題は、「●●●」の文字列位置の取得になります。
「●●●」の前には、「\」があり、後ろには「.xlsx」があるわけです。
Dim 位置前 As Long,位置後 As Long
位置前 = InSTrRev(元フィル,"\") + 1
位置後 = InSTrRev(元フィル,".Xlsx") - 1
で取得可能です。
 
後は
Mid関数で「●●●」が取得できますね・・・
 

投稿日時: 17/08/18 12:32:06
投稿者: どすこい

WinArrow様
 
早速コメントありがとうございます。
正直、コピー後のファイル名は固定値でもよく(例えば「バックアップ用.xlsx」でもいいです)、
以下のようなコマンドを書きましたが、、「ファイル名または番号が不正です」というエラーが出てしまいます。
  
    FileCopy "C:\AAA\*.xlsx", "C:\AAAA\バックアップ用.xlsx"
 
もし、エラー対処方法が判れば教えてください。。
 

回答
投稿日時: 17/08/18 13:34:12
投稿者: simple

Dir("C:\AAA\*.xlsx") で戻ってくるファイル名を使って、FileCopyすればよいのでは?

回答
投稿日時: 17/08/18 15:54:17
投稿者: WinArrow
投稿者のウェブサイトに移動

どすこい さんの引用:

 
早速コメントありがとうございます。
正直、コピー後のファイル名は固定値でもよく(例えば「バックアップ用.xlsx」でもいいです)、
以下のようなコマンドを書きましたが、、「ファイル名または番号が不正です」というエラーが出てしまいます。
  
    FileCopy "C:\AAA\*.xlsx", "C:\AAAA\バックアップ用.xlsx"
 
もし、エラー対処方法が判れば教えてください。。
 

 
固定値でも構わない
FileCopyは、無条件で上書きしてしまいますが
‥‥本当に大丈夫なんですか?
 
エラーの原因は、*.xlsxで、ファイル名を特定してないからです。
 
困っているのは、複写元ファイル名が可変なのではないですか?
困っていることとやろうとしていることが、ミスマッチのような気がします。
 
 

投稿日時: 17/08/18 15:59:28
投稿者: どすこい

皆様
 
お知恵をいただきありがとうございます。
 
>固定値でも構わない
>FileCopyは、無条件で上書きしてしまいますが
>‥‥本当に大丈夫なんですか?
旧ファイルに上書きではなく、別ブックとしてコピー保存したいのです。
 
>エラーの原因は、*.xlsxで、ファイル名を特定してないからです。
問題は、ここなのですね!ありがとうございます。
 
>困っているのは、複写元ファイル名が可変なのではないですか?
>困っていることとやろうとしていることが、ミスマッチのような気がします。
はい、複写元ファイル名は可変なので、そこもどのようにコマンドを書けばよいのか分からないでおります。
 
 FileCopy "C:\AAA\*.xlsx", "C:\AAAA\バックアップ用.xlsx"
 
複写元のファイル名が可変の場合、上記コマンドの"C:\AAA\*.xlsx"部分はどのように書いたらよいのか、
教えていただけると助かります。

回答
投稿日時: 17/08/18 16:08:37
投稿者: WinArrow
投稿者のウェブサイトに移動

最初のレスに戻りますが、
 
ファイル名がかへんなんだから、
そのファイル名をどのように取得しているのかをキチンを説明しましょう。
 

回答
投稿日時: 17/08/18 16:11:31
投稿者: simple

ああ、読み違いしていました。
>エクセル(必ず1個
とあるので、そのフォルダには1個のxlsxファイルしかないかと思いました。
そのフォルダの配下のバックアップというサブフォルダにコピーするのかと誤読していました。
 
しかし、頭に"バックアップ"をつけた名前にするだけで、
同じフォルダにコピーしたら、1個じゃなくなりますよね。
 
すなおに、GetOpenFilenameを使ってファイルを指定するようにしてやれば、
いくらでもFileCopyに持ち込めるじゃありませんか。

投稿日時: 17/08/18 16:14:13
投稿者: どすこい

復元元のファイル名は、●●●の部分を複数人が好き勝手に命名しており、
例えば「田中20170810.xlsx」のように自分の名前と日付を入れてファイル保存する人もいれば、
「チェック用.xlsx」というファイル名をつけて、Cドライブの特定フォルダに置いています。
 
ファイルは必ず、C:\AAA のフォルダ配下に置くルールになっております。

投稿日時: 17/08/18 16:20:30
投稿者: どすこい

説明がわかりにくくてすみません。
順序通りに書きますと、、、
 
@C:\AAAのフォルダ配下に毎朝1個の「●●●.xlsx」(←●●●部分は可変)をAさんが保存する
ABさんはその後C:\AAAのフォルダ配下にある「●●●.xlsx」をそのままコピーして、別名で同じ階層の
 フォルダに保存する。
BBさんは、その後C:\AAAのフォルダ配下にあった複写元ファイル(上記@)を手動削除する。
CAさんは翌朝@の作業を始める前に、昨日Bさんが作成したコピーファイル(上記A)を手動削除する。
 
こういった機械的な作業をしており、Aの部分をVBAで対応したいのが、やりたいことです。
 

回答
投稿日時: 17/08/18 16:26:56
投稿者: WinArrow
投稿者のウェブサイトに移動

もう一度、書きます
 
投稿日時: 17/08/18 11:10:01
投稿者: WinArrow
 
のレスをよく読んでください。
 
誰がどのっようなファイル名を付けるかは問題ではないです。
 
どのようにファイル名を取得する・・・
つまり
複写元のファイルの選択から、教えてください
 
ということですか?

回答
投稿日時: 17/08/18 16:27:05
投稿者: simple

結局のところ、
コピーする前は、必ず.xlsxファイルはひとつだけなんですか?
複数の人が使うようですが。

投稿日時: 17/08/18 16:29:16
投稿者: どすこい

>どのようにファイル名を取得する・・・
>つまり
>複写元のファイルの選択から、教えてください
当日当番の人が、共有PCのC:\AAA のフォルダ配下に手動でファイルを作成&保存しています。
 

投稿日時: 17/08/18 16:30:07
投稿者: どすこい

>結局のところ、
>コピーする前は、必ず.xlsxファイルはひとつだけなんですか?
>複数の人が使うようですが。
はい、コピーする前は、必ず.xlsxファイルは一つしかないです。
 

回答
投稿日時: 17/08/18 16:36:00
投稿者: WinArrow
投稿者のウェブサイトに移動

どすこい さんの引用:
>どのようにファイル名を取得する・・・
>つまり
>複写元のファイルの選択から、教えてください
当日当番の人が、共有PCのC:\AAA のフォルダ配下に手動でファイルを作成&保存しています。
 

 
 
質問の意図が伝わっていないようですね?
 
>手動でファイルを作成&保存しています。

FileCopy
との関連が理解できないんですが・・・
 
 
共有フォルダに手動で〜〜〜ではなく
 
プログラムとして、どのように複写対象のファイルを選択しているんですか?
ということです。

回答
投稿日時: 17/08/18 16:46:25
投稿者: WinArrow
投稿者のウェブサイトに移動

少し話を整理しましょう。
 
(1)「所定のフォルダ配下に配置されるエクセル(必ず1個)を、マクロでブックごとバックアップ用にコピーしたい」について
>ブックごとバックアップ
この表現、おかしくないですか?
「フォルダごとバックアップ」または、「ブックをバックアップ」
ならば理解できますが、1つしか存在しないブックに対する表現としては理解しがたいです。
下に書かれてコードをみて、「ブックをバックアップ」と解釈していますが・・・・
 
>「ファイル名または番号が不正です」というエラーが出てしまいます。について
 
どのようなコードを記述しているのか?
かみ合わない話をしていてもらちがあきませんから、
一部分だけではなく、全部のコードを掲示してください。
 
回答者は、「掲示されたもの」や「説明」からしか
推測できません。
 

回答
投稿日時: 17/08/18 16:53:18
投稿者: simple

こんな感じのコードになるんじゃないですか?

Sub test()
    Const folder As String = "C:\AAA\"    '■対象フォルダ(必要なら修正)最後の\は必要

    Dim f As String
    Dim source As String
    Dim destination As String
    
    '対象となるファイルのファイル名の取得
    f = Dir(folder & "*.xlsx")
    If f = "" Then
        MsgBox "xlsxファイルがありません"
        Exit Sub
    End If
    
    'ファイルのコピー
    source = folder & f
    destination = folder & "バックアップ用" & f
    FileCopy source, destination
    
    ' 結果表示
    MsgBox source & vbLf _
           & "を" & vbLf _
           & destination & vbLf _
           & "にコピーしました"
End Sub

投稿日時: 17/08/18 17:13:06
投稿者: どすこい

WinArrow様
 
すごく初心者なもので意図がくめず大変申し訳ございませんでした。
次回から、すべてのコードを記述して、質問するように致します。
でも、回答いただき大変勉強になりました。
ありがとうございます。