• 締切済み

VB2005 DataGridViewの全角・半角混在のカラムの並び替え

VB2005で開発、データベースはオラクル10gです。 全角・半角文字混在の項目を昇順で読み込み、DataGridViewの表に取り込みます。その後、ヘッダーカラムの並び替えを行うと順番が変わっていまいます。 具体的には 1.読み込み時は、空白は最尾、並び替え後は先頭にくる。 2.読み込み時、括弧(「[」)の半角と全角は別々に並んでいますが、並び替え後は半角と全角との区別はなく、並び替えられます。 カラムを別に設けて、コード体系を変換して、そのカラムを並び替えすればいいのでしょうか? コード体系の知識は弱いので、お教えください。 PRIVATE SUB BUTTON_CLICK(省略) DIM I AS INTEGER DIM S AS STRING FOR I = 0 TO DataGridView1.Rows.Count - 1 S = DataGridView1(1,I).VALUE '-----ここで変換?    DataGridView1(2,I).VALUE = S NEXT DataGridView1.Sort(DataGridView1.Column(2), _ System.ComponentModel.ListSortDirection.Ascending) END SUB よろしくお願いします。

  • JJ-TO
  • お礼率95% (19/20)

みんなの回答

回答No.1

VB初心者です。僭越とは存じますが、ちょっと調べてみたので書いてみます。 ・読み込み時に全角括弧「」と半角括弧[]が別々ということは、 Oracleでは単純に文字コードでソートしている。 (読み込み時に空白が最後尾ということはDESCを付けているのでしょうか?) >並び替え後は半角と全角との区別はなく、並び替えられます ・これは文字コードが原因ではなく、VBで「あいまい検索」のようなことが行われているのではないでしょうか? 「あいまい検索」とは、「a」と「A」を同一のものとして見て検索するという意味です。 DataGridView.Sort メソッド (IComparer) http://msdn2.microsoft.com/ja-jp/library/wstxtkxs(VS.80).aspx というメソッドがあります。 また、 Comparer クラス http://msdn2.microsoft.com/ja-jp/library/system.collections.comparer(VS.80).aspx というクラスがあります。 Comparer にはカルチャを関連付けるようなので、Comparer に日本-日本語カルチャが 関連付けられているために、「」と[]を同一と見ているのでは? 以下のようなコードを書いてみたのですが、myComp を Comparerクラスとして定義しているのに、 DataGridView.Sort() では IComparerを引数としてとるためうまくいきません。 myComp を IComparer として扱いたいのですが、悲しいかなVB初心者のためわかりません。 また、私は SQL Server を使用しているため、JJ-TOさんとは環境が違います。 何か問題解決の足しになれば幸いです。 ==== Code ==== Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click If Me.DataGridView1.Columns(1).DisplayIndex = 1 Then Me.DataGridView1.Columns(1).DisplayIndex = 2 Me.DataGridView1.Columns(2).DisplayIndex = 1 Else Me.DataGridView1.Columns(1).DisplayIndex = 1 Me.DataGridView1.Columns(2).DisplayIndex = 2 End If '???????????????????? 'System.Globalization.CultureInfo()の引数は、 '("ja", False), ("ja", True), ("ja-jp", False), ("ja-jp", True)のどれ? '???????????????????? Dim myComp As New System.Collections.Comparer(New System.Globalization.CultureInfo("ja", False)) '???????????????????? 'myComp (as Comparer)を IComparer として扱うにはどうしたらいい? '???????????????????? Me.DataGridView1.Sort(myComp) Me.DataGridView1.Sort(Me.DataGridView1.Columns(1), System.ComponentModel.ListSortDirection.Ascending) End Sub ==== end of Code ====

JJ-TO
質問者

お礼

irija_bariさん、ありがとうございます。 oracle8.1.6以上では、NULLは最後尾にソートされるのが、標準です。 もしも、NULLを先頭にするならば、sql文に[nulls first]をつけ加える必要があります。客先の要望もNULLは最後尾にという要望だったので、DataGridViewの並び替え時の扱いとは違ってきます。 irija_bariさんも言われるとおり、文字コードでのソートが必要だと思ったで、shift_jisコードに変換してそれをソートいました。NULLだったら、999をセットしました。 ありがとうございました。

関連するQ&A

  • 【VBA】半角カタカナのみを全角にするには?

    http://bekkoame.okwave.jp/qa8979427.html こちらのページを参考にしたのですが カタカナのみ全角にしたいのですが 平仮名がカタカナになってしまいます。 正規表現と言うのがよくわからないので コピペで使ってますが Sub Sample2() Dim myStr As String Dim Match As Object, Matches As Object Dim CW As String With CreateObject("VBScript.RegExp") .Pattern = "[\uFF61-\uFF9F]+" '---(1) .Global = True myStr = "あああイイイ" If Len(myStr) > 0 Then Set Matches = .Execute(myStr) 'マッチしたすべての文字列を置換 For Each Match In Matches myStr = Replace(myStr, Match.Value, _ StrConv(Match.Value, vbWide)) '---(2) Next Match CW = myStr End If End With End Sub だと「あああ」は平仮名のままなのですが myStr = "のののノノノ" にすると、ひらがなの「ののの」が全角カタカナになってしまいます。 Sub test() Call KanaJisF("あああイイイ") End Sub Function KanaJisF(ByVal sSrc As String) As String Dim sTempW As String Dim sTempN As String Dim i As Long ' ' 全角カナに相当する文字コードを総当たりでループ For i = -31852 To -31936 Step -1 sTempW = Chr(i) ' 全角カナ変数に格納 sTempN = StrConv(sTempW, vbNarrow) ' 半角カナに変換して変数に格納 ' ' 半角カナ各文字が、文字列に含まれている場合、全角カナに置換 If InStr(1, sSrc, sTempN) Then sSrc = Replace(sSrc, sTempN, sTempW) Next i ' ' 半角長音、文字列に含まれている場合、全角長音に置換 sTempN = Chr(176) If InStr(sSrc, sTempN) Then sSrc = Replace(sSrc, sTempN, "ー") KanaJisF = sSrc End Function こちらのコードは、「あああ」も全角カタカナになりました。 "のののノノノ"も同様です。 平仮名は平仮名のままにしたいのですが そのような方法はありますか?

  • VB2005 Datagridview の仮想モードでメモリリーク

    VB2005にてDatagridviewの仮想モードを実装しています。 DataGridviewを全件ループ処理する場合にメモリが増加します。完了してもそのままメモリが減りません。これを回避する方法がありますか?CellValueNeededはメモリを消費し続けるものなのでしょうか。 実際のプログラムでは件数が多い場合にメモリの消費が止まらずメモリ不足に陥ります。 以下は単純なコードにしたサンプルです。これでもデバッグモードで動かすと起動時20Mくらいのメモリ消費がループ処理時に100Mくらいにに増えます。 ※実際の処理でバインドしているデータ(datatable等)の方をループさせるという代替案がありますが、今回はdatagridviewから行った結果のメモリ不足についてご教授いただければと思います。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With Me.DataGridView1 .Columns.Add("Column1", "列1") .Columns.Add("Column2", "列2") .Columns.Add("Column3", "列4") .Columns.Add("Column4", "列4") .Columns.Add("Column5", "列5") .Columns.Add("Column6", "列6") .Columns.Add("Column7", "列7") .VirtualMode = True .RowCount = 100000 End With End Sub Private Sub DataGridView1_CellValueNeeded(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DataGridViewCellValueEventArgs) _ Handles DataGridView1.CellValueNeeded e.Value = e.RowIndex.ToString & "," & e.ColumnIndex.ToString End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click For i As Integer = 0 To DataGridView1.Rows.Count - 1 DataGridView1.Rows(i).Cells(1).Value = DataGridView1.Rows(i).Cells(2).Value Next MsgBox("終了") End Sub

  • カタカナのみを半角から全角に変換したいのですが

    VBAについて教えてください。 文字をHPにアップできるように、カタカナのみを半角から全角に変換したいのですが 何か良い方法はありますか? 文字は英字・ひらがな・カタカナ・漢字がランダムに入っています。 例えば Sub test() Dim a As String a = "aaaアアア<>BBB" End Sub の状態で。「アアア」のみを全角にするにはどうすればいいでしょうか? アルファベットは半角のままにしたいです。

  • VB2008で全角半角の判定

    VB2008で全角半角の判定 VB6 では下記のようにして判定していましたが、VB2008では どのようにすればよいのかお教えください。  dim moji as string dim zhN as integer  zhN = LenB(StrConv(moji, vbFromUnicode)) mojiには1文字格納されており、  半角なら zhN = 1 全角なら zhN = 2 となる。  これをVB2008で実現する方法がわかりません。  よろしくお願いします。

  • 指定した列の文字を半角→全角に変換するには

    エクセルにて以前の同様の質問の回答で特定のセルの文字を半角⇒全角へ変換する方法(マクロ)として以下のような回答を見かけましたが、これを複数の列ごとに行うにはどのようにしたらよろしいでしょうか?住所データを対象としていて行数はその都度変わります。 半角→全角 Sub Macro2()   Dim temp As String   temp = Cells(1, 2)   temp = StrConv(temp, vbWide)   Cells(1, 2).Value = temp End Sub どうか、よろしくお願い致します。

  • エクセルvba カタカナは全角、それ以外は半角に

    セルにはカタカナ、数字、漢字、文字がすべて混在しています。 カタカナは全角に、カタカナ以外(数字や記号)は半角に統一しようかと思っています。 一度すべてを半角にし、カタカナだけ全角に戻そうかと考えました。 Sub test() Dim e As Range Dim f As Integer Dim rData As Variant, ansData As Variant Range("A1:A10").Select For Each e In Selection ansData = "" For f = 1 To Len(e.Value) rData = StrConv(e.Value, vbNarrow) If Mid(rData, f, 1) Like "[ア-ン]" Then ansData = ansData & StrConv(Mid(rData, f, 1), vbWide) Else ansData = ansData & Mid(rData, f, 1) End If Next f e.Value = ansData Next e End Sub しかしこれでは、 「ッ」「ァ」など小さい文字や、「ー(長音)」が半角から全角に戻りません。 また、「ズ」など濁音が「ス゛」と2文字になってしまいます。 これらの正しく変換されないものをすべて列挙し、Replaceなどを使って修正するしかないのでしょうか? 実は最初に、すべてを「全角→半角」にするようマクロ作成したのですが、半角にする文字をReplaceですべて列挙しるのは大変だと思い、「半角→全角」にしたらうまくいくかと思ったのですが、それでもうまくいきませんでした・・・ よろしくお願いします。

  • VB2010DataGridView複数ページ印刷

    VB2010のDataGridViewで複数ページの印刷を試みています。 改ページに悩んでいます。「e.HasMorePages=True」で改ページは可能ですが、1ページ目も2ページ目も同じ内容が印刷されます。 1ページに30行を印刷する予定ですので、2ページ目には31行目から印刷をしたいのです。 現在、いろいろ参考にしまして、コーディングは進んでいますが、30行の指定がページ目いっぱいまで印刷される点と、2ページ目以降の印刷ができない点に悩んでいます。 書き上げたコードを記述しますので、ご存知の方が居られましたら、ご教授ください。 Dim reader As IO.StreamReader Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click PrintPreviewDialog1.ShowDialog() PrintPreviewDialog1.Document = PrintDocument1 'file() ' 印刷処理を実行 'PrintDocument1.Print() 'PrintForm1.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.FullWindow) 'PrintDocumentオブジェクトの作成 Dim pd As New System.Drawing.Printing.PrintDocument 'PrintPageイベントハンドラの追加 AddHandler pd.PrintPage, AddressOf pd_PrintPage 'PrintDialogクラスの作成 Dim pdlg As New PrintDialog 'PrintDocumentを指定 pdlg.Document = pd '印刷の選択ダイアログを表示する If pdlg.ShowDialog() = DialogResult.OK Then 'OKがクリックされた時は印刷する pd.Print() End If End Sub Dim page As Integer = 0 '現在のページ Private Const MaxLine As Integer = 30 '1ページ30行 Private Sub pd_PrintPage(ByVal sender As Object, _ ByVal e As System.Drawing.Printing.PrintPageEventArgs) page += 1 'グラフィックの定義 Dim g As Graphics = e.Graphics '総行数をallrowとする Dim allrow As Integer = DataGridView1.Rows.Count - 1 '文字列を描く 'g.DrawString(DataGridView1(0, 0).Value, _ ' New Font("MS Pゴシック", 9), Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top) Dim X As Integer Dim Y As Integer Y = e.MarginBounds.Top For i As Integer = 0 To DataGridView1.Rows.Count - 1 X = e.MarginBounds.Left For j As Integer = 0 To DataGridView1.Columns.Count - 1 Dim s As String If DataGridView1(j, i).Value Is Nothing Then s = "" Else s = DataGridView1(j, i).Value End If g.DrawString(s, New Font("MS Pゴシック", 9), Brushes.Black, X, Y) 'g.DrawString(DataGridView1(j, i).Value.ToString, _ ' New Font("MS Pゴシック", 9), Brushes.Black, X, Y) X += DataGridView1.Columns(j).Width Next j Y += DataGridView1.Rows(i).Height Next i '現在のページが総ページ数より少ない場合は、次ページへ If page < (allrow \ MaxLine + 1) Then e.HasMorePages = True Else 'このページで終了 e.HasMorePages = False End If End Sub

  • 半角カタカナのみ全角にするには

    http://bekkoame.okwave.jp/qa8426331.html を参考にvbaコードを作っています。 "あああイイイ"(「イイイ」のみ半角カタカナ) を "あああイイイ" にしたいのですが、 Sub Macro01() Dim str置換前 As String '置換前の文字列 Dim str置換後 As String '置換後の文字列 Dim i As Integer str置換前 = "あああイイイ" str置換後 = str置換前 For i = 31850 To 31936 str置換後 = Replace(str置換後, StrConv(Chr(-i), vbNarrow), Chr(-i)) Next i MsgBox str置換前 MsgBox str置換後 End Sub を実行すると、 「あああ」が全角カタカナになり、「アアアイイイ」になってしまいます。 For i = 31850 To 31936 の部分に原因があるのかな、とは思いますが、 For i = 31850 To 31936の意味がよくわからないままコピペで使ってしまいました。 多分文字コードの数値だと思うのですが、どう変更すれば、ひらがなは除外されますか? よろしくお願いします。

  • Excel : 正規表現を利用して2文字の全角数字を半角数字に変換するには?

    アクティブセルの文字を、正規表現を利用して文字の変換をしたいと考えています。 2文字の全角数字を半角数字に変換します。 かつ、3文字以上の全角数字は変換しません。 下記のようにコードを書いたのですが、希望通りに動作してくれません。 どこが悪いのでしょうか? ご指摘いただければ幸いです。 よろしくお願いいたします。 ※参照可能なライブラリファイルにて、「Microosft VBScript Regular Expressions 5.5」に  チェックは入れています。 Sub sample()   Dim str   Dim strPattern As String   Dim strReplacement As String      str = ActiveCell.Value   str = myRegExp(str, "([^0123456789])([0123456789]{2})([^0123456789])", "$1$2$3")   ActiveCell.Value = str End Sub Private Function myRegExp(str, strPattern, strReplacement)   Dim objRegExp As RegExp   Dim test As String   Set objRegExp = New RegExp   With objRegExp     .Pattern = strPattern     .IgnoreCase = False     .Global = True     myRegExp = .Replace(str, "$1" & StrConv("$2", vbNarrow) & "$3")   End With   Set objRegExp = Nothing End Function

  • 半角カタカナがVBAだと全角カタカナになる

    フォームを作って「フォーム1」にしてその上に「テキスト1」を置きました。(どちらも半角です) Private Sub Form_Open(Cancel As Integer) Form_フォーム1.テキスト1.Value = "a" End Sub にすると自動でフォームがフォームのように全角になります。 なのでこの状態でフォームを開こうとすると、 Form_フォーム1の部分でコンパイルエラーになります。 (変数が定義されてません) Private Sub Form_Open(Cancel As Integer) Me.テキスト1.Value = "a" End Sub にするとうまく行きました。 でもテキスト1は、半角のままです。 フォームだけが全角になってしまいます。これは何と言う現象でしょうか? なるべくオブジェクト名には半角を使わない方がいいのですか? ・・・と今質問分を書いて見直したら、gooでも半角を全角に自動修正するんですね。

専門家に質問してみよう