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

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

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

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

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

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

ADO.NET

ADO.NETは.NET Frameworkで各種データベースへの統一された接続機能を提供するソフトウェアコンポーネントの集合です。

Q&A

解決済

2回答

16293閲覧

vbscriptでファイル名をソートしたい

ykkchak

総合スコア15

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

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

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

ADO.NET

ADO.NETは.NET Frameworkで各種データベースへの統一された接続機能を提供するソフトウェアコンポーネントの集合です。

0グッド

0クリップ

投稿2017/09/01 04:44

編集2017/09/01 08:08

ADODB.Recordsetを使用して複数ファイルを取得時にソートしたいです。
DefinedSizeで100000を指定しましたところ、ソートがうまくできませんでした。
⇒adoR.Fields.Append "F_Name", 200, 100000
DefinedSize の上限は255ぽいです。
数百というファイルを処理するときにこれでは処理できません。
解決策を教えて頂けないでしょうか

■質問追記
⇒adoR.Fields.Append "F_Name", 201 を指定しても同様にダメでした。
⇒前提としまして、このPGMはサブPGMです。親側から複数回実行されます。
arg3は親からの引数でシーケンス番号(1,2・・)を表しています。
つまり、親で\input\シーケンス番号を作成しておいて、子でsndからファイルを
取得して\input\シーケンス番号に格納します。つまりsndでファイルを昇順で取得
することができれば、格納先のシーケンス番号にも若番が入っていきます。

※※※※ソースを張りなおします※※※※
Dim fso,filefullpath

Set fso = createObject("Scripting.FileSystemObject")
filefullpath = fso.getParentFolderName(WScript.ScriptFullName)

Dim objfso, mySH,objFolder

Set mySH = CreateObject("WScript.Shell")
Set objfso = CreateObject("Scripting.FileSystemObject")

'取得元ディレクトリ
Set objFolder = objfso.GetFolder(filefullpath & "\snd")

'格納先ディレクトリ
Dim inpass : inpass = filefullpath &"\input"& arg3 &""

Dim p: p = 0

Dim adoR
Dim FilN

'ソートの準備
Set adoR = CreateObject("ADODB.Recordset")
adoR.Fields.Append "F_Name", 201
adoR.Open

For Each FilN In objFolder.Files
adoR.AddNew
adoR.Fields(0) = FilN
adoR.Update
Next

'ファイルパスで昇順
adoR.Sort = "F_Name ASC"
adoR.MoveFirst

Do Until adoR.EOF
If p < arg1 then
objfso.MoveFile adoR.Fields(0) , inpass
p = p + 1
adoR.MoveNext
end if
Loop

adoR.Close: Set adoR = Nothing

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

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

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

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

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

sazi

2017/09/01 07:41

最終目的がMoveFile によるファイルの移動なら、並べ替えに何の意味があるのかは置いておいて、 objFolderをどのように作成しているのかに原因があるのではないかと思います。 その部分のコードも追記してみて下さい。
guest

回答2

0

長くなりそうなので、回答にならないかもしれませんがこちらで

⇒adoR.Fields.Append "F_Name", 201 を指定しても同様にダメでした。

ソートとは直接関係ありませんが、エラーが出ているということでしょうか?

⇒前提としまして、このPGMはサブPGMです。親側から複数回実行されます。
arg3は親からの引数でシーケンス番号(1,2・・)を表しています。
つまり、親で\input\シーケンス番号を作成しておいて、子でsndからファイルを
取得して\input\シーケンス番号に格納します。つまりsndでファイルを昇順で取得
することができれば、格納先のシーケンス番号にも若番が入っていきます。

端的に言うと、パラメータのフォルダに別なフォルダからファイルを移動するということですよね?
パラーメタの「シーケンス番号」のフォルダに単に移動するというなら、並べ替えは不要では?

ソート順に該当するシーケンス番号のフォルダに移動するというなら分かりますが、そういったロジックではないですし。

投稿2017/09/01 08:39

編集2017/09/01 08:40
sazi

総合スコア25300

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

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

0

ベストアンサー

⇒adoR.Fields.Append "F_Name", 200, 100000

第2引数(Type)が200ですが、これは、adVarChar(テキスト型)になります。これのフィールドサイズは最大255です。

Append メソッド
DataTypeEnum

255字以上のサイズの文字列を格納するには、adLongVarChar(201) にする必要があるのでは。

ファイル名が255文字以上の場合があるなら、

adoR.Fields.Append "F_Name", 201

255文字以内なら、

adoR.Fields.Append "F_Name", 200, 255

でいいのでは。(動作未確認です。)※VBSでは予約済み定数は使えないので数値に変更しました。

どちらにしても第3引数(DefinedSize)はフィールドサイズなので、ファイル件数(レコード件数)とは関係ないですね。

別案
VBSで配列をソートする方法としては、ADODB以外にも、ArrayList を使う方法があります。こちらの方も試してみては。

実験記録 No.02 : VBSで動的配列(ArrayList)を使う

あるいは、クイックソートやバブルソートなどのアルゴリズムを使って自前でソートする関数を作成するのもありですね。

配列を昇順または降順に並べ替える関数 - hatena chips

ただ、提示のコードを見る限り、同じフォルダーに入れているので、ソートする必要はないように思います。

投稿2017/09/01 05:32

編集2017/09/01 12:13
hatena19

総合スコア34053

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

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

ykkchak

2017/09/01 05:38

ご回答ありがとうございます。 それも試してみたいのですが以下の行ででてしまいます。。 adoR.Fields.Append "F_Name", adLongVarChar 引数が間違った型、許容範囲外、または競合しています。
sazi

2017/09/01 07:33

VbScriptではこの定数は使えないと思います。 直接値を指定してみて下さい。 adLongVarCharなら201ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問