
どなたかご教示いただけましたら幸いです。
以前、
「_(アンダーバー)と-(ハイフン)に挟まれた文字列のフォルダを作成、同じ文字列を持つファイルを格納」
というマクロを組んでもらいました(下記コード記載します)。
今回その抽出条件を「_(アンダーバー)以前の文字列」に変更したいのですが、
マクロ素人のため、コードの書き換え箇所が分からず…。
どなたかご教示いただけませんでしょうか。
【以下コード】
Sub カラー名ごとにフォルダ分け()
Dim FPath, TargetFile, COLOR As String '変数宣言
FPath = Range("A1").Value 'FPathにa1のパスを代入
If FPath = "" Then Exit Sub 'もしパスがない(a1が空白)の場合マクロを中止します
Dim i As Long
Dim FSO As Object, f As Object
Set FSO = CreateObject("Scripting.FileSystemObject") 'FileSystemObjectを使えるようにします
For Each f In FSO.GetFolder(FPath).Files 'fにFilesコレクションを代入。For Each[配列orコレクション]がある限りnextまでの操作を繰り返す
TargetFile = f.Name 'TargetFileにファイル名(拡張子まで)を代入
'カラー名を取り出すための操作。要するに_と-に挟まれた文字列を取得したい
'InStrは指定した文字がその文字列の左から数えて何番目に出てくるかカウントしてくれます。
intdelm1 = InStr(TargetFile, "_") + 1 'ファイル名で、_(アンダーバー)が何文字目に出てくるか数えた数値を取得。
'それに+1することで、カラー名の開始位置数を取得、代入
intdelm2 = InStr(TargetFile, "-") '-(ハイフン)がが何文字目に出てくるか数えた数値を取得、代入
COLOR = Mid$(TargetFile, intdelm1, intdelm2 - intdelm1) 'Midは指定した文字列から文字を抜き出す開始位置、文字数設定することができます。
If FSO.FolderExists(FPath & "\" & COLOR) Then 'もし取得したカラーと同名のフォルダーがあれば、そこにファイルを移動します。
FSO.MoveFile f, FPath & "\" & COLOR & "\" & TargetFile
Else 'なければフォルダをつくり、そこにファイルを移動します
FSO.CreateFolder (FPath & "\" & COLOR) '取得したカラー名のフォルダをa1で指定したファイルの直下に生成します
FSO.MoveFile f, FPath & "\" & COLOR & "\" & TargetFile
End If
Next
'以下、作ったフォルダ内のファイル数をカウントして2以下の場合、ファイルをもとのフォルダに移動する操作。
Dim CO As Integer
For Each FO In FSO.GetFolder(FPath).SubFolders 'FOにSubFoldersコレクションを代入
CO = FSO.GetFolder(FO).Files.Count 'ファイル数カウント
If CO < 3 Then
For Each f2 In FSO.GetFolder(FO).Files '入れ子next
TargetFile2 = f2.Name
FSO.MoveFile f2, FPath & "\" & TargetFile2
Next
FSO.DeleteFolder FO
End If
Next
Set FSO = Nothing
End Sub
~ここまで~
何卒宜しくお願い致します。
No.2ベストアンサー
- 回答日時:
こんにちは
ご質問以外の処理が全く同じで良いのかわかりませんが、ご提示のコードには十分なコメントが入れられているので、それを読んでも推測できそうに思いますが…
>TargetFile = f.Name 'TargetFileにファイル名(拡張子まで)を代入
>intdelm1 = InStr(TargetFile, "_") + 1 'ファイル名で、_(アンダーバー)が何文字目
>intdelm2 = InStr(TargetFile, "-") '-(ハイフン)がが何文字目
>COLOR = Mid$(TargetFile, intdelm1, intdelm2 - intdelm1)
の4行で、元のファイル名(=TargetFile)から所定の文字列を抜き出しています(結果はCOLORに格納)。
>コードの書き換え箇所が分からず…。
ですので、上記の部分(下3行)を変更なされば宜しいでしょう。
intdelm1 = InStr(TargetFile, "_") - 1
COLOR = Left(TargetFile, intdelm1)
※ 通常のVBAでは COLOR はシステム変数名(予約語)になっていると思いますので、他の変数名を利用なさった方が賢明かと思います。
fujillinさん
こちらでもご回答いただき、ありがとうございます。
ご教示いただきました内容で書き換えましたら、希望の形で動作いたしました!
元々のコード内に丁寧なコメントがありますが、何しろ私がまるきり素人でして、
書き換えのルールといいますか、例えばhtmlタグのように対になるものや、
修正の範囲(ブロック)が分かっておらず、下手に触れないという情けない状況で
こういったご質問をさせていただきました。
スタートラインにも立っていない素人からの稚拙な質問に、ご気分を害されましたら失礼いたしました。
fujillinさんのご回答のおかげで、作業効率がぐんと上がりそうです。
誠にありがとうございました。
No.1
- 回答日時:
試していませんが、
intdelm1 = 1 'ファイル名の先頭位置
intdelm2 = InStr(TargetFile, "_") '_(アンダーバー)が何文字目に出てくるか数えた数値を取得、代入
の2行の書き換えでいけるような気が。
次の行の
COLOR = Mid$(TargetFile, intdelm1, intdelm2 - intdelm1)
でファイル名先頭からアンダーバー手前までが抽出されるはず。
iprjctkrrさん
早々にご回答いただき、ありがとうございました!
ご教示いただいた内容の書き換えでは、うまく動作しませんでした。。。
(当方まるきりの素人なので、書き換えに失敗しているのかもしれません)
ご丁寧にコード内にコメントまで付けてご教示いただき、誠にありがとうございました*
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA セル間のリンク修正につい...
-
VBAでCOPYを繰り返すと、処理が...
-
複数のExcelファイルをマージす...
-
【マクロ】並び替えの範囲が、...
-
Excelのマクロについて教えてく...
-
VBA 最終行の取得がうまくいか...
-
Vba Array関数について教えてく...
-
【マクロ】シートの変数へ入れ...
-
【マクロ】開いているブックの...
-
【ExcelVBA】値を変更しながら...
-
vba textboxへの入力について教...
-
改行文字「vbCrLf」とは
-
VB.net 文字列から日付型へ変更...
-
WindowsのOutlook を VBA から...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
Excelのマクロについて教えてく...
-
VBAの質問(Msgboxについて)です
-
エクセルのVBAについて教えてく...
-
Vba 型が一致しません(エラー1...
-
VBAで特定の文字が入った行をコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
pythonにCでのexternはありますか
-
マクロの書き換え箇所がわかり...
-
c言語 グローバル変数
-
c言語、マクロについて
-
python 3.10で 同じlistに同じ...
-
Perlで変数中のエスケープされ...
-
CSVから構造体へ代入
-
UWSCにおける変数の扱い方
-
UTF-8で5~6バイトになる文字コ...
-
COBOLのCOMP形式について
-
10Mバイトて文字数に すると何...
-
char str[256]の256の意味は?
-
stable diffusionのエラー
-
Excel 1セル当りの文字数が2...
-
「1TB」のHDDに日本語は何字入...
-
DataGridViewの特定列に入力さ...
-
ピクセル,dpiから容量(バイト...
-
Excel VBA メール作成について ...
-
バイト列とバイナリ列の違いが...
-
エクセルシート名の制限を変更...
おすすめ情報