質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

4回答

4018閲覧

VBAでFilesコレクションからオブジェクトを逆順に取得する方法

naonaoki

総合スコア5

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/02/09 06:14

VBAでFilesコレクションからオブジェクトを逆順に取得する方法

初めてVBAで開発をしている者です。

現在、フォルダ内の画像を取得し、エクセルシートに張り付けるマクロを書いています。
フォルダ内の画像を順番(昇順)に取得することは、以下のコードで実現することができました。

vba

1 For Each objFile In objFldr.GetFolder(strSelect).Files 2 Debug.Print TypeName(objFile) 3 ActiveSheet.Shapes.AddPicture _ 4 Filename:=objFile, _ 5 LinkToFile:=False, _ 6 SaveWithDocument:=True, _ 7 Left:=c.Left, _ 8 Top:=c.Top, _ 9 Width:=c.Width, _ 10 Height:=c.Height 11 count = count + 1 12 13 If flag = True Then 14 flag = False 15 Set c = c.Offset(0, 2) 16 Else 17 flag = True 18 Set c = c.Offset(3, -2) 19 End If 20 If count = 8 Then 21 Set c = c.Offset(3, 0) 22 count = 0 23 End If 24Next

しかし、画像を逆順(降順)に取得するため、以下のコードを記述した場合、エラーが発生してしまいます。

vba

1Set objFile = objFldr.GetFolder(strSelect).Files 2 Dim i As Long 3 For i = objFile.count To 1 Step -1 4 ActiveSheet.Shapes.AddPicture _ 5 Filename:=objFile.Item(i), _ 'エラーが発生している部分 6 LinkToFile:=False, _ 7 SaveWithDocument:=True, _ 8 Left:=c.Left, _ 9 Top:=c.Top, _ 10 Width:=c.Width, _ 11 Height:=c.Height 12 count = count + 1 13 14 If flag = True Then 15 flag = False 16 Set c = c.Offset(0, 2) 17 Else 18 flag = True 19 Set c = c.Offset(3, -2) 20 End If 21 If count = 8 Then 22 Set c = c.Offset(3, 0) 23 count = 0 24 End If 25 Next i

filesコレクションの要素を取得するやり方として、(filesコレクション).Itemという
書き方がそもそも違うのでしょうか?
それともfilesコレクションに対してインデックスを指定して取得することはできないのでしょうか?

解決策が見つけられず質問致しました。
稚拙な質問で申し訳ないですが、よろしくお願い致します。

発生している問題・エラーメッセージ

実行時エラー'5': プロシージャの呼び出し、または引数が不正です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

naonaoki

2020/03/01 03:39

回答ありがとうございます! 無事解決しました!
guest

回答4

0

Microsoftのオフィシャルな記事ではないと思いますが
以下のURLに記述があります。

https://www.moug.net/tech/exvba/0060001.html (mougモーグ)

実は、FileSystemObjectのFilesコレクションは、

「Fles("Sample.xls")」

のようにメンバー名で特定することはできても、

「Files(1)」

のような、インデックス値による特定はできないのです。

投稿2020/02/10 01:01

h.horikoshi

総合スコア505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

naonaoki

2020/03/01 03:42

インデックス取得できないのは何となく不便ですね… 回答ありがとうございます!
guest

0

降順も昇順もソートを行うことをすすめます。
NTFSはソートされて取得できますが
FAT32の場合ファイルの作成された順に取得されます。

投稿2020/02/09 07:30

sinzou

総合スコア392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/02/09 08:17 編集

質問自体は「Itemが使えないのか」と言うことに関してですが、ソート順について触れられていたので高評価させていただきました。 sinzouさんが指摘されているように、Filesコレクションでの列挙でファイル名がソートされて取得できるかどうかは、意外と考慮に入れられていないことが多いようです。 https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/files-collection でも、公式には並び順に触れられていません。USBメモリなどファイルシステムが違う場合に問題が発覚します。
sinzou

2020/02/09 11:39

ソートすることを省略せずに NTFSでもFAT32でも誤動作がないプログラム組めますよー との意味で投稿しました すみません。
naonaoki

2020/03/01 03:46 編集

回答ありがとうございます! ファイルシステムによってソートの違いがあるんですね… 勉強になりました。 降順貼り付けが解決したので昇順の方でもソートすることにしてみます。
guest

0

ドキュメントを見たところ、Itemメソッドはなさそうですね。
一旦、配列にファイル名を格納してから逆順でファイル名を取得するのが良いかと思います。

投稿2020/02/09 06:48

meg_

総合スコア10760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

naonaoki

2020/03/01 03:41

回答ありがとうございます! 無事解決することができました!
guest

0

ベストアンサー

出来ないなら自作するまでかなぁ。。。。

ExcelVBA

1Option Explicit 2 3Sub test() 4 Dim FSO As FileSystemObject 5 Dim myFiles As Collection 6 Dim i As Long 7 Dim f As File 8 9 Set FSO = New FileSystemObject 10 Set myFiles = New Collection 11 12 If GetMyFiles(FSO.GetFolder("C:\Users\hiraigumit\Pictures"), myFiles) Then 13 For Each f In myFiles 14 i = i + 1 15 SetDeploy f, i 16 Next 17 End If 18End Sub 19 20Function GetMyFiles(ByRef objFolder As Folder, _ 21 ByRef objResult As Collection) As Boolean 22 Dim i As Long 23 Dim f As File 24 25 For Each f In objFolder.Files 26 If objResult.Count > 1 Then 27 objResult.Add Item:=f, Key:=f.Name, before:=1 28 Else 29 objResult.Add Item:=f, Key:=f.Name 30 End If 31 Next 32 33 GetMyFiles = objResult.Count 34End Function 35 36Sub SetDeploy(ByRef pFile As File, _ 37 ByVal ix As Long) 38 Dim Rng As Range 39 Dim c As Range 40 Dim Pic As Shape 41 42 Set Rng = ThisWorkbook.Worksheets(1).Range("D:G") 43 Set c = Rng(ix) 44 45 On Error Resume Next 46 With c 47 Set Pic = .Worksheet.Shapes.AddPicture( _ 48 Filename:=pFile.Path, _ 49 LinkToFile:=False, _ 50 SaveWithDocument:=True, _ 51 Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height) 52 End With 53End Sub

投稿2020/02/14 06:51

mattuwan

総合スコア2163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

naonaoki

2020/03/01 03:43

回答ありがとうございます! 解決するにあたって参考にさせていただきました!
naonaoki

2020/03/01 03:45

どれもベストアンサーにしたかったのですが、 わざわざコードを書いてくださっていたので今回はこちらを ベストアンサーにさせていただきました…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問