VBAでDOSプロンプトを使用してファイル名を変更する方法

このQ&Aのポイント
  • VBAを使用してデスクトップの\dataフォルダにある複数のファイル名を変更したい場合、スペースを含むファイル名があるために変更できないことがあります。この記事では、VBAを使用してDOSプロンプトのRENコマンドを実行し、ファイル名を変更する方法を紹介します。
  • 繰り返し処理を使用して、エクセル上の2列に入力されたファイル名を取得し、旧名と新名を変数に格納します。次に、%comspec% /cコマンドを使用してDOSプロンプトを起動し、RENコマンドを実行するためのコマンドを作成します。最後に、CreateObject関数を使用してwscript.shellオブジェクトを作成し、Execメソッドを使用してコマンドを実行します。
  • スペースを含むファイル名の場合、ファイル名の前後にクォーテーションを追加することで、正しくコマンドが実行されます。これにより、スペースを含むファイル名でも問題なく変更することができます。複数のファイル名をまとめて変更する場合は、Forループを使用して処理します。
回答を見る
  • ベストアンサー

VBAでDOS プロンプトを使いたいのですが・・・

デスクトップの\dataフォルダに、名前を付け替えたいファイルが多数あります。 それらのファイル名(旧名)と、変更したい名前(新名)は、エクセル上の2列に 入力済みです。VBAを使って、dosプロンプトのRENを実行しようとしましたが、 多くのファイル名にスペースが含まれるせいか、大半が変更できませんでした。 良い方法があれば、教えてください。どうかよろしくお願いします。 ※作成したプロシージャは以下の通りです。 Sub ファイル名変更() Dim カウンタ As Integer For カウンタ = 2 To 1000 Dim wsh As Object, wexec As Object, cmd As String Dim 旧名 As String, 新名 As String Set wsh = CreateObject("wscript.shell") 旧名 = Cells(カウンタ, 1).Value     '旧名はA列にある 新名 = Cells(カウンタ, 2).Value    '新名はB列にある cmd = "ren c:\users\me\desktop\data\" & 旧名 & " " & 新名 Set wexec = wsh.Exec("%comspec% /c " & cmd) Set wexec = Nothing Set wsh = Nothing Next End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.4

>しかし、新名にも空白が入っている場合に、 >どういうクォーテーションを入れたら良いのか、 >あれこれ試しましたが、うまく行きませんでした。 >重ねてのお尋ねで恐縮ですが、ご教授ください。 なにをどうあれこれ試したのでしょうか? パソコンをはじめて触る方なのでしょうか。 そうだとしても、それくらいは自分で考えられるようになったほうがいいと思うのですが。 「ren "c:\users\me\desktop\data\旧名.txt" "新名.txt"」 こういう内容の文字列にすればいいわけです。ということはコードは cmd = "ren ""c:\users\me\desktop\data\" & 旧名 & """ """ & 新名 & """" でしょ。

yumeyume88
質問者

お礼

うまく行きました。できなかったことが実現し、感謝しています。自分の至らなさも痛感しつつ、もっと使えるようになりたいという思いが強くなりました。ありがとうございました。

その他の回答 (3)

回答No.3

VBAにも Name ステートメントがあります。 http://officetanaka.net/excel/vba/statement/Name.htm 「大半が変更できません」の原因も探りやすいと思います。 FileCopy、 Kill(Delete)とかも。 http://www.moug.net/tech/exvba/0060075.html ヘルプで確認してみてください。 CMD.exe にお願いするまでもないと思います。 また、もっと凝ったことをしたい場合はFilesystemObjectを検討しても吉。 http://officetanaka.net/excel/vba/filesystemobject/index.htm

yumeyume88
質問者

お礼

NAMEのことを調べました。私のやり方より扱いやすそうですので、トライしてみます。ありがとうございました。

  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.2

私も、VBAを使うのならFSOを使ったほうがいいとは思います。 ですがそこまで作っているのでしたら、現状を動くようにした方がいいでしょう。 cmdをメッセージボックスやDebug.printで表示させてみてください。 「ren c:\users\me\desktop\data\旧名.txt 新名.txt」 となっているはずです。これを 「ren "c:\users\me\desktop\data\旧名.txt" 新名.txt」 となるようにしましょう。 VB系の文字列中のダブルクォーテーションはダブルクォーテーションを2つ重ねる事で表現します。のでダブルクォーテーションだらけになりますがまぁそういうものです。 たぶんこれでいいはず。 cmd = "ren ""c:\users\me\desktop\data\" & 旧名 & """ " & 新名 新名にも空白が入っている場合には、同じように修正してみてください。

yumeyume88
質問者

補足

ありがとうございます。質問者です。教えていただいたやり方で、旧名に空白が入っているものの処理ができました。しかし、新名にも空白が入っている場合に、どういうクォーテーションを入れたら良いのか、あれこれ試しましたが、うまく行きませんでした。重ねてのお尋ねで恐縮ですが、ご教授ください。よろしくお願いします。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

私は Excel VBA のことはよく知らないのですが、調べてみたところ WSH でコマンドを組み立てなくても FSO で File オブジェクトの Name プロパティを変更すればリネームできるようです。 [参考] MSDN での Name プロパティのリファレンスページ http://msdn.microsoft.com/ja-jp/library/cc428125.aspx 実際のリネームのサンプル http://officetanaka.net/excel/vba/filesystemobject/file06.htm

yumeyume88
質問者

お礼

FSOのことを調べてみました。こちらのやり方の方が、私向きかと思いますので、やってみようと思います。ありがとうございます。

関連するQ&A

  • DOS画面起動時のパチパチを防ぐには

    VBAからDOSコマンドを起動した時、画面が一瞬パチパチ してしまいますが、このパチパチを防ぐ方法はありませんか? よろしくお願いします。 下記コードは、C:\test配下のCSVファイルを1つにまとめて、 C:\testにall.txtとして格納するものです。 その際、DOSコマンドを起動しました。 Set WSH = CreateObject("Wscript.Shell") Cmd = "COPY C:\kamakura\*.csv C:\kamakura\all.txt" Set wExec = WSH.Exec("%ComSpec% /c " & Cmd) Do While wExec.Status = 0 DoEvents Loop ' Set wExec = Nothing Set WSH = Nothing

  • Excelで、WScript.Shell、標準出力

    Excelで、WScript.Shellを使って、標準出力を経由してデータを取得 Excelで、CreateObject("WScript.Shell")を使って、標準出力を経由してデータを取得したいと考えたのですが、サイズに制限がありそうです。 標準出力のサイズが4096バイトを超えると、DOS窓が閉じず、強制的に終了させると超えた分はどこかへ消えました。 下記のコードで確かめたのですが、何かこの容量の制限を取り払う方法はないでしょうか? Sub Sample1標準出力0() Dim WSH, wExec Dim sCmd As String Dim Result As String Set WSH = CreateObject("WScript.Shell") sCmd = "type D:\t.txt" Set wExec = WSH.Exec("%ComSpec% /c " & sCmd) Do While wExec.Status = 0 DoEvents Loop Result = "" Result = wExec.StdOut.ReadAll Debug.Print Len(Result) MsgBox Result Set wExec = Nothing Set WSH = Nothing End Sub

  • (VBA) Dir 関数で取得するファイル一覧の順序

    タイトルの通り、下記のサンプルコードを実行して取得するファイル一覧の順序についての質問です。 Public Sub Test1() Dim WSH As Object Dim MyPath As String Dim MyFileName As String Set WSH = CreateObject("WScript.Shell") MyPath = WSH.SpecialFolders("MyDocuments") MyFileName = Dir(MyPath & "\" & "*.*") Do Until MyFileName = "" MsgBox MyFileName MyFileName = Dir Loop Set WSH = Nothing End Sub (質問) ファイル名の昇順では取得できないようですが、もしファイル名の昇順に並べ替えるとしたら、 どのように処理したらよいのでしょうか?

  • エクセルVBAで配列ができなかった時の処理

    エクセルでコマンドラインでデータを配列に 落としていますがデータがなかった時 配列もできていないようなのですがその時の書式がわかりません。 Dim cmd As String Dim filedata() As String Dim i As Integer cmd = dosのコマンド Set Result = WSH.exec("%ComSpec% /c " & cmd) Do While Result.Status = 0 DoEvents Loop filedata = Split(Result.StdOut.ReadAll, vbLf) '配列データができなかった時の処理 例えば  IF filedata(0)=""  IF filedata=""  IF filedate IS Nothing など いづれもエラーになります。 なにか書式ありますでしょうか

  • エクセルVBA:perlで作成したexeが失敗する

    VBAプログラムで詰まってしまったので質問します。 perlにて自作したexeファイルをexcelのボタンから開きたいのですが、 実行の途中で止まってしまうようなのです。 止まってしまうexeファイルは、自分でダブルクリックして起動すると正常動作する為、 原因がわかりません。 'Declare Function ShellExecute Lib "shell32.dll" _ 'Alias "ShellExecuteA" ( _ 'ByVal hwnd As Long, _ 'ByVal lpOperation As String, _ 'ByVal lpFile As String, _ 'ByVal lpParameters As String, _ 'ByVal lpDirectory As String, _ 'ByVal nShowCmd As Long) As Long 'lRet = ShellExecute(0, "open", sPASS, vbNull, vbNull, SW_NORMAL) 'With CreateObject("Wscript.Shell") ' .Run "***********************", 5 'End With 'MsgBox "vbCrLf & CurDir & vbCrLf" 'Shell "**********************", 1 'With CreateObject("Wscript.Shell") ' .Run "..************", 5 'End With 'Dim ret As Long 'With CreateObject("Wscript.Shell") ' ret = .Run("*************", 7, True) 'End With 'If ret <> 0 Then MsgBox "失敗しました": Exit Sub 'Shell "*****************************" 'Dim WSH 'Set WSH = CreateObject("Wscript.Shell") 'WSH.Run "*************************", 3 'Set WSH = Nothing 'Dim file As Variant 'file = Application.GetOpenFilename 'file = "****************** " + file 'Shell (file) 'On Error GoTo errline 'ret = ShellExecute(0, "open", "***************", "", Path, 1) 'errline: 'Err = 0 'Dim ファイルのあるフォルダ As String 'Dim ファイルの名前 As String 'Dim プログラムのパス As String 'Dim 拡張子 As String 'ファイルのあるフォルダ = Worksheets("Sheet1").Cells(1, 1) 'ファイルの名前 = Worksheets("Sheet1").Cells(2, 1) 'プログラムのパス = Worksheets("Sheet1").Cells(3, 1) '拡張子 = Worksheets("Sheet1").Cells(4, 1) 'Dim ファイルのパス As String 'ファイルのパス = ファイルのあるフォルダ & "\" & ファイルの名前 & "." & 拡張子 'Dim AppFp As String 'AppFp = プログラムのパス & " """ & ファイルのパス & """" '前の""はスペース空ける '「"」が特殊文字であるため、スキップするための文字(エスケープ文字)「"」を前につける 'Dim a As Integer 'a = Shell(AppFp, vbNormalFocus) '上記プログラム全部× Const vbHide = 0 'ウィンドウを非表示 Const vbNormalFocus = 1 '通常のウィンドウ、かつ最前面のウィンドウ Const vbMinimizedFocus = 2 '最小化、かつ最前面のウィンドウ Const vbMaximizedFocus = 3 '最大化、かつ最前面のウィンドウ Const vbNormalNoFocus = 4 '通常のウィンドウ、ただし、最前面にはならない Const vbMinimizedNoFocus = 6 '最小化、ただし、最前面にはならない 'Dim objWShell 'Set objWShell = CreateObject("WScript.Shell") 'できたが×途中で終了している模様 'フォルダ「C:\happy」を開きます 'objWShell.Run "rundll32.exe url.dll" & _ ' ",**************", vbNormalFocus, False 'WScript.Echo "**********を実行しました!" 'Set objWShell = Nothing どうにかVBAから起動したいのですが、方法は無いでしょうか??

  • VBAでdosのcompコマンドの実行結果を得たい

    Excel2010のVBAで、 MS-DOSのcompコマンドの実行結果を取得したいのですが、 以下の方法ではうまくいきませんでした。 どのようにすればよいでしょうか。(Windows7) ------------------------------------------------------------ Sub test()  Dim wshShell As Object  Dim wshExec As Object  Dim command As String  Dim file1 As String  Dim file2 As String  Dim result As String  file1 = "C:\test\0128\test.xlsx"  file2 = "C:\test\0129\test.xlsx"  'command = "dir /d " & file1 & " " & file2     '(OK)  'command = "fc /b " & file1 & " " & file2      '(OK)  command = "comp " & file1 & " " & file2      '(NG)  'command = "echo n | comp " & file1 & " " & file2  '(NG)  Debug.Print command  Set wshShell = CreateObject("WScript.Shell")  Set wshExec = wshShell.exec("%ComSpec% /c " & command)  Do Until wshExec.Status   DoEvents  Loop  If wshExec.StdErr.AtEndOfStream = False Then   'エラー   result = wshExec.StdErr.ReadAll  Else   '正常   result = wshExec.StdOut.ReadAll  End If  Set wshExec = Nothing  Set wshShell = Nothing  MsgBox result End Sub ------------------------------------------------------------

  • 10分おきに自動でバックアップファイルを作成する

    エクセルファイルで 「10分おきに自動でバックアップファイルを作成する」 ということは可能ですか? Sub バックアップ作成() Dim myFSO As Object Dim MyFile As Object Dim WSH As Variant Dim strdate As String Set myFSO = CreateObject("Scripting.FileSystemObject") Set WSH = CreateObject("Wscript.Shell") strdate = Format(Now, "yyyy年mm月dd日hh時mm分") myFSO.CopyFile ActiveWorkbook.FullName, "D:\backup\" & strdate & ".xlsm" Set MyFile = Nothing Set myFSO = Nothing Set WSH = Nothing End Sub これでバックアップは作成できるのですが 「10おきに」というのはどうすればいいのでしょうか?

  • 削除が実行されない

    以下のvbsを実行しても rmdir が実行されません どうしたらよいでしょうか Dim objShell Dim wExec Dim strResult Set objShell = CreateObject("WScript.Shell") objShell.CurrentDirectory = "C:\Users\xxx\Desktop\test" objShell.Exec ("cmd /c dir 201406* /b/ad/s >> ログ.txt") Set wExec = objShell.Exec ("cmd /c for /R %d in (201406*) do rmdir /S /Q ""%d""") Set wExec = Nothing Set objShell = Nothing

  • VBA 新規にエクセルを開き既存のファイルを開く

    VBAで新規にエクセルのアプリケーションを起動し、 その中に既存のファイルを起動する方法は有りますか? Sub Sample() Dim appExcel As Excel.Application Dim WSH As Variant Dim strPath As String Set appExcel = New Excel.Application Set WSH = CreateObject("Wscript.Shell") strPath = ActiveWorkbook.Path With appExcel .Visible = True .Workbooks.Add .ActiveWorkbook.SaveAs (strPath & "\ test.xls") End With Set WSH = Nothing End Sub このコードは、ネットから拾ったサンプルコードなのですが 新しいアプリケーションでエクセルを立ち上げることはできたのですが 新規のブックが開いてしまい、 更に、開きたいファイルに上書き保存してしまいそうです。 新規のブックが開く原因は .Workbooks.Addで、 上書き保存する原因は .ActiveWorkbook.SaveAs だとわかってるのですが、 この部分を同変更すればいいのかがわかりません。 Workbooks.Open?Filename:="C:\Users\test.xlsx" だと、現在実行しているvbaファイルを同じ枠内で 該当のファイルが開いてしまいます。

  • VBA 条件検索について

    VBAの検索について質問です。 以下のようなものを作ろうと思います。 sheet1とsheet2がありsheet1のA、Bの数値をsheet2の同じA,Bの数値の値の行を検索して, その同じ値の行のsheet1のCの数値の値からsheet2のCの数値を引いた値をsheet3のC列に返すプログラムを作ろうと思います。空白などで同じ値がない場合はsheet3に空欄を返そうと思います。 以下に例をプログラムの実行例を示します。 sheet1 ■ A 列 B 列 C列 1: 7 | 1 | 3 2: 5 | 8 | 2 3: 2 | 3 | 1 4: 9 | 6 | 4 sheet2 ■ A 列 B列 C列 1: 2 | 3 | 4 2: 9 | 6 | 2 3: 7 | 1 | 5 4: 5|   | 3 sheet3 ■ A列 B列 C列 1: 7| 1 | -2 2: 3: 2| 3 | -3 4: 9 | 6 | 2 自分で以下のプログラムを作成してみたのですが空欄が検索できなかったりしてなかなかできません。 どなたか、教えてください。お願いします。 Sub test() Dim sh1 As Object, sh2 As Object, sh3 As Object Dim d1 As String, d2 As String, a As Long Set sh1 =Sheets(“Sheet1”) Set sh2 =Sheets(“Sheet2”) Set sh3 =Sheets(“Sheet3”) For a = 1 To 3000 Step 1 d1 = sh1.Cells(a,1) & sh1.Cells(a,2) d2 = sh2.Cells(a,1) & sh2.Cells(a,2) Do while d2 <>”” If d1 = d2 Then Sh3.Cells(a,1) = sh1.Cells(a,1) Sh3.Cells(a,2) = sh1.Cells(a,2) Sh3.Cells(a,3) = sh1.Cells(a,3) Exit Do End If a= a+1 d2 = sh2.Cells(a,1) & sh2.Cells(a,2) Loop Next End Sub