質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

4154閲覧

VBAのShell関数で引数の記述方法が分からない

VBA-IE

総合スコア16

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2017/09/28 05:25

EXCEL VBAでShell関数を用いファイルのコピーをさせたいのですが、引数の指定がうまくいかず困っています。
コピーは以下のZero.txtファイルをdouki.txtにコピーする単純なものです。
引数の記述でコピー元ファイルZero.txt、およびコピー先ファイルDouki.txtをフルパスで記述した場合(下記下から2行目)は問題なくコピーできるのですが、ThisWorkBook.Pathを使って記述したく、教えてください。
マクロ本体ファイルもZero.txtファイルもDouki.txtファイルも、いずれもC:\Testフォルダに格納されています。
直接フルパス指定では、フォルダ構成が変わるごとに都度コードを変更せねばならず、ThisWorkBook.Pathを使いたいと思っています。
いくつかトライした記述とその結果(コードの後ろにあるコメント(例)'コピーされない)を以下に記します。
ThisWorkBook.Pathを使った引数の記述方法をお教え願います。

<コード>
Dim Pname As String
Dim CSname As String
Dim CDname As String

CSname = ThisWorkbook.Path & "\zero.txt"
CDname = ThisWorkbook.Path & "\douki.txt"

Application.DisplayAlerts = False
Shell "C:\Windows\System32\cmd.exe /C Copy CSname CDname" 'コピーされない
Shell "C:\Windows\System32\cmd.exe /C Copy ThisWorkbook.Path & "\zero.txt" ThisWorkbook.Path & "\douki.txt" 'コンパイルエラーとなる
Shell "C:\Windows\System32\cmd.exe /C Copy" & CSname & " " & CDname 'コピーされない
Shell "C:\Windows\System32\cmd.exe /C Copy" & ThisWorkbook.Path & "\zero.txt" & " " & ThisWorkbook.Path & "\douki.txt" 'コピーされない
Shell "C:\Windows\System32\cmd.exe /C Copy C:\Test\zero.txt C:\Test\douki.txt" '正常(コピーされた)
Application.DisplayAlerts = True

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

何が起きているのかと、どうすれば直せるかを行ごとに書いてみました。参考にしてください。

shell関数の引数は、1つの文字列です。
文字列の中に変数名と同じ文字列が表れても、それは文字列のままで、変数の値に置き換わる訳ではありません。(以下、ThisWorkbook.Pathが"C:\Test"だとして話をすすめます)

1件目)Shell "C:\Windows\System32\cmd.exe /C Copy CSname CDname" 'コピーされない
"C:\Windows\System32\cmd.exe /C Copy CSname CDname"は、"C:\Windows\System32\cmd.exe /C Copy CSname CDname"のままで、"C:\Windows\System32\cmd.exe /C Copy C:\Test\zero.txt C:\Test\douki.txt"とはなりません。

<1件目の修正案>
CSname,CDnameという文字列を値にして、"C:\Windows\System32\cmd.exe /C Copy C:\Test\zero.txt C:\Test\douki.txt"としたいのであれば、
"C:\Windows\System32\cmd.exe /C Copy " & CSname & " " & CDname
というように変数(CSname,CDname)を引用符の外に出さなければなりません。

3件目)Shell "C:\Windows\System32\cmd.exe /C Copy" & CSname & " " & CDname 'コピーされない
最初の文字列"C:\Windows\System32\cmd.exe /C Copy"の最後にスペースが入っていないことが原因です。変数を値に変えると "C:\Windows\System32\cmd.exe /C CopyC:\Test\zero.txt C:\Test\douki.txt"となります。 Copyコマンドが CopyCになってしまっています。

4件目) コピーされないのは3件目と同様、Copyの後にスペースが入っていないために、CopyコマンドがCopyCになるのが原因です。

投稿2017/09/28 06:22

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

VBA-IE

2017/09/29 05:26

coco_bauerさん、回答ありがとうございます。 おかげさまで解決しました。色々調べまくってもうまくいかず困っていましたので助かりました。 ところで、「変数(CSname,CDname)を引用符の外に出さなければなりません」とありますが、その具体的方法についてどこかに解説したものアップされていませんか? 今回のケースからみると、「空白&空白」で引用符の外になる様にみえますが、その理解で正しいですか?初心者のため、ちょっとした記述でエラーになることが多くこの際記述方法を理解しておきたく、お願いします。
guest

0

VBAは"で括ると文字列扱いになります。
PHPと違い、文字列中に変数を記述しても値は展開されません。
なのでこんな感じの書き方にすれば良いと思います。
(最初のところのみ抜粋)

Shell "C:\Windows\System32\cmd.exe /C Copy CSname CDname" ↓ Shell "C:\Windows\System32\cmd.exe /C Copy " & CSname & " " & CDname

投稿2017/09/28 05:56

編集2017/09/28 06:00
ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問