🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

VBA

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ソート

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

Q&A

3回答

1290閲覧

エクスプローラー上のフォルダの文字列の長さ(フォント幅)で昇順にソートしたい

mizko

総合スコア18

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

VBA

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ソート

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

0グッド

0クリップ

投稿2021/02/22 09:09

前提・実現したいこと

windows標準エクスプローラーのフォルダのソートプログラムについての質問です。

  • フォルダ名のフォント文字幅を取得
  • 文字幅順に連番を降る

これを実現したいです。

手軽にVBSで書いてみたのですが思うようにできず、方法が思いつきません。

失敗した結果

 処理前
処理前

 処理後
処理後

本来やりたかったこと

(手動で名前を変えた)求める結果
イメージ説明
こう見た目が綺麗に並べたいです。

最初に試したアルゴリズムは、

1. フォルダ名を取得 2. フォルダ名の文字列の長さを取得 3. 長さを先頭に降る 4. 名前順にソートし、上から改めて連番を降る

という処理です。それでは半角英数字と漢字とで文字幅が違うことが分かりました。

そのため上記のアルゴリズム2と3を次のように修正しました。

1. フォルダ名を取得 2. フォルダ名をUTF-8からShiftJISに文字種変換の後、Byte数を取得する 3. Byte数を先頭に降る 4. 名前順にソートし、上から改めて連番を降る

この結果も失敗で、ここまでやって私がやりたかったのは「文字列の長さのソート」ではなく「文字列のフォント幅のソート」だと気づきました。

ということで
** エクスプローラー標準のフォントは何か。 **
** 文字列毎にそのフォント幅を取得する方法はあるのか。 **

この2点を特にお訊きしたいです。

該当のソースコード

長さを先頭に降る箇所のコード

VBS

1Function Proc(name) 2 3 num = LenByte(name)'Lennghを取ったり、ユーザー関数を試したりした 4 column_num =Right("0" & num, 2) 5 6 Proc = column_num & name 7 8End Function 9 10Function MyLen(ByVal a) 11 Dim c 12 c = 0 13 Dim i 14 For i = 0 To Len(a) - 1 15 Dim k 16 k = Mid(a, i + 1, 1) 17 If (Asc(k) And &HFF00) = 0 Then 18 c = c + 1 19 Else 20 c = c + 2 21 End If 22 Next 23 MyLen = c 24End Function 25 26Function LenByte(value) 27 Dim i, str 28 Dim bytes, code 29 LenByte = 0 30 31 If Trim(value) <> "" Then 32 For i = 1 To Len(value) 33 str = Mid(value, i, 1) 34 bytes = 1 35 code = AscW(str) 36 If (code And &HFF00) <> 0 Then 37 '半角カタカナ以外は、2バイト 38 If code < &HFF61 or code > &HFF9F Then bytes = 2 39 End If 40 LenByte = LenByte + bytes 41 Next 42 End If 43 44End Function

補足情報 

サクッと作れるだろうと思ってVBSでコーディングしましたが、実現できるならどの言語でもバッチファイルでも良いです。
どんな方法があるのでしょうか、お教えください

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

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

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

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

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

guest

回答3

0

半角英数字と漢字とで文字幅が違うことが分かりました。

プロポーショナルフォントは、そもそも文字毎に幅が異なりますが。

エクスプローラー標準のフォントは何か。

OSでもシステム設定でも変わります。SystemParametersInfo でも使用して取得するしかないのでは。
C#ならSystemFontsクラスから引っ張れます。

文字列毎にそのフォント幅を取得する方法はあるのか。

DrawText で描画幅を計算してみては。まあ、そこまで苦労して幅でソートしたところで、環境でフォント変わったら幅変わる可能性ありますけど。

SystemParametersInfoA function (winuser.h)
DrawText function (winuser.h)

投稿2021/02/22 10:17

編集2021/02/22 10:19
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ExcelVBAでやってみた。

VBA

1Function GetWidth(strText) 2 With Sheets(1).Range("A1") 3 .Font.Name = "Meiryo UI" 4 .Font.Size = 12 5 .Value = strText 6 .EntireColumn.AutoFit 7 GetWidth = .ColumnWidth 8 End With 9End Function

投稿2021/02/22 10:04

jinoji

総合スコア4592

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

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

0

部分回答で申し訳ないですが
public System.Drawing.SizeF MeasureString (string? text, System.Drawing.Font font, int width);
というのを見つけました。

リンク内容

プロポーショナルフォントだった場合は、順番の数字をつけたら「カーニング」によって変わるかもしれないから、番号をつけたあと、再度しらべて変更がないか、とかもいるかも。(どうつけても並び順にならないケースもありえるか?)

投稿2021/02/22 10:03

FromMZ1500

総合スコア496

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問