[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『フォルダ、ファイルはセルと同じ、すでにあったら連番』(製缶業です)
困っています、なんとか教えて下さい。やりたいのは、セルB2に会社名が入っていて、その名前によってあらかじめ用意してある同じ会社名のフォルダの中に、D8×F8×G6(D8等にはセルの中の数字)というフォルダをなければ新しく作り、おなじD8×F8×G6というファイルをそのフォルダの中につくりたいのです。もしあれば、フォルダ名は同じで、ファイル名に連番(D8×F8×G6-1こんな感じ)を付けてそのフォルダに保存したいのですが、
各メーカーから箱の作成の注文が色々なサイズで来るのですが、同じサイズでも、内容が違っているためその都度、調べて、フォルダを作ってファイルをつくらないといけません。いろいろなネットや本を調べたのですが当方の勉強不足でわかりません、何卒宜しくお願いいたします。
< 使用 Excel:Excel2013、使用 OS:Windows10 >
ご質問から推察するに、ポイントは大きく分けて
1) フォルダを作成する 2) ファイルの存在をチェックする 3) ファイル(ブック)を保存する
という3点になろうかとおもいます。このうち、
1)は「使用 OS:Windows10 」であればコマンドプロンプトの「MDコマンド」を利用するという手もあろうかと思います。
2)はDir関数を使ってみてはどうでしょうか
3)はマクロの記録で必要な命令を調べることができます。
もちろん上記に挙げた方法以外でも解決可能だと思いますので、まずは現状のコードを示してわからない部分をピンポイントで聞くようにするとより具体的なアドバイスが得られると思いますのてまずはトライしてみてはどうでしょか。
(もこな2) 2021/07/25(日) 16:47
こんばんは ^^ 多分、このままでは、お役に立たないとはおもいますが [どんどん増殖していきます。。。乳酸菌みたい^^;] 何かの足しにでも。Dir関数、とMkdirステートメント使 ってみました。 このブックと同じフォルダに、Sheet1 のB2の値と同じ名前のフォルダ が存在することが前程です。 Option Explicit Sub zOneInstance() Dim fD1 As String Dim fD2 As String Dim fDx As String Dim fNm As String Dim i As Long With Worksheets("Sheet1") fD1 = ThisWorkbook.Path & "\" & .Range("B2") & "\" fD2 = CStr(.Cells(8, 4) * .Cells(8, 6) * .Cells(8, 7)) End With fDx = fD1 & fD2 If Dir(fDx, vbDirectory) = "" Then MkDir (fDx) End If fDx = fDx & "\" If Dir(fDx & fD2 & ".xlsx") = "" Then fNm = fDx & fD2 & ".xlsx" Else Do i = i + 1 fNm = Dir(fDx & fD2 & "-" & i & ".xlsx") If fNm = "" Then fNm = fDx & fD2 & "-" & i & ".xlsx" Exit Do End If If i Mod 24 = 0 Then DoEvents Loop End If Workbooks.Add.SaveAs fNm, 51 ActiveWorkbook.Close False End Sub (隠居じーさん) 2021/07/25(日) 18:10
Sub test
Const mpath As String="F:¥"
Dim fpath As String
Dim wname As String
Dim fname As String
Dim tmp As String
Dim no As Integer
wname = Range("D8").Value & Range("F8").Value & Range("G8").Value
If Dir(mpath & wname. vbDirectory) = ""Then
MkDir mpath & wname
End If
fname = mpath & wname & "¥" & wname & ".xlsm"
If Dir(fname) = "" Then
ThisWorkbook.SaveAs Filename:=fname
Else
fpath = mpath & wname & "¥"
fname =Dir(fpath & "*.xlsm",vbNormal)
Do Until fname = ""
tmp = Mid(fname, InStrRev(fname,"¥")+1)
If Left(tmp,Len(fname)) = fname Then
If Left(tmp,Len(tmp) -5*1> no Then
no = no + 1
End If
End If
fname = Dir()
Loop
ThisWorkbook.SaveAs Filename:=fpath & wname & no & ".xlsm"
End If
MsgBox "終了"
End Sub
(製缶業です) 2021/07/25(日) 18:49
こんばんは ^^ ちょい、こちらへの、転記ミス、みたいなのがありましたが Fドライブのフォルダではなく、Fドライブのカレントに 出力されていますよ。^^;、当方ではエラーは出ませんが ファイル名が変更されていないので、どんどん、上書きメッセージが でて、上書きされる状態ですね、このへんを、改良されるといいですよ。 (隠居じーさん) 2021/07/25(日) 19:47
失礼いたしました、 ↑ ¥が全て全角になっていましたですよ、全て半角に変換すれば 正常に動作しているようですよ、[Dドラの所定のフォルダ化下に どんどん、増殖してますよ^^;]運用面は解りませんが。。。(#^.^#)v
(隠居じーさん) 2021/07/25(日) 19:55
お題をお借りして練習させて頂きました。 枝番は必ず-1から始まるのはご了承下さい。 各会社名のフォルダは存在するのが前提です。
Sub test()
Dim FSO As Object: Set FSO = CreateObject("Scripting.FileSystemObject") Dim FileName As String, FolderName As String, iFilePath As String
FileName = Range("D8").Value & "×" & Range("F8").Value & "×" & Range("G8").Value FolderName = FSO.BuildPath("F:\", Range("B2") & "\" & FileName) ThisWorkbook.Save If FSO.FolderExists(FolderName) Then 'ファイル名のフォルダが存在する場合 Dim iFile As Object, buf As Long, cnt As Long For Each iFile In FSO.GetFolder(FolderName).Files buf = CLng(Mid(FSO.GetBaseName(iFile), InStr(FSO.GetBaseName(iFile), "-") + 1)) If buf > cnt Then cnt = buf Next cnt = cnt + 1 iFilePath = FSO.BuildPath(FolderName, FileName & "-" & cnt & ".xlsm") FSO.CopyFile ThisWorkbook.FullName, iFilePath Else 'ファイル名のフォルダが無かった場合 FSO.CreateFolder FolderName FSO.CopyFile ThisWorkbook.FullName, FolderName & "\" & FileName & "-1.xlsm" End If
End Sub (名無し) 2021/07/25(日) 20:01
(製缶業です) 2021/07/25(日) 20:58
(製缶業です) 2021/07/31(土) 09:43
データサーバのフォルダ階層に合わせてF:\は書き換えていらっしゃいますよね? ThisWorkbook.SaveCopyAs に変更するとどうなりますでしょうか。 会社名のフォルダが無い場合作成するバージョンにしましたので、これで試していただけますか?
Sub test()
Dim FSO As Object: Set FSO = CreateObject("Scripting.FileSystemObject")
ThisWorkbook.Save Const iParent As String = "F:\" Dim CorpName As String, FileName As String CorpName = Range("B2").Value FileName = Range("D8").Value & "×" & Range("F8").Value & "×" & Range("G8").Value If FSO.FolderExists(FSO.BuildPath(iParent, CorpName)) = False Then FSO.CreateFolder FSO.BuildPath(iParent, CorpName) End If
Dim FolderName As String, iPath As String FolderName = FSO.BuildPath(iParent, FSO.BuildPath(CorpName, FileName)) If FSO.FolderExists(FolderName) Then Dim iFile As Object, buf As Long, cnt As Long For Each iFile In FSO.GetFolder(FolderName).Files buf = CLng(Mid(FSO.GetBaseName(iFile), InStr(FSO.GetBaseName(iFile), "-") + 1)) If buf > cnt Then cnt = buf Next iPath = FSO.BuildPath(FolderName, FileName & "-" & cnt + 1 & ".xlsm") Else FSO.CreateFolder FolderName iPath = FSO.BuildPath(FolderName, FileName & "-1.xlsm") End If ' FSO.CopyFile ThisWorkbook.FullName, iPath ThisWorkbook.SaveCopyAs iPath
End Sub (名無し) 2021/07/31(土) 13:20
すでに、隠居じーさんさんや名無しさんとの話が進んでいるようなので混乱防止のため一段落したあとでお読みください 「2021/07/25(日) 18:49」のコードを拝見しての感想です。
■1
VBAの世界では基本的にシートやセル(オブジェクトといいます)を明示すれば、いちいち選択したりアクティブにしたりする必要はありません。
さらに、「標準モジュール」でシートの指定を省略すると、アクティブシートを指定したものとして扱われます。
したがって、きちんとオブジェクトを修飾(指定)するようにしたほうが良いでしょう。
■2
VBAでは、インデント(字下げ)を付けることに実行上の意味はありません。
ですが、適度にインデントを付けるようにすると可読性がアップしご自身のデバッグ作業効率がアップすると思いますので、こだわりが無ければインデントをつけるようにするとよいとおもいます。
■3
既に気づいておられるようですが、MkDirでフォルダを作ろうとする場合、すでに存在する場合や、親フォルダが無かったりすると実行時エラーになります。
「MDコマンド」もありますよとお伝えしたのは↑のことを踏まえてでした。
■4
当たり前ですが↓ですと自身を保存します。
ThisWorkbook.SaveAs
しかし想像するにマクロを記述するブックは雛形のようなものなのでしょうから、コピーしたブック(シート)を保存されるようにしたほうがよいとおもいます。
さらに、保存するブックにマクロは不要だと思うので「xlsx」形式で保存したほうがよいとおもいます。
■5
ということを踏まえると↓のようなアプローチもあるとおもいます。
(完成品のプレゼントではなく、研究用として提示します)
Sub さんぷる() Const ルートフォルダ As String = "F:\" Dim ベースファイル名 As String Dim フォルダパス As String Dim buf As String Dim 枝番号 As Long Dim 保存ファイルパス As String
ActiveSheet.Copy With Workbooks(Workbooks.Count).Worksheets(1)
ベースファイル名 = .Range("D8").Value & "×" & .Range("F8").Value & "×" & .Range("G8").Value フォルダパス = ルートフォルダ & .Range("B2").Value & "\" & ベースファイル名
'(1)フォルダを作成する With CreateObject("WScript.Shell").Exec("%ComSpec% /c MD " & フォルダパス) Do While .Status = 0 DoEvents Loop End With
'(2)ファイルの存在をチェックする buf = Dir(フォルダパス & "\" & ベースファイル名 & ".xlsx") Do Until buf = "" 枝番号 = 枝番号 + 1 buf = Dir(フォルダパス & "\" & ベースファイル名 & "-" & 枝番号 & ".xlsx") Loop
'(3)保存(して閉じる) If 枝番号 = 0 Then 保存ファイルパス = フォルダパス & "\" & ベースファイル名 Else 保存ファイルパス = フォルダパス & "\" & ベースファイル名 & "-" & 枝番号 End If .Parent.SaveAs Filename:=保存ファイルパス, FileFormat:=xlOpenXMLWorkbook .Parent.Close False End With End Sub
(もこな2 ) 2021/08/01(日) 13:08
(製缶業です) 2021/08/21(土) 10:17
初回に保存するパスの指定をよく見直してください。 今回提示されたコードには、抜けてるものがありますよ。 (名無し) 2021/08/21(土) 10:29
あなたが書き換える前の部分と書き換えた後の部分のそれぞれに、 ファイルの保存先(パス)を指定する箇所がありますよね? そこをよく比較して見直してください。 実力云々ではありません。 -- 正直申しまして、前回修正したものについての報告もありませんし、 自分でコード書き換えて、想定通り動かないと言われても、という気持ちでおります。
(名無し) 2021/08/21(土) 11:59
(製缶業です) 2021/08/21(土) 13:44
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.