アプリ版:「スタンプのみでお礼する」機能のリリースについて

●背景
従来ファイル/フォルダリスト生成に関してはDirを使用していましたが、レベルアップのためにFileSystemObject(以下FSO)を使用してと考え、ネット上のいろいろな資料で「変数なの?コードなの?コレクション??・・・」等々悩み、自分なりにFSO生成/参照/変数設定/値取得・・・のコメントを追加し下記にてなんとか実行可能になりました(一先ずMsgBox表示までリスト化分はこれからです)。
ファイル/フォルダリスト生成の標準にしたく下記質問となりました。

Sub try_fso()
'---FSO定義
Dim fso As Object
'---FSO参照結果格納変数定義
Dim folderObj As Object
Dim fileObj As Object
Dim subfObj As Object
'---対象保存先
対象保存先 = Range("B6")
'----FSO生成と参照変数コレクション格納
Set fso = CreateObject("Scripting.FileSystemObject")
Set folderObj = fso.getFolder(対象保存先)
'----ファイル名参照結果取得
For Each fileObj In folderObj.Files
MsgBox fileObj.Name
Next
'----サブフォルダ名参照結果取得
For Each subfObj In folderObj.Subfolders
MsgBox subfObj.Name
Next
End Sub
'----B6=Y:\LogData\TRY

■質問/お願い
 FSOの全体理解がまだ出来ていません。
 上記プログラム記述で「変数定義」「コメント」「コード」等々で何かおかしい所
 修正すべき所等々・・・アドバイスをお願いします。

質問者からの補足コメント

  • 言葉が不足していました。
    「ファイル/フォルダリスト生成の標準」
    ⇒『ファイル/フォルダリスト生成プログラムの
      標準/ベース/共通/参照プログラム
      にしたい』です。

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/10/18 13:14

A 回答 (6件)

返事、ありがとうございました。


お話の様子では、失礼ですが、相当、年齢の上の方にお見受けしました。
何か、気づかずに失礼な発言がありましたら、申し訳ありません。

>(自分はVBAから外には出ない/出られない/と思います。)
この意味がわかりました。でも、まだ、明日があると思うのでしたら、少しでも、新しいものを探し求めていくのは、楽しいことだと思います。

私のPCの師匠の一人(ひとりしかいないけれども)、定年で仕事を辞めてから、PCインストラクターとなったわけですが、今は、70過ぎなのに、元気な上に、なぜ、そんなにそんな仕事があるのか、OSが、アップグレードするたびに講演しています。

コンピュータの経歴なんていうものは、お話を聞いていれば大方は分かるものです。ただ、そういうことをするのが好きな人と、単に「やる・やらされていた」という人とでは、ずいぶん違いがあるものです。この前、どこかの質問で、老眼だから、打ち間違えるとか言っていた人がいますが、そんなことは絶対にありえません。年齢や身体の衰えを理由にするなんて、恥ずかしいことです。

ところで、いまさらですが、元の質問の解決には、本当は至っていないのではないでしょうか。以下は、本日、手探りにも近いですが、作ってみました。ルートからなんというのは、保証出来かねますが、自力でやってみました。

#3の回答は中途だったので、今度は、FileSystemObjectで作ってみました。結局、これは必ずできるのものなのだ、という気持ちがないと作れるものではないのですね。

今気がついたけれども、プロシージャ名が、getFolderというのはヘンでした。
-------------------

Private Const TARGETFOLDER As String = "D:\ExcelFol\MacroTest\"
Dim x As Long
Dim y As Long

Sub getFolder()
 Dim objFS As Object, objFolder As Object
 Dim dest As String
 '万が一にも別のブックに書き込まないような回避策
 ThisWorkbook.Activate
 If WorksheetFunction.CountA(ActiveSheet.UsedRange) > 0 Then
  If MsgBox("データを削除します。", vbInformation + vbOKCancel) = vbCancel Then
   Exit Sub
  Else
   ActiveSheet.UsedRange.ClearContents
  End If
 End If
 Set objFS = CreateObject("Scripting.FileSystemObject")
 ' 構造表示
 x = 1: y = 1
 If Right$(TARGETFOLDER, 1) <> "\" Then
  MsgBox "TARGETFOLDERの末尾に、¥を付けてください", vbExclamation: Exit Sub
 End If
 Cells(x, y).Value = TARGETFOLDER
 x = x + 1: y = 1
 Set objFolder = objFS.getFolder(TARGETFOLDER)
 Call ShowFolder(y, objFolder)
End Sub

Sub ShowFolder(ByVal header As Long, ByVal objFolder)
 Dim objSubs As Object, oSb
 Dim i As Long
 Dim eaFiles As Object
 Set objSubs = objFolder.Subfolders
 i = 1: y = i
 For Each oSb In objSubs
  If i = objSubs.Count Then
   ' 最後のサブフォルダの場合
   Cells(x, header + y).Value = oSb.Name
   Set eaFiles = oSb.Files
   Call ShowFiles(header + y, eaFiles)
   x = x + 1
   Call ShowFolder(header + y, oSb)
  Else
   ' 最後「以外」のサブフォルダの場合
   Cells(x, header + y).Value = oSb.Name
   x = x + 1
   Set eaFiles = oSb.Files
   Call ShowFiles(header + y, eaFiles)
   
   Call ShowFolder(header + y, oSb)
  End If
  i = i + 1
 Next
End Sub
Sub ShowFiles(header, ByRef eaFiles)
 Dim ea
 For Each ea In eaFiles
  Cells(x, header + 1).Value = Dir(ea.Path)
  x = x + 1
 Next
End Sub
    • good
    • 0
この回答へのお礼

長々とお付き合いありがとうございました。

その後ネットの情報を読み漁りながら、自分なりに勉強して『ファイル情報リスト化はやはりDirよりシンプルで効率の良くなるであろうFSO利用』を進めた結果、イメージしていた目標レベルまでどうにか到達し、標準(雛形)ができました。
(サブファイル下のファイルリスト作成は、再帰処理の理解がまだまだのため、ダミーfsoを設定しての処理で逃げています。再帰処理よりシンプルだとも思うのですが・・・?今後の課題です。)
読み漁りの中で「事前バインディング」を知りコードに織込みの結果、処理時間も短縮できました。(おまけ)

今回のようなFSO手法理解に際しての【気づき点】
・従来の様に画面でダラダラ読み込まず、エディター文字色設定を行った上でコードをエディタに貼り付けてから見る事。
・FSOを理解する場合は参照設定を行っておく事。
  ・オブジェクトブラウザー利用。
  ・事前バインディング化(コードシンプル化/可読性向上)。

お礼日時:2016/11/09 08:38

噛み合っていない延長かもしれませんが、もう少しだけ書かせていただきます。



>WindFallerさんはプログラマーをなさっていらっしゃるのですか?

なりたいと思ったことはありますが、まず、才能がないです。それに、VBAとしては、スタートラインで出遅れました。(2000年=Office 2000が一つの切れ目)。ここぞという時に、お金と時間を掛けないとダメなようです。どちらも、投資が足りませんでした。PCのインストラクターの資格は取ってはみたものの、理由があって教えてもいません。

しかし、今のVBAは、それを上回るほどの、やらなければならない・覚えなければならないものが山積しているはずです。今から覚えようとする人たちは、とても大変だと思います。Office2013 のVBAを取り外したのは、やがて、VBAがなくなる日の前哨戦のようなものではないかと思っています。

>(自分はVBAから外には出ない/出られない/と思います。)

年齢はお幾つか分かりませんが、そんなことはないと思います。
私などは、今度の東京オリンピックまで身体が持つのかなっていう状態でやっているのです。

Microsoft の世界に足を踏み入れている限りは、Microsoft に裏切られたという思いは、人生、何度か経験しなくてはならないはずです。その時に挫折してしまう人と、新たにスタートを切るかだけの話です。私は一度経験しましたから。

VBAはVBAとしても、FSOなどのオブジェクトに手を出すなら、なんとしても、JScript(JavaScript)は、手をつけたほうがよいです。FSOを含めてVBAとは違う世界のものです。これを学ぶと、VBAの考え方にプラスになります。また、それと同時にXMLを学ばなくてはならなくなります。

以下は、私の使っているツールのサイトです。
ここには、外部ツールのサンプルが豊富に載っていますので、それを試してもよいと思います。

http://www.vbsedit.com/scripts/default.asp

http://www.vbsedit.com/html/af4423b2-4ee8-41d6-a …
    • good
    • 0
この回答へのお礼

ありがとうございました。

 自分の生産技術ツールとしてのプログラムスタートは「ソードピップス」がスタートでしたアクサンテギュか何か忘れましたがタイプミス一箇所で1日無駄にしたのが思い出されます。(東京オリンピックまではだいじょうぶそうです。)
 
 その後ロータスに切替りマクロもピップスより使い勝手が良く重宝していましたが、流
れには逆らえずエクセルになりVBAも当初はロータスに比べエラー停止が多くてこずり
ましたがそれでも何とか使える様になり2003まではMicrosoftもまーまー使えるかの考えになりました。(その後一時生産技術実務を離れまていましたが・・)
 エクセル2007(技術シンプルツールからお節介機能強化版/Microsoftの裏切版)で再度VBAを使う様になり、過去は時間に追われ「力ずく」でのプログラムでしたが、せっかくの機会(時間も取れる)なので記述ルール見直/整理(構成/変数・・)配列利用・CSV直接取込・FSO利用・・・でプログラムのレベルを上げ様と苦戦している所です。
  
 ご指摘いただいた件、上記レベルアップと合せ現状の上流側(当社だと情報システム部/サーバー側/DB側)と下流側(生産技術/エクセル)の切り分けや中間ツール採用等々含めもう少し大きな目で見て行きたいと思います。(力が及ぶか・・?)

お礼日時:2016/10/31 14:40

こんばんは。



最初に、#3の私のマクロは変な内容だと思いませんか?
それが、他人のコードだったら、私もも、そう思います。(^^;
Dir で、一度ならず失敗してから、そのような書き方になりました。
一応、自己弁解しておきます。

以下、脈絡のない細切れ情報ですが、やっと書きまとめました。

>DoEventsに関して何か指針の様な物はお持ちですか?  カウンター制御/毎回実施・・・?

現在、私は、Excel 2013 ですが、2007から比較すると、遥かにハングする確率が高くなりました。もちろん、私のマクロ自体の問題もあるのでしょうけれども、そこから離脱するのは、DoEventsを入れて、Escキーでしか逃れられません。

たぶん、以下の話は、誤解されているようです。
》オートメーション・オブジェクトは、うかつに変数の型の宣言をすると失敗することがあります。

今、どれがどうとか具体的に思い出せないので、話がボケてしまうのですが、もともと、VBScript は、型の宣言ができませんね。変数だけです。そのせいか、VBAでも、一例としては、Object 型でも、As Object とはできないものがあったように記憶しています。数限りなく、コードを書いてみないといけませんが、「羹(あつものに)に懲(こ)りて」の例えのように、私は、元の原因を忘れてしまっています。

それと、負担の増える話にはなるのですが、僭越ですが、私からの目では、ご質問の内容は、まだ、開発の半ばなのではないでしょうか。まだ、峠の一番ややこしいところは越えていないと思うのです。そこに至る前に、ご自身の指針が間違っていないか、チェックする必要があったようにお見受けしました。

私はロクでもない言い方をしてしまいましたが、FSOとしての利用価値はあります。それに、それは更に続くわけだと思います。FSO側や他の外部オブジェクトに手を伸ばしていくにしても、そちら側の世界は、思った以上に大変です。

結局、VBAから離れてしまうことになっていくと思います。それも、また楽しいけれども、すぐ、PowerShell が待っていますし、やがては、C#などに入ってしまうと思います。そういう道が備わっていますからね。

>当方はプロシージャ間の変数カッコ渡しも「禁止」として変数名を表記した隣接セルに変数を落としたうえで他プロシージャに引き渡しています、初心者含め可読性を上げるための工夫としていますが如何な物でしょうか。

通常、セルは使わないです。
(バラしたら怒られるかもしれませんが、使っている人もいます。ただ、その技法は隠し技です。特にアドインなどで使います。本家のMSのアドインにも使われているようです。アドインには、1枚の見えないシートがあって、そこに書き込んでしまうのです。ここに定数を入れる人もいます。)

また、もう少し近い場所ですと、セルではなく、いわゆるカスタムプロパティの中に入れます。
CustomDocumentProperties(..)

しかし、プログラマブルの範囲では、通常、このような方式で、二種類あります。

Sub MacroA()
Dim n As Long
Dim m As Long
 n = 3
Call MacroB(n, m)
 MsgBox m
End Sub

Sub MacroB(arg1 As Long, arg2 As Long)
 arg2 = arg1 * 2
End Sub

他にもこのような書き方もあります。

Dim x As Long  'モジュールの一番最初に置く
Sub MacroC()
Dim y As Long
 y = 2
Call MacroD(y)
MsgBox x
End Sub
Sub MacroD(arg1 As Long)
 x = arg1 * 2 'x の変数に送られる
End Sub

可読性とは言っても、自分で書いたものでも、半年もすると忘れているので、いくら可読性を考えていても、そうはいかない例のほうが多いかもしれません。あまり、可読性を気にしていても、半年もすれば忘れて読めなくなるものだったりします。なぜ、そう書いたのか分からないものもあります。

なお、変数というよりも、全体的に英語を用いたほうが、治まりがよいような気がします。今後、どんどん英語が増えていく可能性が高いです。Excel 2013のヘルプは、オフラインの場合は、ダウンロードしなければなりませんが、その中は、みんな英語です。やむを得ないようにも思います。
    • good
    • 0
この回答へのお礼

ありがとうございました。

WindFallerさんはプログラマーをなさっていらっしゃるのですか?

自分は生産技術職です。
新規ラインでMES構築したまでは良かったのですが、工程解析を行うに当たり現状ではデータに溺れている様な状態です。
解析に際してもその解析方法を探るのに予備解析でサンプルデータをエクセル上であれやこれとやってみて、良さそうであればそのシートの解析手作業をVBA(考えられるエラートラップを掛けながら)連続大量処理でを行って結果を見てまた・・・・のような状態です。
上記のような状況で少なくとも担当者間で解析の流れが見えるように変数の日本語使用/セル渡しとしています。

売り物プログラムと自前プログラムとの差、自分の力不足もあり、論議が若干噛み合わない様な形でしたがいろいろ参考になりました。

FSOのノウハウ習得は確かにまだ峠の途中ですが、自分のやろうとしている範囲は実際に動くプログラムまで作成できているので(なんで?どうして?このコードの意味は?・・・周り全体の理解がまだまだ)、ファイル情報リスト化はやはりDirよりシンプルで効率の良くなるであろうFSOをもう少し勉強してみます。
(自分はVBAから外には出ない/出られない/と思います。)

お礼日時:2016/10/26 16:12

こんにちは。



基本的には、他人の出来合いのコードをみて、分かればそれで結構ですが、そうでないなら、コピー&ペーストして使うだけのものですよね。

ただ、FileSystemObject は、VBAの基本的なものではないと思うし、ご質問で出されたコードの範囲でしたら、VBA内のDir関数でも可能だと思います。

'これは、指定したフォルダの一層を取得するだけです。
'//
Sub TestGetDirs()
 Dim buf As String, myPath As String
 Dim i As Long, j As Long
 ReDim myDirs(200000)
 ReDim myFolders(100000)
 i = 1: j = 1
 'ユーザーの選択したフォルダ
 MyPath = "C:\Temp\Test1\"
 buf = Dir(MyPath & "*.*", vbNormal + vbDirectory)
 Do While buf <> ""
  If buf <> "." And buf <> ".." Then
   If (GetAttr(MyPath & buf) And vbDirectory) = vbDirectory Then
    myFolders(j) = buf
    j = j + 1
   ElseIf (GetAttr(MyPath & buf) And vbNormal) = vbNormal Then
    myDirs(i) = buf
    i = i + 1
   End If
  End If
  DoEvents 'おまじない
  buf = Dir
 Loop
 ReDim Preserve myDirs(i - 1)
 ReDim Preserve myFolders(j - 1)
 
End Sub


>FSOの全体理解がまだ出来ていません。
実は、私も理解していないのです。VBAでは、FileSystemObject は主流ではありません。必要に応じて使うだけです、参照設定でもしない限りは、入力補完のインテリセンスが利きません。

>上記プログラム記述で「変数定義」「コメント」「コード」等々で何かおかしい所

この種のオートメーション・オブジェクトは、うかつに変数の型の宣言をすると失敗することがあります。その分、むつかしいものがあります。

そこらを踏まえて、コードを書くしかありません。2byte 文字の変数を使っていらっしゃるようですが、あえて、初心者ですと宣言しているようなものです。2byte文字を変数にするのは避けたほうがよいです。

接頭辞(プレフィックス)は、今は、あまり細かく言わないようですが、fileObj ではなく、objFile ではないかと思います。数値型は、将来、間違いが起こるので、dbl,lng,intなどは、今は使わないほうが多いです。

http://www.relief.jp/itnote/archives/001268.php

本来は、変数やプロシージャの命名規則などもあるようですが、チームで構築しているわけではありませんから、そこまでは言いません。ただ、個人的に、プロシージャ名で、try_fso ですと、エラートラップと、エラー処理があるような連想をさせます。「fso を試す」という意味でしょうけれど……。

以下は、使わないものがありますし、Shell で使ったほうが早いこともあります。

: FileSystemObject
----- BuildPath     ----- FolderExists
----- CopyFile      ----- GetAbsolute.Path Name
----- CopyFolder     ----- GetBaseName
----- CreateFolder    ----- Get Drive
----- CreateTextFile   ----- Get DriveName
----- DeleteFile     ----- GetExtension Name
----- DeleteFolder    ----- GetFile
----- DriveExists    ----- GetFileName
Drives         ----- GetFileVersion
----- FileExists     ----- GetFolder

----- GetParentFolderName
----- GetSpecialFolder
----- GetStandardStream
----- GetTempName
----- MoveFile
----- MoveFolder
----- OpenTextFile

>ファイル/フォルダリスト生成の標準にしたく
それは、人の好き好きだと思いますが、基本的には、Dir 関数の処理法が優先すると思います。
    • good
    • 0
この回答へのお礼

ありがとうございました。

●Dir関数に関して、リスト作成の雛形(標準)を設定できておりコピペ利用しています。

●FSOに関して、確かに危険(混乱)を招きそうで・・・・との感じはありますが、ファイルリスト(各種プロパティー含む)の作成に関しては仕組※を理解した上で雛形さえ作成しておけばDirよりシンプルで効率の良いプログラム出来るのではと感じています。
※オブジェクトを生成してそのコレクションから必要なプロパティーを全て吐き出す?
今回は※の部分を的確な表現で変数宣言/コメントに反映したいと考えていました。

●接頭辞(プレフィックス)の件ありがとうございました、改めて行きます。
●参照設定でもしない限りは、入力補完のインテリセンス・・・・
 使わないものがありますし、Shell で使ったほうが早い・・・
 これから勉強です。

●変数の件、汎用変数(temp/buf/cnt/i・・・)までは良いのですが英語を使った変数名を何にするかで悩むよりは的確で情報量も多い「漢字」を使用しています。
(補足)当方はプロシージャ間の変数カッコ渡しも「禁止」として変数名を表記した隣接セルに変数を落としたうえで他プロシージャに引き渡しています、初心者含め可読性を上げるための工夫としていますが如何な物でしょうか。

●DoEvents 'おまじないに関して、当方でもDoLoopで多量ファイルを扱うときはプログラムの進み方を見てカウンターで調整しながら実行するようにしていますが効いているのか※(効いていないのか)・・・・?な所がありますが、DoEventsに関して何か指針の様な物はお持ちですか?  カウンター制御/毎回実施・・・?
※トラブルが発生した場合には確実に効いていのでおまじない効果は実感しています。

以上追加で質問(本来は補足?)させて頂きました。
お時間取っていただけるようであれば宜しくお願いします。

お礼日時:2016/10/24 08:38

もしかして、あなたがつくりたいのは、このようなものでしょうか。

(下記URL参照)
http://www.vector.co.jp/soft/winnt/util/se499921 …

以下、その紹介です。
----------------------------------------------
「Excelでファイル階層表(ソースつき)」の使い方

■「Excelでファイル階層表(ソースつき)」は、
指定したフォルダに含まれるフォルダとファイルの階層を
Excelシートに一覧表示するExcelファイルです。

フリーウェア―です。
マクロにはロックがかかっていません。
検証・改造・流用・譲渡など自由にご利用ください。
---------------------------------------------------

FileSystemObjectを使用して、作られていますので、参考になるかと思います。
    • good
    • 0
この回答へのお礼

ありがとうございました。

ご紹介いただいた件、内容はコピペで使用できるとは思いますが
自分にとってはブラックボックスでは・・・・
プログラムの内容も自分にとっては次の次の段階・・・
と感じました。

現状はお願いしたプログラムの
適切な変数定義や適切な処理コメントの等々により
FSOの全体基本的な理解を深めて行きたいと考えています。

お礼日時:2016/10/19 08:17

>ファイル/フォルダリスト生成の標準にしたく下記質問となりました。


ファイル/フォルダリスト生成の標準とは、具体的に、どのような処理ですか?
コードの内容ではなく、使う人から見たとき、どのような動作をするのかを教えてください。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!