これって構造体配列とオンメモリってどっちがはやいんでしょうね このように、簡単にソートできます。 vb.netの配列を使う時にセットで知っておくと便利な2つの方法 ここからは、「vb.netの配列を使うときにセットで知っておくと便利な方法」について、2つに分けて解説します。 1. 実際昇格でソートが必要になる部分というのは将来かなり楽観的にみても40もないというのが現状です :
For i = 0 To UBound(mdbdata) - 1 lp3 = lp3 + 1, ソート やはり、ByRef stA As STAAAとして、実行時に先頭要素stA(0)を与えることで、
とりあえずこんな感じになっています nItem As Long
Dim i As Long <イメージ>
vbの世界ではほとんどのものがクラスや構造体なのです。 配列は Array (読み方: Array = アレイ)という特殊なクラスです。 このクラスはなんと New を使ってインスタンス化したり、 Inherits を使って継承することができないという変わったクラスです。 Next i3 データの出典:総務省「住民基本台帳に基づく人口、人口動態及び世帯数(平成27年1月1日現在)」
Microsoft Common Language Runtime Class Library, 参照してもチェックが付かない場合がありますが、その場合は参照設定が不要ですので気にせず未設定で構いません。, 引数の配列をArrayListクラスのSortメソッドで昇順に並べ替えて、再度ToArrayメソッドで配列に戻す関数です。, 昇順ではなく降順にしたい場合は一度Sortメソッドで昇順に並べ替えたあとに、Reverse関数で反転させることで可能になります。, 以下はその反転を行う関数です。SortだったのがReverseになっているだけです。, “000” 変な書き方ですみません その作業中なのですがテーブルが増えすぎてきまして 肝に銘じてもおきたいので idno_h(j3).rankupdate = idno_h(j3 + 1).rankupdate vbaで配列を使う際に並び順を昇順や降順に変えたいことがあります。 以下のコードは配列の内容を昇順(小さい順)に並べなおします。 クイックソート 以下の配列ソート処理はクイックソートの仕組みで実装しています。 クイックソ … “333” FileNo = FreeFile OpenOfficeは、逆に8バイト境界でないとだめなのです。, VBおよびVBAは素人ですが、「ByRef stA As STAAA」の記述ではExcel VBAが渡される引数が配列であること理解できないはずです。, Excel2010 32bit版 VBA Double型を含む構造体配列のDLL処理結果異常について. Next j3 挿入ソート (Insertion Sort) と、クイックソート (QuickSort) の 2 種類の方法を紹介します。, 安定ソートとは1, 2, 2, 3のように同じ値の要素があるときに、並び替え前の順序と後の順序が変わらないことです。前の 2 を 2a、後の 2 を 2b と区別すると、何回並び替えても2a, 2bの順番になります。, どの型にも対応するために Variant 型を使用していますが、Integer や Long など型を指定した方が速度が上がります。, Point という構造体を使っていますが、その名前を実際に使う名前に置換して使えます。, 構造体を比較するために ComparePoint 関数を作成しています。比較する値が同じときに別の値を比較すれば、第 1 キー、第 2 キーのようにできます。, 不安定ソートです。平均速度は O(n log n) です。一般的に最速と言われています。, QuickSort 関数の中から QuickSort 関数を呼び出す、いわゆる再帰呼び出しをしています。このためデータ量が膨大だと、エラー「スタック領域が不足しています。」が発生する可能性があります。, エラー 91 オブジェクト変数または With ブロック変数が設定されていません。, エラー 438 オブジェクトは、このプロパティまたはメソッドをサポートしていません。, エラー 450 引数の数が一致していません。または不正なプロパティを指定しています。, エラー 定数、固定長文字列、配列、ユーザー定義型および Declare ステートメントは、オブジェクト モジュールのパブリック メンバーとしては使用できません。, エラー オブジェクト モジュール内では、パブリック ユーザー定義型は定義できません。, エラー プライベート オブジェクト モジュールを、パブリック オブジェクト モジュール内で、パブリック プロシージャの引数または戻り値、パブリック データ メンバー、またはパブリックのユーザー定義型のフィールドとして、使用することはできません。. Dim FileNo でそのうちの会員用のテーブルが1万件 またひとつの構造体配列だけでそんなものはできるといわれるかもしれないので その中のソートになるので特に心配はないかなっと思ってます “777” Open File1 For Output As #FileNo 自分はロジックにこだわりすぎてそんなことに考えつきませんでした ・人口(女)
End If 構造体配列の複数キーソートというのはのちのち必要になってくると思いますので lvarBuf = idno_h(j3).idno
“666” 同日づけのidno順のソートがうまくいきません “111” idno_h(j3).TreeType_sort = idno_h(j3 + 1).TreeType_sort <サンプルデータ>
:
For i = 0 To UBound(mdbdata) - 1 ソート分 End If データーがかなり大きいと想像されたからです。 DOSの扱い方まで教え手いただきましてありがとうございます idno_h(j3).idno = idno_h(j3 + 1).idno “666” ・人口計
End Sub, 追加での優先事項・追加項目がでてしまいまして “111” Private Type db “444” ・Excel2010 64bit版 及び Excel2013 32bit版 では確認していない。
{
google_ad_slot = "0887539173";
mdbファイル自体は約300Mです。 ネロさんの案でやらせていただきます Sayさん> google_ad_height = 90;
idno_h(j3 + 1).TreeType_sort = lvarBuf If idno_h(j3).TreeType_sort > idno_h(j3 + 1).TreeType_sort Then }; <関数定義>
“555” “777” 構造体配列の使用にいたりました。 DLLコンパイル時に、切り分けが必要となります。, 私の方のアプリの環境では、pack(4) で、VBAに合わせることができません。
早急にごくの意味を調べます(汗), 今回自分にもすぐにできそうなので Next i3, すみません間違えました “555” DLL側 sizeof(STAAA) の結果は 16 です。, ByRef stA As STAAA() だと 文法エラーです。
構造体配列のクイックソートを行い結果をシートに表示します
という具合にすれば簡単な様に思いますが。, さっそくのお返事ありがとうございます もちろんこれからはそういうのはつかうことはまずないというご指摘でしたら 大変勉強になりました ましてユーザー定義型となると。。。。 /* Unit3 */
もしそんな方法があるのでしたら教え手いただけないでしょうか? ねろさん>
}, ・Excel2010 32bit版の場合、構造体にDouble型がある場合、結果が不正となる。
【vba 目次】 ファイル一覧をシートに表示する; 構造体配列をクイックソートして結果をシートに表示する; テキストファイルをゼロサプレスしないでブックに取り込む; フォームに独自プロパティを設定し表示/非表示を切り替える & File1 & Chr(34) & " > " & Chr(34) & File2 & Chr(34) idno_h(lp3).TreeType_sort = idno_h(lp3).rankup_rank & " " & CStr(idno_h(lp3).rankupdate) & " " & idno_h(lp3).idno Next j3 まだまだ先は長そうですけど、この調子でがんばりたいと思います. ソート関係の本を買ったら構造体配列の複数キーのやり方とかすこしはのってますかね **************【 VBA 側 】**************, <構造体定義>
C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.tlb(dllではありません) Close idno_h(lp3).rankup_rank = 3 そういった昇格の系列みたいなものが3万件くらい というか自分でサンプルデータとかみようみまねでできないというのがなさけないですが, Sayさん> //-->. といった感じですが 教えていただけたらと思うのですが ソート対象の要素は人口計(SCT_Population.population)です
・Excel2016 についても確認していない。, Excel 32bit版のバグではないでしょうか?
お願いします それでは, rankupdate + デリミタ + idno と言う文字列を作り、 Next idno_h(j3).TreeType_sort = idno_h(j3 + 1).TreeType_sort Dim File1 As String, File2 As String Dim mdbdata(100000) As db DLL側にはアドレスとして解釈できず、異常終了します。
文字列にしてファイルに落としてしまえばDOSのSortコマンドが使えるからです。 Shell Environ("ComSpec") & " /c sort /r <" & Chr(34) _ idno_h(j3 + 1).rankupdate = lvarBuf int nItem;
For i3 = LBound(idno_h) To UBound(idno_h) - 1 “888” 実装がすこし遅れがちになっております このsortコマンドもっとなにかやれないかとかもちょっと調べてみます, 遅くなってすみません ソース全体をそのまま張り付けてください
thisYear = date.getFullYear();
ソート処理
}; int WINAPI SortA(int n, STAAA *stA)
http://www.soumu.go.jp/menu_news/s-news/01gyosei02_03000062.html
idno_h(j3 + 1).rankup_rank = lvarBuf で昇格関係のプログラムなので “999”, “999” “444” それで回答もらってもうしわけないんですが ここのログにも前にありましたけどそのログを読み解く力が自分にはなかったので アドレスを渡す方法しかないようです。, ただし、64bit版では、4 バイト境界にしてしまうと逆に異常になるので、
自分なりにもうすこしスマートにできないかと思いまして 'ソート ã¼ãã®ä¸¦ã¹æ¿ãæ©è½ã使ã£ã¦é
åè¦ç´ ãã½ã¼ãããã¨ãã«æ³¨æããªããã°ãããªãã®ã¯ãè¦ç´ ã®åã§ããä»åã®ããã«ã3æ¡ã®æ°å¤ãã§ããããã»ã«ã«æ¸ãåºãã¦ãæ°å¤ã®ã¾ã¾ã§ããããã¨ãã°ã2-1ããªã©ã®æååã¯ã»ã«ã«å
¥ããã¨æ¥ä»ã¨èªèããã¦ãã¾ãã¾ãããããã¯ã=ãã§å§ã¾ãæååã¯æ°å¼ã¨èªèããã¾ãã®ã§ãæ°å¼ã¨ãã¦æå¹ãªæååã§ãªãã¨ã¨ã©ã¼ã«ãªãã¾ãã, ã¾ããExcelã®ä¸¦ã¹æ¿ãæ©è½ã¯ãå種ã®è¨å®ã次åã«ãå¼ãç¶ããã¾ããVBAããå®è¡ãã並ã¹æ¿ãã®è¨å®ã¯ã次åæåã§ä¸¦ã¹æ¿ããã¨ãã®ããã©ã«ãã«ãªãã¾ãã®ã§ãæ°ãä»ããã ããã, æããã°ã§ãããã¯ã¯ã¤ãã¯ã½ã¼ããããªããï¼ãã¨ãææãåãã¾ããããããã¨ããããã¾ããå®ã¯ãã¯ã¤ãã¯ã½ã¼ããã¨ããå称ã«ã¯èªä¿¡ããã¾ããã§ãã(^^;誤ã£ããã¨ãæ¸ãã¦ããã¾ããã§ããã,