• ベストアンサー

VBからExcelのデータを並べ替えしたい

VB2008を使用しています。 VBからExcelのデータを並べ替えしたいのですが、どうやればいいのかわかりません。 VBからExcelを立ち上げ、シートおよびセルを参照するところまではできています。 下記を実行するとA列とD列が入れ替わっているだけです。 k_syain_Sheet.Range("A1:D10000").Sort(k_syain_Sheet.Range("A2"), Microsoft.Office.Interop.Excel.XlSortOrder.xlAscending, _ k_syain_Sheet.Range("D2"), , Microsoft.Office.Interop.Excel.XlSortOrder.xlAscending, _ k_syain_Sheet.Range("B2"), Microsoft.Office.Interop.Excel.XlSortOrder.xlAscending) やりたいことは、Excel上のA1~D10000にデータが入っており、A1~D1はタイトル行です。 これから、最優先されるキー「A1」 2番目に優先されるキー「D1」 3番目に優先されるキー「B1」(それぞれ昇順)として並べ替えをしたいのです。 よろしくお願いします。

  • bo281
  • お礼率19% (12/63)

質問者が選んだベストアンサー

  • ベストアンサー
  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.1

#私は VB2008 自体のことはさっぱり解りません!! #見当違いな回答でしたら、お見捨てください。 #また、追加でご質問いただいてもお答え致しかねます。 #飽くまで、「参考意見」ということで。。。 >A列とD列が入れ替わっているだけです。  お示しのコード以前に「列による並べ替え」が行なわれていませんでしょうか?  Excel 自体で [Sort メソッド] による並べ替えを行なった場合、 -- ここから引用 ------------------------------------ [Sort メソッド] ヘルプより-- Header、Order1、Order2、Order3、OrderCustom、および Orientation の設定は、このメソッドを使用するたびに、特定のワークシートについて保存されます。次にこのメソッドを使用するときに、これらの引数を指定しなかった場合は、保存されていた値が使用されます。保存されている値を使用しない場合は、Sort メソッドを使用するときにこれらの引数を明示的に設定してください。 ----------------------------------------------------------------- ここまで引用 -- ということになっています。 >A列とD列が入れ替わっているだけです。 ということは、Excel では Orientation:=xlLeftToRight になっていると思われますので、 >これらの引数を明示的に設定してください。 が VB2008 の [Sort メソッド] にも言えることでしたら、 Orientation:=xlSortRows を「明示的に設定」する必要があるということになると存じます。  つまり、 ●NamedRange.Sort メソッド http://msdn.microsoft.com/ja-jp/library/microsoft.office.tools.excel.namedrange.sort(VS.80).aspx の「Visual Basic (使用法)」にある returnValue = instance.Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom, MatchCase, Orientation, SortMethod, DataOption1, DataOption2, DataOption3) で申すなら Header, OrderCustom, , Orientation, , , , ) の部分は「引数を明示的に設定」した方が無難ということになるかと存じます。  で、「VB2008 のことは解りません」ので何とも申せませんが、 , Microsoft.Office.Interop.Excel.XlSortOrder.xlAscending) を , Microsoft.Office.Interop.Excel.XlSortOrder.xlAscending,,,,xlSortRows) にするみたいなことではないかなぁと思ってしまいました。 【ご参考までに】 ●COM 相互運用機能の省略可能なパラメータについて http://msdn.microsoft.com/ja-jp/library/ms178843(VS.80).aspx

その他の回答 (1)

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.2

VBのことはよくわかりませんが、ちょっと気になったことが1つ。 ソートキーの指定の後のカンマの数が"A2"と"B2"の場合と"D2"の場合とが違っています。 これが影響しているのでは?

関連するQ&A

  • TextBoxに入力した文字をExcelに書き込むには?

    VB2008を使用しています。 VBフォーム内のTextBox1に入力した内容(例 りんご)をBottanを押すことによりExcelの指定したセル(例 A1)に書き込んで保存する方法はありますでしょうか? 現在、以下のところまでは出来ています。 ' excelを定義 Dim excel As New Microsoft.Office.Interop.Excel.Application ' excel testをファイルから開く Dim book As Microsoft.Office.Interop.Excel.Workbook book = excel.Workbooks.Open("C:\test.xls") ' 1枚目のワークシートを取得 Dim sheet As Microsoft.Office.Interop.Excel.Worksheet sheet = CType(book.Worksheets.Item(1), Microsoft.Office.Interop.Excel.Worksheet) Excelの開放からsheetの取得までは出来たのですが、ここから先がわかりません。よろしくお願いいたします。

  • VB.NET EXCEL

    下記のコードで、アプリケーション実行中 EXCELが起動したままになり アプリケーション終了時に、EXCELも一緒に終了する という、タスクマネージャーに残るという動作になります。 どこの COM の扱い方がまずかったのでしょうか? 教えてください。お願いします。 ※文字数制限で、SQLコネクション周り、SQL系宣言 エラー処理を消しました。 ※EXCEL周りに関してはすべてそのままです。 変数に代入している COMオブジェクトをすべて Marshal.FinalReleaseComObject してもEXCELが終了しないので何かしら COMオブジェクトを見落としていると思うのですが どれだかわかりません。 よろしくお願いします Imports Microsoft.Office.Interop Imports System.Runtime.InteropServices Public Class Cls_Print_Excel Public Sub S_Print_Excel() 'エクセルアクセス用 Dim _xslFile As String = "C:\base.xls" Dim objExcel As Excel.Application = Nothing Dim objWorkBook As Excel.Workbook = Nothing Dim objWorkBooks As Excel.Workbooks = Nothing Dim xlSheet As Excel.Worksheet = Nothing Dim xlRange As Excel.Range = Nothing Dim xlPageSetup As Excel.PageSetup = Nothing Try objExcel = New Excel.Application objWorkBooks = objExcel.Workbooks objWorkBooks.Open(_xslFile) objWorkBook = objExcel.ActiveWorkbook xlSheet = DirectCast(objWorkBook.Worksheets(1), Microsoft.Office.Interop.Excel.Worksheet) rs = cm.ExecuteReader() I = 3 Do While rs.Read Dim AA() As String = {"B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"} Dim K As Integer For K = 0 To 11 IN_Range(xlSheet, AA(K) & I.ToString, rs(K).ToString) Next xlRange = xlSheet.Range("3:3") xlRange.Copy() A = A + Marshal.ReleaseComObject(xlRange) xlRange = xlSheet.Range(I.ToString & ":" & I.ToString) xlRange.PasteSpecial( _ Paste:=Microsoft.Office.Interop.Excel.XlPasteType.xlPasteFormats, _ Operation:=Microsoft.Office.Interop.Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, _ SkipBlanks:=False, Transpose:=False) A = A + Marshal.ReleaseComObject(xlRange) xlRange = xlSheet.Range(I.ToString & ":" & I.ToString) xlRange = xlRange.EntireRow xlRange.AutoFit() A = A + Marshal.ReleaseComObject(xlRange) xlRange = xlSheet.Range(I.ToString & ":" & I.ToString) N = 5.5 While True If CType(xlRange.RowHeight, Double) < N Then Exit While Else N += 5.5 End If End While xlRange.RowHeight = N '高さを設定 A = A + Marshal.ReleaseComObject(xlRange) I += 1 'ループカウンタを積む Loop xlPageSetup = xlSheet.PageSetup xlPageSetup.PrintArea = "B2:M" & (I - 1).ToString A = A + Marshal.ReleaseComObject(xlPageSetup) S_filename = System.IO.Path.GetDirectoryName(_xslFile) & Format(Now(), "yyyy-MM-dd-HH-mm-ss") & ".xls" objWorkBook.SaveAs(S_filename) objWorkBooks.Close() A = A + Marshal.ReleaseComObject(objWorkBooks) objExcel.Quit() A = A + Marshal.ReleaseComObject(objExcel) Exit Sub Catch ex As Exception Finally End Try End Sub Private Sub IN_Range(ByRef wSheet As Microsoft.Office.Interop.Excel.Worksheet, _ ByVal iCell As String, _ ByVal Value As String) Dim rng As Excel.Range = wSheet.Range(iCell) rng.Value = Value Marshal.FinalReleaseComObject(rng) rng = Nothing End Sub End Class

  • VBでエクセルのデータを取り込む方法

    VB2010にエクセル(2003)のデータを取り込みたいのですが、うまくいきません。 どうすればよいのでしょうか。 外部アプリなので、Public Class Form1の前にImports Excel = Microsoft.Office.Interop.Excel と記入、dim xlapp as excel.apllcation dim xlbook as exce.book dim xlsheets as excel.sheets と記入してみますがこの時点でコードエラーとなります。(ネットで調べこのように記述しました) どうすればいいでしょうか。 すみません。vb初心者なので詳しく教えていただくとたすかります。 よろしくお願いします。

  • VB2005→Excelへの出力

    現在、以下環境にてシステム開発を行っています。 OS:WindowsXP DB:SQL Server 2005 画面系:Visual Studio 2005 (VB) 帳票系:Microsoft Office 2003 (Excel) ここで質問なのですが、 VBにて取得したデータ(DBから取得)を、 Excelファイルの帳票テンプレートの名前付きセルに貼り付けたいのですが、 方法がわかりません。VB、Excelでの開発(プログラミング)初心者です。 「Imports Microsoft.Office.Interop.Owc11」 をインポートしてるだけで停まっています。 情報足らずであれば、また追記します。 とりあえず要件まで。 宜しくお願いします。

  • VB2005を使用しています。

    VB2005を使用しています。 EXCELに出力しようとしているのですが・・・ Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks 「型 'Microsoft.Office.Interop.Excel.ApplicationClass' の COM オブジェクトをインターフェイス型 'Microsoft.Office.Interop.Excel._Application' にキャストできません。IID '{000208D5-0000-0000-C000-000000000046}' が指定されたインターフェイスの COM コンポーネント上での QueryInterface 呼び出しのときに次のエラーが発生したため、この操作に失敗しました: が見つかりませんでした。 (HRESULT からの例外: 0x80030002 (STG_E_FILENOTFOUND))。」 このようなエラーが出てしまいます。 以前は、正常に動いていたのですが・・・ 2007をインストールして、2003に戻してからかもしれません。 http://social.msdn.microsoft.com/Forums/en-US/vbinterop/thread/6b793878-d94a-4a62-8817-dea1cab79377/ がそうかと思ったのですが、意味がわからず何も出来ていません。 時間がなくて困っています。 よろしくお願いします。

  • VBからExcelのデータを参照するには?

    VBからExcelのデータを参照するには? ExcelのA列を、参照しようとしています。 このA列には数字も混じっています。 例えば A123 abc 456 qwer のように、4行あったとします。 VBのソースコードは、次の通り --------------------- Dim elSequence(10) As String i = 0 Do Until objSheet.Range("a2").Offset(i,0).Value = "" elSequence(i) = objSheet.Range("a2").Offset(i,0).Value i += 1 Loop --------------------- 問題は、Excelのセルに「数字だけの場合(上記の例で4行目)」で、VBはこれを、文字列として扱わずにDouble型と認識してしまいます。 例え、Excelのセルを、プロパティの文字列指定としても「456」はDouble型になってしまいます。 Excelから受け取ったデータを、文字列への変換はどのようにしたら良いですか。 参考になりそうなWeb等でも構いませんので、教えていただけませんか。

  • 処理をまとめたい。

    VB2008を使用しています。 現在、VBのTextBoxにExel内のデータを表示するプログラムを作成しています。Exel内には10のシートがあり、それぞれのシート内に、20列×50行のデータ(文字)が入っています。 VBには1~10(グループ化)及び11~30の(グループ化)RadioButtonとTxstBox50個を配置し、1~10のRadioButtonでシート名を、11~30のRadioButtonで列を選択し、各TxstBoxに50行のデータを取得したいと考えています。 現在、下記のコードを作成したのですが、この方法ではシート数10×列数20=200もの似たようなコードを作成しなければなりません。もっとスマートな方法はないでしょうか? Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' excelを定義 Dim excel As New Microsoft.Office.Interop.Excel.Application ' test.xlsを取得 Dim book As Microsoft.Office.Interop.Excel.Workbook book = excel.Workbooks.Open("C:\test.xls") ' 1枚目のワークシートを取得 Dim Item(1) As Microsoft.Office.Interop.Excel.Worksheet Item(1) = CType(book.Worksheets.Item(1), Microsoft.Office.Interop.Excel.Worksheet) ・ ・ Item(20) = CType(book.Worksheets.Item(1), Microsoft.Office.Interop.Excel.Worksheet) Dim COLUMN As String If RadioButton1.Checked = True AndAlso RadioButton13.Checked Then COLUMN = "A" TextBox1.Text = Item(1).Range(COLUMN & "1").Value ・ ・ TextBox50.Text = Item(1).Range(COLUMN & "50").Value Else If RadioButton10.Checked = True AndAlso RadioButton30.Checked Then COLUMN = "T" TextBox1.Text = Item(10).Range(COLUMN & "1").Value ・ ・ TextBox50.Text = Item(10).Range(COLUMN & "50").Value Else End If

  • VBでエクセルを制御したい

    始めまして。 VBでアプリを組んでいて、指定のエクセルファイルを 操作したいのですが、うまくいきません。 ファイル指定まではうまくいったのですが、 具体的には、エクセルの指定範囲をソートしたいのですが。 Dim intR, lastR As Long intR = 2 lastR = 1000 sh.Rows(intR & ":" & lastR).Select sh.selection.Sort key1:=range(sh.Cells(intR, 5)), & _ order1:=xlascending, key2:=range(sh.Cells(intR, 1)),& _ order2:=xlascending このようなコードで実行すると、 実行時エラー438 オプジェクトはこのプロパティまたはメソッドを サポートしていません と出ます。やはりエクセルVBAと同様という簡単なものでは ないのでしょうか。 お分かりの方、お願いします。

  • 4番目以降の並べ替え

    はじめて質問します。 エクセルのマクロで20列40行に数字があるのですが、 この20列を優先順位をつけて並べ替えたいのですが、 4番目以降の優先順位をつけることはできないのでしょうか? 3番目までは問題ないのですが、 Key4:=Range("AA2"), Order4:=xlAscending, Key5:=Range("Z2"), Order5:=xlAscending, _ key4:=のところで「名前付き引数が見つかりません」 となってしまいます。 3つまでしか順位付けできないのでしょうか?

  • Excelのシートをコピー

    環境は,Visual Studio 2005 Standard Editionです. プログラムを実行後,以下の例外が発生しました. 「HRESULT からの例外: 0x800A03EC」 発生場所は★の位置です. ここから------- Dim xlApp As Microsoft.Office.Interop.Excel.Application = Nothing Dim xlBook As Microsoft.Office.Interop.Excel.Workbook = Nothing Dim xlSheet As Microsoft.Office.Interop.Excel.Worksheet = Nothing xlBook = xlApp.Workbooks.Open("ファイルのパスが入ります") xlSheet = xlBook.Worksheets("シート名が入ります") Dim xlBook2 As Microsoft.Office.Interop.Excel.Workbook = Nothing Dim xlSheet2 As Microsoft.Office.Interop.Excel.Worksheet = Nothing xlBook2 = xlApp.Workbooks.Open("ファイルパスが入ります") xlSheet2 = xlBook.Worksheets("シート名が入ります") 'Excelを表示しない xlApp.Visible = False xlSheet.Copy(Before:=xlSheet2) ★ ここまで-------------- やろうとしているのは,xlSheet2のシートを含むExcelファイルに,xlSheet2の前にxlSheetをコピーする処理です. ★のところで上の例外が発生してしまいます. 以上,よろしくお願いします.

専門家に質問してみよう