[[20180201205620]] 『vbsで特定の列に画像のファイル名を抽出する方法』(びんご) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『vbsで特定の列に画像のファイル名を抽出する方法』(びんご)

Option Explicit
Dim bk, c, ex, f, gf, i, n, r, sh, so
Set so = CreateObject("Scripting.FileSystemObject")
Set gf = so.GetFolder(".")
Set ex = GetObject(, "Excel.Application")
Set bk = ex.Workbooks(1)
Set sh = bk.Worksheets(1)
r = sh.Cells(sh.Rows.Count, 1).End(-4162).Row
For i = 1 to r
n = sh.Cells(i, 1).Value
For Each f In gf.Files
If n = Left(f.Name, Len(n)) and LCase(so.GetExtensionName(f.Name)) = "jpg" Then
c = sh.Cells(i, sh.Columns.Count).End(-4159).Column + 1
sh.Cells(i, c).Value = f.Name
End If
Next
Next
Set gf = Nothing
Set so = Nothing
MsgBox("Finished!")

上記のvbsは
A列に記入されている「商品番号」と、特定のフォルダで保存しているファイル名の頭の文字が一致し、なおかつ、拡張子が「jpg」の場合に横に書き出すというマクロです。
c = sh.Cells(i, sh.Columns.Count).End(-4159).Column + 1
の部分で
B列以降のセルに順番に書き出すという処理をしているのですが、
今回は特定のE列、G〜O列にファイル名を抽出したいと考えております。
ですが、上記のように順番に書き出しではなく特定の場所に書き出す方法がわからないのでお教え頂けませんか?

< 使用 Excel:Excel2013、使用 OS:Windows10 >


あらかじめ。
回答じゃないです。気になったところです。

(1) VBSっていってるけど、VBスクリプトじゃなくて、VBAのコードに見えるので、VBAの間違いでしょうか?(まぁ、私はVBS知らないのでそう見えるだけかもですけど)
【以下、VBAのコードとしてです。】
(2) インデントがついてないのですごく読みづらいです。
(3) 特定のE列、G〜O列の「特定」ってどこですか?エクセルの話であればシートやセルで説明してもらえませんか?
(E1〜E3、G4〜O10 の範囲に出力したいなど)
(4) 順番に書き出しではなく特定の場所 とのことですが、順序と出力場所 は別の話ではないでしょうか?
(5)FSO使うくらいのスキルがあるなら、型は省略しないほうがよくないですか?

ざ〜っとみると、カレントフォルダの1つ上の階層に入ってるjpgファイルを列挙するVBAのコードのように見えますが外してますか?
(もこな2) 2018/02/01(木) 21:36


(1) 実は以前ある方に作っていただいたもので、このマクロはvbsだという説明を受けております。
メモ帳でソースコードを張り、画像が保存されているフォルダに保存し、エクセルを開いた状態でこのマクロをクリックするとファイル名が抽出される仕組みになっております。

(2) インデントの件は申し訳ございません。
(3) 運営しているネットショップで商品を一括登録するときに画像も登録する必要があり、その際に
 のような商品画像URLを記述する必要があります。
そのセルの場所がE列とG〜O列に商品画像URLを記入する箇所になっており、その箇所に抽出するにはどのようにすべきか悩んでおります。

(4)確かにその通りでございます。

(5) FSOとは何でしょうか?

ちなみに、カレントフォルダの1つ上の階層に入ってるjpgファイルを列挙するVBAのコードのように見えますが外してますか?とはどう言う意味でしょうか?
(びんご) 2018/02/01(木) 22:11


衝突しましたがそのままアップします。

横からすみません。

これはvbsのコードにしか見えません。
また、vbsは変数の型は宣言出来ません。全てVariant型になります。
(通りすがり) 2018/02/01(木) 22:14


>通りすがりさん
フォローありがとうございます。
なるほど。ベースの技術が同じだから似たような感じになるんですね。勉強になります。

>びんごさん
(1)は上記のとおり、私がわかってなかっただけのようです。ごめんなさい。
(2)は、ExcelでVisual Basic Editorというのを開くと、VBAのコードを入力する専用の画面が
   ひらくのでインデントつけるときに便利です。
(3)はちょっとよくわかりません。なんか画像のフルパスの例と、このフォルダ名がどの列に
   入ってほしいなどの情報があると、VBAの方でお手伝いできるかもしれません。
(5)は分かりづらくてすみません。FileSystemObjectの略です。

外してますか? はちがいますか?って意味ですね。まぁVBAコードじゃなかったわけですが。。。

(もこな2) 2018/02/01(木) 22:32


これでどうですか?
 For i = 1 To r
    c = 5
    n = sh.Cells(i, 1).Value
    For Each f In gf.Files
        If n = Left(f.Name, Len(n)) And LCase(so.GetExtensionName(f.Name)) = "jpg" Then

            sh.Cells(i, c).Value = f.Name
            If c = 5 Then
                c = c + 2
            Else
                c = c + 1
            End If
        End If
    Next
 Next

(マナ) 2018/02/01(木) 22:36


ありがとうございます。
無事できました。
ちなみに、上記のプログラムはどのようなやり取りをしているのでしょうか?
一応勉強のため教えていただけませんか?
(びんご) 2018/02/01(木) 22:52

書き込み先Cells(i, c)の列番号cを
書き込む毎に、5→7→8→9→…
となるように加算しています。

で、次の「商品番号」に変わると、c=5でリセット

(マナ) 2018/02/01(木) 23:07


さようですね。
もし、今回の場合とは異なり、

D列とG〜O列だとしたら

C=4で

 If c = 5 Then
                c = c + 2
            Else
                c = c + 1

の箇所が
IF c =4 then

                 c = c + 3
             Else
                c = c + 1
になるということでしょうか?
(びんご) 2018/02/01(木) 23:13

はい。その理解でよいです。

もし、ファイル数が多いと、
P列以降にも書き込まれちゃいますが
わかりますよね。

(マナ) 2018/02/01(木) 23:25


すみません。便乗で質問です。
If n = Left(f.Name, Len(n)) and LCase(so.GetExtensionName(f.Name)) = "jpg" Then
の部分ってなにをやってるんでしょうか?
LCase(so.GetExtensionName(f.Name)) = "jpg" は 拡張子を小文字にしたらjpgか判定してるのはわかるんですが、 n = Left(f.Name, Len(n))がなにをやってるのかよくわからないです。
「Cells(i, 1).Value」がファイル名の左から「Cells(i, 1).Value」の文字数分抜き出したものと一致するかってどういう状態なんでしょう・・・
(もこな2) 2018/02/02(金) 00:03

すみません。↑わかりました。
ファイル名がA列の値つまり、商品番号で始まるものなのか判定してるんですね。
おもいっきり最初の質問文のなかに書いてありました。お騒がせいたしました。<(_ _)>
(もこな2) 2018/02/02(金) 00:21

お世話になります。
昨日ご相談した内容の応用になるのですが、

AIからAK列、AM,AP,AS列が画像ファイル名を入力する項目なのですが、

 If c = 36 Then
                c = c + 1
            Else
                c = c + 4
            else
                c = c + 7
            else 
                c = c + 10
であっておりますでしょうか?

(びんご) 2018/02/03(土) 23:57


条件分岐が2つならElseでいいけど、それ以上あるのだったら、ElseIfやselect Caceを使うといいです。
(通りすがり) 2018/02/04(日) 10:20

↓のページや、↓のページの次のページが参考になると思います。

http://excelvba.pc-users.net/fol6/6_1.html
(通りすがり) 2018/02/04(日) 10:34


これでどうですか?

 a = Array(35, 36, 37, 39, 42, 45)

 For i = 1 To r
    c = 0
    n = sh.Cells(i, 1).Value
    For Each f In gf.Files
        If n = Left(f.Name, Len(n)) And LCase(so.GetExtensionName(f.Name)) = "jpg" Then
            sh.Cells(i, a(c)).Value = f.Name
            c = c + 1
            If c > UBound(a) Then Exit For
        End If
    Next
 Next

(マナ) 2018/02/04(日) 11:01


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.