(VBA)bat処理の結果がおかしい

このQ&Aのポイント
  • VBAを使用して、(VBA)bat処理の結果が正しくないという問題があります。
  • 具体的には、指定ディレクトリにBATファイルをコピーし、フォルダーを削除してからフォルダー名を変更する処理が正しく動作しないようです。
  • 原因を調査して修正方法を教えていただきたいです。
回答を見る
  • ベストアンサー

(VBA)bat処理の結果がおかしい

以下の1)から5)までをVBAで行いたいのですが 1)、2)までのコードはネットを参考に作成したのですが  2)の結果が¥tempに書き出されませんでした。   (C:¥に直接書き出される) 原因は何でしょうか ?  (コードの修正をお願いします。) 以下は、行いたい事のイメージ。-------------------------------------------------- 1)指定ディレクトリにディレクトリ(C:\)に保存した   BATファイル(aa.bat)をコピーする 2)指定ディレクトリ内でaa.batを起動する 3)指定ディレクトリーに最初から存在したフォルダーを削除する 4)aa.batによって作成されたフォルダーを最初のフォルダー名に変名する 5)aa.batをコピー先から削除する 例:指定ディレクトリをC:¥temp、aa.batをC:\tempにコピーしたと  C:¥temp¥AA  C:¥temp\AA¥subAA   C:\temp\aa.bat aa.batを\temp内で起動した後で ------>を実施  C:¥AA    ------> 削除  C:¥AA_SUBAA ------> C:\AAに変名  C:\temp\aa.bat -----> 削除 最終的に  C:¥temp\AA --------------------------------------- Sub Test() Dim strPath As String Dim intPathLen As Integer Dim intR As Integer Dim F As Variant Dim obj As WshShell Dim sPath 'Range("A5:F100").Clear ' フォルダーを自由に選べること。 参考:officeTANAKA With Application.FileDialog(msoFileDialogFolderPicker) If .Show = True Then ' MsgBox .SelectedItems(1) If Len(.SelectedItems(1)) = 3 Then ' c:\の場合とサブフォルダーの場合 mypath = .SelectedItems(1) Else mypath = .SelectedItems(1) & "\" End If End If End With If mypath = Empty Then MsgBox "フォルダー名の指定をキャンセルしました。": Exit Sub MyName = Dir(mypath, vbDirectory) ' 最初のフォルダ名を返します。 ’Range("A2") = mypath 'コピー先フォルダーの指定 'BATファイルのコピー FileCopy "C:\aa.bat", mypath & "aa.bat" 'batファイルの起動 sPath = mypath & "\aa.bat" Set obj = New WshShell Call obj.Run(sPath, WaitOnReturn:=True) End Sub ------------------------------------------------------------------- 以下は、aa.batの内容です。 for /d %%i in (*) do ( pushd . cd %%i for /d %%j in (*) do ren "%%j" "%%i_%%j" for /d %%k in (*) do ren "%%k" "../%%k" popd rd "%%i" ) -------------------------------------------

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.5

いつもながらの思い付きですが 'batファイルの起動 の前に ChDir mypath にしてみるとか

NuboChan
質問者

お礼

kkkkkさん、いつも回答をいただき感謝いたします。 >'batファイルの起動の前に >ChDir mypath >にしてみるとか まさに、ディレクトリーをTemp内に移動して batを実施すると思っていた処理が出来ました。 これから、他の処理を追加してみます。 一応、全ての処理が出来た時点でコードを明示したいと思います。 (明日には何とか形に出来るとおもいます。)

その他の回答 (20)

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.21

次回から一つの質問が解決したらいったん締め切って、コードを整理してから新たに質問を出して下さい。

NuboChan
質問者

お礼

おかげさまでやっとやりたいことができました。 最後までお付き合い願いありがとうございます。 >次回から一つの質問が解決したらいったん締め切って、 >コードを整理してから新たに質問を出して下さい。 コードの整理が出来ていないのに 思った理想の完成の答えを求めて  最初の質問から離れた追加の質問を次々として  トピが長くなってしまいました。 次回からは、トピが解決したら終了としたいと思います。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.20

> そこで、「_」のセルのバックの色を変えて > (例えば、黄色)視認できるようにはできませんか ? 条件付き書式で設定してください。

NuboChan
質問者

補足

>条件付き書式で設定してください。 アドバイス感謝いたします。 Nubering3に  下記を追加してうまく処理できました。 '条件付き書式。セルの値が「_」の場合 With Worksheets("Number").Range("A1:AS20").FormatConditions.Add(Type:=xlCellValue, Operator:=xlEqual, Formula1:="_") '背景色をシャルトルーズにする .Interior.Color = XlRgbColor.rgbChartreuse End With

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.19

> fso.DeleteFolder MyPath & DelSubF > > でいけるのではないでしょうか。 といったのは Set fso = Nothing より前にそのコードがあったからで 今回は開放より後に fso.MoveFolder OldFolder, NewFolder を使ってるからエラーになっているのではないでしょうか。 Dimも最初にあったり途中にあったりしてますし、ひとつ機能を追加したらその時点で一度コードを整理したほうがいいのではないでしょうか。

NuboChan
質問者

お礼

お世話をおかけしていますが、  エラーの原因が判明しました。 >fso.MoveFolder OldFolder, NewFolder >を使ってるからエラーになっているのではないでしょうか。 全く、そのとうりで ObjFSO.MoveFolder OldFolder, NewFolder とすべきを fso.MoveFolder OldFolder, NewFolder とNothingで開放したfsoを利用しようとしていました。 >ひとつ機能を追加したらその時点で一度コードを整理したほうがいいのではないでしょうか。 コードの整理が出来ていないのに答えを求めて  先を急いで沼に迷い込んでしまいました。 -------------------- どうにか、コードは希望に合った完成形に近づきましたが 最後に以下のコードで  何番目から抜き出すかを指定するのに 今回は、「_」を探したのですがフォルダー名が長くなると  「_」を探すのがナンバリングしていてもすぐには見つかりません。 そこで、「_」のセルのバックの色を変えて  (例えば、黄色)視認できるようにはできませんか ? コードを何回も走らせていると追加で      やりたいことが増えてしまいました。 -------------------------------------------------------------- 'フォルダー名を変更する '指定位置から文字列抜き出し() With Sheets("DATA") EndRow = .Cells(Rows.Count, "A").End(xlUp).Row For I = 2 To EndRow Step 2 Nubering3 (I) KokoKara = Application.InputBox(prompt:="何番目から抜き出すか? 数値を入力してください", Title:="指定位置(数値入力)", Type:=1) If TypeName(KokoKara) = "Boolean" Then MsgBox "数値以外が入力されたので終了します。" Exit Sub End If .Activate MojiSuu = Len(.Range("A" & I)) Nukidashi = Mid(.Range("A" & I), KokoKara, MojiSuu) .Range("B" & I) = Nukidashi Next I End With Sub Nubering3(ByVal DataRow As Long) Dim Ws1 As Worksheet, Ws2 As Worksheet Dim I As Long, j As Long, WRow As Long, WColumn As Long Dim uRows As Range, uRange As Range Dim font1 As Font Set Ws1 = Sheets("DATA") Set Ws2 = Sheets("Number") Set uRows = Ws2.Rows(1) Set uRange = Ws2.Range("A2") 'Numberシートの初期化(全体=数式・文字・書式・コメント全てをクリア) Ws2.Range("A1:XX100").Clear Application.ScreenUpdating = False WRow = 1: WColumn = 1 For j = 1 To Len(Ws1.Cells(DataRow, "A").Value) Ws2.Cells(WRow, WColumn).Value = j Ws2.Cells(WRow + 1, WColumn).Value = Mid(Ws1.Cells(DataRow, "A").Value, j, 1) Set uRange = Union(uRange, Ws2.Cells(WRow + 1, WColumn)) Set uRows = Union(uRows, Ws2.Rows(WRow)) If j Mod 40 = 0 Then WRow = WRow + 3 WColumn = 1 Else WColumn = WColumn + 1 End If Next 'Numeling 大文字、中央揃え uRows.HorizontalAlignment = xlCenter uRows.Font.Bold = True 'フォントサイズ指定 uRows.Font.Size = 9 '分割文字中央揃え罫線外枠 uRange.HorizontalAlignment = xlCenter uRange.Borders.LineStyle = xlContinuous 'フォントサイズ指定 'uRange.Font.Name = "HGP創英角ポップ体" uRange.Font.Size = 9 'セル幅を見やすく Ws2.Range("A1:xx100").ColumnWidth = 3 Application.ScreenUpdating = True Ws2.Activate Set Ws1 = Nothing Set Ws2 = Nothing Set uRows = Nothing Set uRange = Nothing End Sub  

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.18

エラーの場合、エラーメッセージで検索して対処方法を探してみてください。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.17

OldFolder = FolderName & "\" & Ws01.Cells(I, "A") MsgBox "古いフォルダー名 " & OldFolder NewFolder = FolderName & "\" & Ws01.Cells(I, "B") MsgBox "新しいフォルダー名 " & NewFolder この結果が間違っているのですから 文字列を結合する一歩手前の FolderName Ws01.Cells(I, "A") Ws01.Cells(I, "B") をそれぞれ見て確認するしかないです。 .Valueは付けたほうがいいと思います。 Ws01.Cells(I, "A").Value Ws01.Cells(I, "B").Value

NuboChan
質問者

補足

¥が2つ付く件は、下記が原因でした。 OldFolder = FolderName & "\" & Ws01.Cells(I, "A") NewFolder = FolderName & "\" & Ws01.Cells(I, "B") わざわざ & "\" & で¥を無駄に付加していました。 下記に変更してmsgboxは正常に表示されるようになりました。 OldFolder = FolderName & Ws01.Cells(I, "A") NewFolder = FolderName & Ws01.Cells(I, "B") Valueは付けたほうがいいとのアドバイスで  さらに下記に変更しました。 OldFolder = FolderName & Ws01.Cells(I, "A").value NewFolder = FolderName & Ws01.Cells(I, "B").value しかし、エラーは解消しませんでした。 (オブジェクト変数または With ブロック変数が設定されていません。(エラー番号:91))

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.16

Set ObjFSO = CreateObject("Scripting.FileSystemObject") すでに Set fso = CreateObject("Scripting.FileSystemObject") がありますからfso使って fso.DeleteFolder MyPath & DelSubF でいけるのではないでしょうか。

NuboChan
質問者

お礼

コードが長すぎて4000文字の制限で尻切れ状態になりました。 不足分を追加します -------------------------------------------------- MsgBox "新しいフォルダー名 " & NewFolder 'MsgBox NewFile 'ChDir MyPath 'ファイル名を変更します。 fso.MoveFolder OldFolder, NewFolder Next I End Sub Sub Nubering3(ByVal DataRow As Long) Dim Ws1 As Worksheet, Ws2 As Worksheet Dim I As Long, j As Long, WRow As Long, WColumn As Long Dim uRows As Range, uRange As Range Dim font1 As Font Set Ws1 = Sheets("DATA") Set Ws2 = Sheets("Number") Set uRows = Ws2.Rows(1) Set uRange = Ws2.Range("A2") 'Numberシートの初期化(全体=数式・文字・書式・コメント全てをクリア) Ws2.Range("A1:XX100").Clear Application.ScreenUpdating = False WRow = 1: WColumn = 1 For j = 1 To Len(Ws1.Cells(DataRow, "A").Value) Ws2.Cells(WRow, WColumn).Value = j Ws2.Cells(WRow + 1, WColumn).Value = Mid(Ws1.Cells(DataRow, "A").Value, j, 1) Set uRange = Union(uRange, Ws2.Cells(WRow + 1, WColumn)) Set uRows = Union(uRows, Ws2.Rows(WRow)) If j Mod 40 = 0 Then WRow = WRow + 3 WColumn = 1 Else WColumn = WColumn + 1 End If Next 'Numeling 大文字、中央揃え uRows.HorizontalAlignment = xlCenter uRows.Font.Bold = True 'フォントサイズ指定 uRows.Font.Size = 9 '分割文字中央揃え罫線外枠 uRange.HorizontalAlignment = xlCenter uRange.Borders.LineStyle = xlContinuous 'フォントサイズ指定 'uRange.Font.Name = "HGP創英角ポップ体" uRange.Font.Size = 9 'セル幅を見やすく Ws2.Range("A1:xx100").ColumnWidth = 3 Application.ScreenUpdating = True Ws2.Activate Set Ws1 = Nothing Set Ws2 = Nothing Set uRows = Nothing Set uRange = Nothing End Sub

NuboChan
質問者

補足

現在コード作成中です。 (変な点などあればアドバイスお願いします。) 最終部に仮のコードを作成しましたが 最後の以下でエラーがでました。   'ファイル名を変更します。     fso.MoveFolder OldFolder, NewFolder   オブジェクト変数または With ブロック変数が設定されていません。(エラー番号:91) 以下のようにチェックの為MsgBoxを仮に記載しました。 OldFolder = FolderName & "\" & Ws01.Cells(I, "A") MsgBox "古いフォルダー名 " & OldFolder NewFolder = FolderName & "\" & Ws01.Cells(I, "B") MsgBox "新しいフォルダー名 " & NewFolder MsgBoxが表示されて 古いフォルダー名 C:temp\\AA_AA 新しいフォルダー名 C:\temp\\AA とtemp¥¥と¥¥が2個表示されているのでミスがあるのは間違いないのですが これが原因で変名出来ないのでしょうか ? -------------------------------------------- >fso使って >fso.DeleteFolder MyPath & DelSubF >でいけるのではないでしょうか。 以前setは使用後は、Nothingで開放しないとコメントを頂いたので 使用後は、開放するようにしているので 無駄な宣言(2重手間)が発生してしまいました。 すいませんが、  とりあえず、現状のコードが一応の目途が立った後で  ご指摘の件は、検討します。 私の現状では、2つ同時に検討するのは 能力不足です。 ------------------------------------------ Option Explicit Sub MooveUp_Directory() Dim IntR As Integer Dim Obj As WshShell Dim SPath As String Dim FolderPath As String Dim SubF As Object Dim DelSubF As String Dim ObjFSO As Object Dim MyF As Object Dim Ws01 As Worksheet Dim lRow As Single Dim FolderName, OldFolder, NewFolder As String Dim MojiSuu As Single Dim KokoKara As Variant Dim I As Single Dim Nukidashi As String Dim EndRow As Single Dim str As String '文字列 Dim cnt As Long '文字列が全部で何文字か Dim n As Long '何文字削除するかを指定 ' フォルダーを選択(自由に選べること.) ' MyPath Dim MyPath As String With Application.FileDialog(msoFileDialogFolderPicker) If .Show = True Then If Len(.SelectedItems(1)) = 3 Then ' c:\の場合とサブフォルダーの場合 MyPath = .SelectedItems(1) Else MyPath = .SelectedItems(1) & "\" End If End If End With If MyPath = Empty Then MsgBox "フォルダー名の指定がキャンセルしました。": Exit Sub 'BATファイルのコピー FileCopy "C:\MoveUp_Directory.bat", MyPath & "MoveUp_Directory.bat" 'batファイルの起動 SPath = MyPath & "MoveUp_Directory.bat" Set Obj = New WshShell ChDir MyPath Call Obj.Run(SPath, WaitOnReturn:=True) Set Obj = Nothing 'フォルダー内の不要ファイルの削除 Kill MyPath & "*.bat" 'フォルダー内のフォルダー名 FolderPath = MyPath '--- 含まれるフォルダの数を知りたいフォルダのパス ---' '--- ファイルシステムオブジェクト ---' Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") 'フォルダー内のフォルダーを書き出す Set MyF = fso.GetFolder(FolderPath) ' 含まれるフォルダ名を知りたいフォルダを返します。 Set ObjFSO = CreateObject("Scripting.FileSystemObject") IntR = 1 For Each SubF In MyF.SubFolders 'サブフォルダーを取得します。 If InStr(SubF.Name, "_") > 0 Then 'MsgBox SubF.Name DelSubF = Left(SubF.Name, InStr(SubF.Name, "_") - 1) 'Cells(IntR, "B") = MyPath & DelSubF ObjFSO.DeleteFolder MyPath & DelSubF End If Cells(IntR, "A") = SubF.Name IntR = IntR + 1 Next Set fso = Nothing Set MyF = Nothing Set ObjFSO = Nothing 'フォルダー名を変更する '指定位置から文字列抜き出し() With Sheets("DATA") EndRow = .Cells(Rows.Count, "A").End(xlUp).Row For I = 2 To EndRow Step 2 Nubering3 (I) KokoKara = Application.InputBox(prompt:="何番目から抜き出すか? 数値を入力してください", Title:="指定位置(数値入力)", Type:=1) If TypeName(KokoKara) = "Boolean" Then MsgBox "数値以外が入力されたので終了します。" Exit Sub End If .Activate MojiSuu = Len(.Range("A" & I)) Nukidashi = Mid(.Range("A" & I), KokoKara, MojiSuu) .Range("B" & I) = Nukidashi Next I End With Sheets("Number").Range("A1:XX100").Clear '指定したフォルダー名を変更します。 Set ObjFSO = CreateObject("Scripting.FileSystemObject") Set Ws01 = Worksheets("DATA") FolderName = MyPath 'ターゲットフォルダー lRow = Ws01.Cells(Rows.Count, "A").End(xlUp).Row 'A列の最終行を取得 For I = 2 To lRow Step 2 '最終行まで繰り返す OldFolder = FolderName & "\" & Ws01.Cells(I, "A") MsgBox "古いフォルダー名 " & OldFolder NewFolder = Folde

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.15

> エラー原因は何でしょうか ? B列に正しいフルパスの削除対象フォルダ名が出力されていませんから Kill MyPath & DelSubF 実行は早すぎます。 Killを使ったことなかったので調べたらフォルダ削除できないということで Kill は RmDir どちらにしても B列に正しいフルパスの削除対象フォルダ名が出力されたから、実行するようにしてください。 2行目なら(Cドライブ真下にtempがあるなら) 2 AA_AA C:\temp\AA が正しくなります。 AA_AAの「_」が全角ですが本来は半角ですよね。

NuboChan
質問者

お礼

>2 AA_AA C:\temp\AA >AA_AAの「_」が全角ですが本来は半角ですよね。 すいません。  C:¥を加えるのを忘れていました。  AA_AAの「_」は、半角です。    ひらがな変換モードでそのまま全角を使ってしまいました。 Cells(IntR, "B") = MyPath & DelSubF の結果は、正しいディレクトリー構造を表示しています。 教えてもらって  killでは、フォルダーは削除できないと言う事実を初めて知りました。 RmDirに変更してもエラーが出るので調べてみると  「RmDir ステートメント は、ディレクトリまたはフォルダ内が空で無い場合   削除しようとするとエラーが発生します  ディレクトリまたはフォルダを中のファイルごと削除したい場合には、  FileSystemObject オブジェクト の DeleteFolder メソッド を使用する」 との事なので以下のように変更しました。 Dim ObjFSO As Object <------ 追加 'フォルダー内のフォルダーを書き出す Set MyF = fso.GetFolder(FolderPath) ' 含まれるフォルダ名を知りたいフォルダを返します。 Set ObjFSO = CreateObject("Scripting.FileSystemObject")   <------ 追加 IntR = 1 For Each SubF In MyF.SubFolders 'サブフォルダーを取得します。 If InStr(SubF.Name, "_") > 0 Then MsgBox SubF.Name DelSubF = Left(SubF.Name, InStr(SubF.Name, "_") - 1) Cells(IntR, "B") = MyPath & DelSubF ObjFSO.DeleteFolder MyPath & DelSubF  <------ 変更 End If Cells(IntR, "A") = SubF.Name IntR = IntR + 1 Next Set fso = Nothing Set MyF = Nothing Set ObjFSO = Nothing  <------ 追加 おかげさまで  必要ないフォルダーの削除が出来ました。 後AA_AAをAAに変更する工程が残っています。 今からコードを作成していきますので  少し時間をください。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.14

Dim DelSubF As String になっているでしょうか。

NuboChan
質問者

お礼

ご迷惑をおかけしてすいません。  ミスがありました。 >Dim DelSubF As String >になっているでしょうか。 Dim SubF As Object なので Dim DelSubF As Object としていました。 指摘を受けてStringに変更して  エラーは出なくなりました。 Cells(intR, "B") = mypath & DelSubF を記載しているので DATAシートで以下のように表示されているのを確認しました A B 1 AA 2 AA_AA \temp\AA_AA 3 BB 4 BB_BB \temp\BB_BB 5 CC 6 CC_CC \temp\CC_CC ---------------------------- Kill MyPath & DelSubF をコードに追加して実行すると   ファイルが見つかりません。    (エラー 53) がでました。 エラー原因は何でしょうか ?

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.13

If InStr(SubF, "_") > 0 Then SubF.Nameになっていません。 DelSubF.Name .Nameはいいりません。 Kill MyPath & DelSubF は 正しくフォルダ名ができているか確認してから実行したほうがいいのではないでしょうか Debug.Print mypath & DelSubF もしくは Cells(intR, "B") = mypath & DelSubF

NuboChan
質問者

補足

エラー処理が上手くいきません。 No.13の修正アドバイスを受けて  下記のように修正しましたが  又同じ場所で同じエラーが発生します。 ---------------------------------- フォルダー内のフォルダーを書き出す Set MyF = fso.GetFolder(FolderPath) ' 含まれるフォルダ名を知りたいフォルダを返します。 IntR = 1 For Each SubF In MyF.SubFolders 'サブフォルダーを取得します。 Stop If InStr(SubF.Name, "_") > 0 Then MsgBox SubF.Name DelSubF = Left(SubF.Name, InStr(SubF.Name, "_") - 1) 'Kill MyPath & DelSubF.Name Cells(IntR, "B") = MyPath & DelSubF End If Cells(IntR, "A") = SubF.Name IntR = IntR + 1 Next ------------------------ ターゲットのフォルダーが\tempだと マクロをSTOPで途中止めた時点で temp\の中には以下のフォルダーが存在します。 AA AA_AA BB BB_BB CC CC_CC STOP以後F8でステップインで1行ずつトレースすると 最初のAAは、A1セルに書き出されます。 次の、AA_AAはIF分で処理されるために  DelSubF = Left(SubF.Name, InStr(SubF.Name, "_") - 1) に処理が移動しますがここでエラーが発生。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.12

>  下記にように変更してみましたがエラーが発生します > オブジェクト変数または With ブロック変数が設定されていません。(エラー番号:91) SubF.Name でフォルダ名になりますので試してみてください。

NuboChan
質問者

補足

>SubF.Name >でフォルダ名になりますので試してみてください。 以下のように変更してみましたが、同じ場所で同じエラーが発生します。 修正するところが違うのでしょうか ? If InStr(SubF, "_") > 0 Then MsgBox SubF.Name DelSubF.Name = Left(SubF.Name, InStr(SubF.Name, "_") - 1) Kill MyPath & DelSubF.Name End If

関連するQ&A

  • VBAでのフォルダ指定方法について

    EXCELファイルが保存されているディレクトリ配下のフォルダーを指定できるようにしたくていろいろ試してみたのですが、うまくいきません。 どなたか、お知恵をお貸しください。 以下ソースです。 Private Sub CommandButton1_Click() Dim ShellApp As Object Dim oFolder As Object Dim MyPath As String MyPath = ActiveWorkbook.Path Set ShellApp = CreateObject("Shell.Application") Set oFolder = ShellApp.BrowseForFolder(0, "処理ファイルの格納フォルダ選択", 1, MyPath) If Not oFolder Is Nothing Then TextBox1.Value = oFolder.Items.Item.Path End If Set ShellApp = Nothing Set oFolder = Nothing End Sub

  • VBA 探しているFileがないときの処理方法

    現在、下記のようにしてマクロ実行ブックと同じ階層のフォルダ名を取得してAに、フォルダ内のabc.XLSのC9の値をBに、abc.XLSの更新日時をCに表示させています。 このとき、フォルダ内にabc.XLSが無い場合にファイル名をAに書き出してB及びCは空白というように表示したいのですが、どのようにすればよろしいでしょうか。 macro1は以前質問させて頂いたものがベースになっています。ExecuteExcel4Macroを使っている関係でファイル名が無いときの処理はDirを使ってできるとmougで調べてわかりましたが、自分の知識ではできず、macro2を作成したのですが、指定ファイルがない場合の処理がうまくできずにいます。 macro1はファイルオープンの窓が開きます。macro2はファイルが存在しないという窓が開きます。 どちらの場合でもかまいませんのでお力をお貸し頂けませんでしょうか。 Sub macro1() Dim myPath As String Dim myFolder As String Dim r As Long r = 3 myPath = ThisWorkbook.Path & "\" myFolder = Dir(myPath, vbDirectory) myBook = "abc.XLS" Application.ScreenUpdating = False Range("A3:C60").Clear Do Until myFolder = "" If myFolder <> "." And myFolder <> ".." Then If (GetAttr(myPath & myFolder) And vbDirectory) = vbDirectory Then Cells(r, 1) = myFolder Cells(r, 2).Value = ExecuteExcel4Macro("'" & myPath & myFolder & "\[" & myBook & "]Sheet1 '!R9C3") On Error Resume Next Cells(r, 3) = FileDateTime(myPath & myFolder & "\" & myBook) On Error GoTo 0 If Cells(r, 3) = "" Then Cells(r, 2) = "myBook" End If Cells(r, 2).NumberFormatLocal = "#,##0_ " Cells(r, 3).NumberFormatLocal = "y""年""m""月""" With Range("A3:C60") .Sort Key1:=Range("C3"), Order1:=xlAscending .Borders.LineStyle = True End With r = r + 1 End If End If myFolder = Dir() Loop Application.ScreenUpdating = True End Sub Sub Macro2() Dim myPath As String Dim myFolder As String Dim myBook As String myPath = ThisWorkbook.Path & "\" myFolder = Dir(myPath, vbDirectory) myBook = "abc.XLS" i = 2 Do Until myFolder = "" If myFolder <> "." And myFolder <> ".." Then If (GetAttr(myPath & myFolder) And vbDirectory) = vbDirectory Then Workbooks.Open (myPath & myFolder & "\" & myBook) Range("C9").Activate Selection.Copy ThisWorkbook.Activate Cells(i, 1) = myFolder Cells(i, 2).PasteSpecial xlValues Cells(i, 3) = FileDateTime(myPath & myFolder & "\" & myBook) Workbooks(myBook).Close SaveChanges:=False i = i + 1 End If End If myFolder = Dir() Loop End Sub

  • フォルダー名に特殊文字?が存在する場合にエラー発生

    以下のコードでフォルダー名を取得しています。 しかし、フォルダー名に特殊文字?が存在する場合に下記でエラーが発生します。  例えば「Oxygène」 でeの上に’があるなど   If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then      実行エラー 53: ファイルが見つかりません。 これは、excelの仕様で処理できないのでしょうか ? 他のコードで処理できれば教えて下さい。 --------------------------------------- Sub フォルダ名取得() Dim MyName Dim MyPath Dim i As Long ’仮の消込(初期化: 前回の記入文をクリアー) Range("A5:H50").Clear i = 1 ' フォルダーを自由に選べること。 参考:officeTANAKA With Application.FileDialog(msoFileDialogFolderPicker) If .Show = True Then ' MsgBox .SelectedItems(1) If Len(.SelectedItems(1)) = 3 Then ' c:\の場合とサブフォルダーの場合 MyPath = .SelectedItems(1) Else MyPath = .SelectedItems(1) & "\" End If End If End With If MyPath = Empty Then MsgBox "フォルダー名表示をキャンセルしました。": Exit Sub 'Range("b2:c2").ShrinkToFit = True ' 縮小してセル内に表示 MyName = Dir(MyPath, vbDirectory) ' 最初のフォルダ名を返します。 '親フォルダー Range("A2") = MyPath Do While MyName <> "" ' ループを開始します。 ' 現在のフォルダと親フォルダは無視します。 If MyName <> "." And MyName <> ".." Then ' ビット単位の比較を行い、MyName がフォルダかどうかを調べます。 If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then Range("a" & i + 4) = MyPath & MyName ' アクティブシートA5セルから下方にフルパス表示。 Range("b" & i + 4) = MyName ' アクティブシートB5セルから下方にフォルダ名表示 i = i + 1 End If End If MyName = Dir ' 次のフォルダ名を返します。 Loop MsgBox MyPath & "の中にフォルダーは" & (i - 1) & "個のフォルダーがありました。" End Sub

  • VBAでのフォルダ指定方法について 2回目

    フォルダー指定時に使用する「ShellApp.BrowseForFolder」について教えてください。 パス指定するところに直にフルパスを記述すると、そのフォルダを先頭として配下のフォルダが表示されます。 -イメージー 【業務】  【業務1】  【業務2】 しかし、変数にするとエラーは出ないのですが指定したパスを無視してデフォルトの表示となります。 -イメージー 【デスクトップ】  【マイドキュメント】  【マイコンピュータ】      : ファイルを置いて実行させるフォルダーが固定で無いので、ファイルを置いてあるフォルダ配下のみ表示させたいのですが無理なのでしょうか。 実行環境が97なのが影響してるのでしょうか。 どなたか、お助けください。 以下、今試しているソースです。 Dim ShellApp As Object Dim oFolder As Object Dim MyPath As String MyPath = ActiveWorkbook.Path ChDir MyPath 'MyPathの中身が「C:\Documents and Settings\ABC\My Documents\業務」であることを確認 MsgBox (MyPath) Set ShellApp = CreateObject("Shell.Application") '直にパス指定すると、業務を先頭にその配下のフォルダ指定となる Set oFolder = ShellApp.BrowseForFolder(0, "処理ファイルの格納フォルダ選択", 1, "C:\Documents and Settings\ABC\My Documents\業務") 'MyPathがきいてない。デスクトップを先頭にその配下のフォルダ指定となる Set oFolder = ShellApp.BrowseForFolder(0, "処理ファイルの格納フォルダ選択", 1, MyPath)

  • batファイルで、あるディレクトリ配下に存在する場合は、実行を中断

    batファイルのコードで、 このbatファイルがある特定のディレクトリ内にある場合は、即座に実行を中断するようにしたいのですが、どうすればよいでしょうか。 詳しく述べます。 あるbatファイルがあります。 このbatファイルは、普段、マウスでダブルクリックして実行しています。 仮に、このbatファイルが C:\Temp\a というディレクトリにある場合に実行を中断するには、 ======================== set ThisScriptPath=%~dp0 if "%ThisScriptPath%" == "C:\Temp\a\" goto END ・・・ :END set ThisScriptPath= ======================== というようなコードを入れておけばいいと思います。 しかし、C:\Temp の中の「どのサブディレクトリにbatファイルがある場合でも(aサブディレクトリでもbサブディレクトリでも、何階層下でも)」実行を中断するにはどうすればいいのでしょうか。

  • bat処理

    batファイルを使ってCドライブのユーザーのtempフォルダの中の Excelファイルxlsを一括削除したい Osはwin7とxp for /d %%a in (subdir*) do del "%%a\*.jpg" うまく動きません、よろしくお願いします。

  • Excel VBA:ダイアログを使ってファイル名を取得したい

    ファイルを開く際に、GetOpenFilenameを使用し、以下のように記述しています。 Dim sFName As String Dim sPath As String sPath = ThisWorkbook.Path & "\データフォルダ" ChDir sPath sFName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", MultiSelect:=False) このとき、win98ですと、指定したフォルダが表示されますが、 win2000やXPですと、Excelのカレントフォルダが表示されます。 ダイアログ表示したときに、任意のフォルダを表示させるには、どのようにしたらよいですか? ご回答よろしくお願いします。

  • フォルダをコピー フォルダの中に入れたい FSO

    vbaです。よろしくお願いします。 Sub Sample() Dim myFSO As Object Dim MyPath As String MyPath = "C:\Users\ああああ\Desktop\" Set myFSO = CreateObject("Scripting.FileSystemObject") myFSO.CopyFolder MyPath & "コピーしたフォルダーを入れるフォルダー", MyPath & "コピーするフォルダ" Set myFSO = Nothing End Sub こんな感じで、デスクトップにある、"コピーするフォルダ"をコピーして、 デスクトップにある、"コピーしたフォルダーを入れるフォルダー"の中に入れたいのですが 上記のコードを実行しても何も起きません。 コピーしたフォルダーを入れるフォルダーの中身を見ても、空です。 ”コピーしたフォルダーを入れるフォルダー”の中に、"コピーするフォルダ" を入れる方法を教えてください。

  • bat処理リストを元にコピー

    batやvbsを使って下記のような動作ができるか教えて頂きたいです。 ・ ・ (1)数十個のファイル名一覧を拡張子付きでcsvでリスト化(ファイル毎に改行)済み (2)上記ファイルを元に[p:]ドライブ内でサブディレクトリを含め検索し[C:\copy]フォルダにコピーする。 以上の動作ですがbatでfor文を使用してやろうとしましたが、サブディレクトリまで含めた検索の動作ができません。 お分かりになる方宜しくお願い致します。

  • 実行時エラー 76 パスが見つかりません。

    VBAのFileSystemObjectでフォルダをコピーしているのですが フォルダ1は問題なくコピーできるのですが 毎回フォルダ2だけは、 実行時エラー 76 パスが見つかりません。 と言うエラーになってしまいます。 Sub Sample() Dim myFSO As Object Dim MyPath As String MyPath = "C:\" Set myFSO = CreateObject("Scripting.FileSystemObject") myFSO.CopyFolder MyPath & "フォルダ2", MyPath & "新フォルダ2" Set myFSO = Nothing End Sub このようなコードなのですが、フォルダ1もフォルダ2も同じコードを使っています。 フォルダ2に関しては容量が10GBくらいありますが、フォルダが重すぎるのが原因でしょうか?

専門家に質問してみよう