[[20150326140908]] 『セル』(ダメおやじ) ページの最後に飛ぶ

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

 

『セル』(ダメおやじ)

 今A1セルにD-A-Bというアルファベットの記号が入っています。そのD-A-Bの記号をA-B-Dというふうに降順に置き換えたいのですが、エクセルの降順ボタンとか並び替えボタンではなりません。A行にはA2セル〜A18セルまでこのアルファベットの記号が順序不同で入っています。そして中には空セルあるのですが、すべてセルに入っているアルファベット記号を降順にしたいのです。エクセルの並び替えボタンでする場合どのようにしたら並べ替えられるのか教えていただきたく書きました。また、関数式とか関数で置き換えられるのでしたら、その仕方を教えてください。お願いします。(ダメおやじ)

< 使用 Excel:Excel2003、使用 OS:Windows2000 >


 標準モジュールに下記のコードを置き、下記の式で。
 A1 にデータがあれば、
 B1 =dataSort(A1,"-")

 Function dataSort(dt, dl)
    With CreateObject("System.Collections.SortedList")
        For Each d In Split(dt, dl)
            .Add d, d
        Next
        Dim i As Long
        For i = 0 To .Count - 1
            dataSort = dataSort & IIf(dataSort = "", "", dl) & .GetKey(i)
        Next
    End With
 End Function

(Mook) 2015/03/26(木) 14:36


 Mookさんの SortedList がベストですが、乗り遅れた(?)ので、ArrayList で。(そのため、わざわざ、Sortが必要)
 ただ、SortedListにしろ、ArrayListにしろ、Win2000 + xl2003 でサポートされるかどうか、不安ですが。

 とりあえずは普通のマクロです。
 少し手を入れれば、Mookさんの構成のように、シート上で =なんとか とすることもできます。

 と、いったん、通常マクロでアップしましたがUDFで書き直しました。

 どこかのセルに =SortInCell(A1,"-") と入れてみてください。

 Function SortInCell(r As Range, chr As String) As String
    Dim dList As Object
    Dim w As Variant
    Dim s As Variant
    Dim i As Long

    Set dList = CreateObject("System.Collections.ArrayList")
    w = Split(r.Value, "-")
    For Each s In w
        dList.Add s
    Next

    dList.Sort

    For i = 0 To dList.Count - 1
        w(i) = dList(i)
    Next

    SortInCell = Join(w, "-")

 End Function

(β) 2015/03/26(木) 14:58


 > A-B-Dというふうに降順に置き換えたい

 昇順でしょ?

 別の質問(未解決ですが)を見ると、すべてアルファベット3つの組み合わせのようなので。

 =IF(A1="","",CHAR(SMALL(CODE(MID(A1,{1,3,5},1)),1))&"-"&CHAR(SMALL(CODE(MID(A1,{1,3,5},1)),2))&"-"&CHAR(SMALL(CODE(MID(A1,{1,3,5},1)),3)))
 
(JKT) 2015/03/26(木) 15:25

 部外者です。時折、このサイトを覗いています。私には難しい事ばかりですので質問します。

 1)CreateObject("System.Collections.ArrayList")
   CreateObjectは、このサイトでよく見かけるキーワードなのでお聞きします。
   CreateObjectの引数はどうなっているのですか?(どの位の種類があるのですか?)
   これ等に関するリファレンスブックは何処で売っているのですか? 若しくは紹介サイトは?
    私の町では簡単な使用法を書いた程度の本しかありません。

 2)JKTさんへ       .......
   CHAR(SMALL(CODE(MID(A1,{1,3,5},1)),1)) の意味を教えて下さい。{}で囲ってある所です。
                 
 よろしくお願いします。 
(やっぱり初歩) 2015/03/26(木) 16:09

 VBA には様々な組み込みのメソッドがあり、我々はそれを利用できるのですが、VBAが持っているもの以外の
 VBA から見れば「外部」のプログラムを利用したいことがちょいちょいあります。

 そんな時、CreateObject で、そのプログラムを呼び出します。(参照設定という方法もありますが割愛)
 どのプログラムは、どんな名前で呼び出すかは、決まっているのですが、一覧になっているものを見たことはないですね。

 よく見かけられるのは Scripting.Dictionary とか Scripting.FileSystemObject とか VBScript.RegExp あとは WScript.Shell あたりでしょうか。

https://msdn.microsoft.com/ja-jp/library/7t9k08y5(v=vs.90).aspx

(β) 2015/03/26(木) 17:13


 βさん 有難うございます。
 『API関数』同様に『CreateObject』も素人には扱いづらいですね。使用方法やメンバーは何か分かりません。
 今時は昔のようにリファレンスブックを出しても売れにないでしょうから。ネットで情報収集が可能だから・・・
 私はこんな時、昔を懐かしく思います。
(やっぱり初歩) 2015/03/26(木) 17:36

今回の例では、以下のページを表示してください。
https://msdn.microsoft.com/ja-jp/library/gg145045(v=vs.110).aspx

そして、以下を選択していくと、MSが公開している説明が見られます。
System.Collections
System.Collections
ArrayList

これは、.NET Framework 4.5 で実装されたものなので、βさんは質問者さんの環境(WIN2000、Excel2003)では動かないかも?、と言っているわけです。
(多分、windows7以降でないと駄目でしょう)

CreateObjectできる一覧を得たければ、ご自分のPCでレジストリエディタを起動し、HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ を見てください。
この下に、System.Collections.ArrayList も見つかることでしょう。
全部覚えるなんて、絶対無理!、って量があります。誰かが使っていて、良いな、と思ったのだけ調べると良いでしょう。

参考文献は、いまの時代、本では辛いですね。どんどん新機能が増えていくので、本を書いてもすぐ風化しちゃう。
だからWebで検索するのが今のスタイルです。ヘルプファイルすら廃れて、Webを見に行くようになりました。
(???) 2015/03/26(木) 17:41


ところで、ArrayList。面白いですねぇ。Dictionaryより使いやすいですよ、これ。
ソート目的なら、定番にして良さそう。
(???) 2015/03/26(木) 17:54

 >Dictionaryより使いやすいですよ

 そういった面もありますがVBAで、使えるメソッドや参照できるプロパティがDictionary に比べ
 SortedList や ArrayList はかなり制限されています。

 なによりも、キーやデータを配列で取得することができないので、取り出し時、インデックスを使ったループをせざるを得ないのが
 一番、つらいところですね。

 それに、ソートなら、本家本元が SortedList ですね。何もしなくても自動的に昇順になりますから。
 ただ、ArrayList のほうが 昇順にした後、降順にもできるというところがメリットですかね。

(β) 2015/03/26(木) 18:04


 >> やっぱり初歩さん

 A列に入力されているのがすべて J-K-T という形(アルファベット3つ)なら
 アルファベットの位置は左から「1文字目」「3文字目」「5文字目」ですよね。
 つまりはそういうことです。

 こんな説明でいいんですか?
  
 追記)
 それとも { }  の意味がわからないということですか?
 でしたらそれは「配列定数」というものです。
 1、3、5文字目、それぞれの文字コードの配列を返しています。
  
(JKT) 2015/03/26(木) 18:14

 >なによりも、キーやデータを配列で取得することができないので、取り出し時、インデックスを使ったループをせざるを得ないのが
 >一番、つらいところですね。

 まったくですね。
 .Net ではデータを Array に変換するToArray() メソッドがあるのですが、なぜか
 これは VBA では使用できないのが、とっても残念なところです。

 話は戻って、今回の関数の名前は SortInCell の方がセンスいいですね。
(Mook) 2015/03/26(木) 20:52

あれ?ToArray() メソッド使えますよね。

(マナ ) 2015/03/26(木) 20:59


失礼しました。SortedListのほうですね。

(マナ ) 2015/03/26(木) 21:13


 あら ArrayList の方は使えるんですね。
 何で違うんでしょう。残念ですね。
(Mook) 2015/03/26(木) 21:32

 >あれ?ToArray() メソッド使えますよね。 

 わぁ! SortedListで、だめなので、当然(?)ArrayListもだめだと思いこんでいました。
 なので、しったかぶりのコメントをアップ(汗、汗、汗)

 じゃぁ、私のコードの2番目のループは不要だったんですね。

 1つ(この年になって)賢くなりました。

 深謝です。

(β) 2015/03/26(木) 22:22


 > わぁ! SortedListで、だめなので、当然(?)ArrayListもだめだと思いこんでいました。
 下におなじです ^_^;;
(Mook) 2015/03/26(木) 23:06

コメント返信:

[ 一覧(最新更新順) ]


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