Excelの他シートのソート方法について

このQ&Aのポイント
  • Excelの他シートのソート方法について質問があります。同一ブック内に作業シートとDATAシートがあり、作業シートを常にアクティブにしておきたいと思っています。その際、DATAシートは作業者にはシークレットとしたいと考えています。
  • 作業シートには入力規則のリストにより語句を選択することができ、そのリストの語句データはDATAシート(AA列・AC列・・・)から引用されています。
  • 作業シートの隣接するAB列・AD列には語句を選択した回数を格納するカウンターとして利用されています。そして、そのカウンターを利用して、作業シートを選択頻度の高い順にソートしたいと考えています。しかし、試しに記述したコードを実行すると、アプリケーション実行時エラーが発生します。DATAシートからの実行では問題なく動作するのですが、DATAシートはシークレットにしたいため、解決策が見つかりません。どなたか教えていただけないでしょうか。
回答を見る
  • ベストアンサー

excelの他シートのソート方法

VBA初心者です。 excelの他シートのソート方法についての質問です 同一ブック内に作業シートとDATAシートがあり、作業シートを常にアクティブ にしておいて、DATAシートは作業者にはシークレットとしたい。 この条件の中作業シートには入力規則のリストにより語句を選択する事とし リストの語句データーはDATAシート(AA列・AC列・・・)より引用しています。 隣接するAB列・AD列には語句を選択した回数を格納カウンターとして利用 そのカウンターを利用して、作業シートから選択頻度の高い順にソートをか けたいと考え以下のコードを記述し実行したところ”アプリケーション実行時 エラーが出ます。 DATAシートからの実行では問題なく走りますが、DATAはシークレットとした いところから、解決方法が分からず悩んでいます。 どなたか、ご教示の程宜しくお願いします。 ☆以下記述コード Sub Listsort() Dim lCol As Long Dim myRng As Range Dim Key As String For i = 27 To 37 Step 2 Key = Sheets("DATA").Cells(2, i + 1) With Worksheets("DATA") yline = Cells(Rows.Count, i).End(xlUp).Row Set myRng = .Range(Cells(2, i), Cells(yline - 3, i + 1))※補足 myRng.Sort _ Key1:=.Range(Key), _ Order1:=xlAscending, _ Header:=xlYes, _ Orientation:=xlTopToBottom End With Next End Sub ※Cells(yline - 3, i + 1))-3はリスト内の3項目は最終行に固定したいため

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.2

>エラー行は、 >Set myRng = Sheets("DATA").Range(Cells(2, i), Cells(yline - 3, i + 1)) Cells(2, i)とCells(yline - 3, i + 1)の前に、"."ドットが必要です。 それからコードの書き方ですが、 With Sheets("DATA")をもっと前にもってていった方がシンプルです。 '------------------------------------------ Sub Listsort()  Dim lCol As Long  Dim myRng As Range  Dim Key As String  For i = 27 To 37 Step 2    With Worksheets("DATA")      Key = .Cells(2, i + 1).Value      yline = .Cells(Rows.Count, i).End(xlUp).Row      Set myRng = .Range(.Cells(2, i), .Cells(yline - 3, i + 1))      myRng.Sort _        Key1:=.Range(Key), Order1:=xlAscending, _        Header:=xlYes, Orientation:=xlTopToBottom    End With  Next i End Sub '---------------------------------------------------- 以上です。  

MNSgigolo
質問者

お礼

bin-chanさん 解決です、有難うございました。 昨日からまる1日悩んでいて、今日は諦めかけていたところです。 救世主が現れた様でとても助かりました。 ほんとうに有難うございました。

その他の回答 (1)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> 実行したところ”アプリケーション実行時エラーが出ます。 どの行で発生しますか? EXCELのバージョンは何ですか?

MNSgigolo
質問者

補足

早速のコメントありがとうございます。 バージョンはEXCEL2007です。 エラー内容は正しくは”アプリケーション定義またはオブジェクト定義の エラーです。”です エラー行は、Set myRng = Sheets("DATA").Range(Cells(2, i), Cells(yline - 3, i + 1))で”myRng”で内容は”nothing”となっています。 前コーディングですと”yline”の内容は正しくないことが分かったので現在は以下の コーディングとしました。シートの指定の方法がいけないのでしょうか? 宜しくお願いします。 Sub Listsort() Dim lCol As Long Dim myRng As Range Dim Key As String For i = 27 To 37 Step 2 Key = Sheets("DATA").Cells(2, i + 1).Value yline = Sheets("DATA").Cells(Rows.Count, i).End(xlUp).Row With Worksheets("DATA") Set myRng = Sheets("DATA").Range(Cells(2, i), Cells(yline - 3, i + 1)) myRng.Sort _ Key1:=.Range(Key), _ Order1:=xlAscending, _ Header:=xlYes, _ Orientation:=xlTopToBottom End With Next End Sub

関連するQ&A

  • SORTについて

    お世話になります。 下記構文でソートさせているのですが、 ”台帳”シートをアクティブにしている場合はVBA実行される のですが、別のシートをアクティブにしている場合はデバックに なってしまいます。(実行時エラー’1004’) 別のシートを開いていても下記のソートが実行される様にしたい のですが、どの様したら良いかご教示頂きたく宜しくお願い申し 上げます。         記 Sub 台帳ソート() Dim myrhg As Range Dim myar As Variant Dim i As Long Set myrng = Sheets(\"台帳\").Range(\"a1\").CurrentRegion myar = Array(1, 2, 3) With myrng For i = 0 To UBound(myar) .Sort key1:=Cells(1, myar(i)), Order1:=xlAscending, header:=xlYes Next End With Set myrng = Nothing End Sub

  • SORTについて

    お世話になります。 下記構文でソートさせているのですが、 ”台帳”シートをアクティブにしている場合はVBA実行される のですが、別のシートをアクティブにしている場合はデバックに なってしまいます。(実行時エラー’1004’) 別のシートを開いていても下記のソートが実行される様にしたい のですが、どの様したら良いかご教示頂きたく宜しくお願い申し 上げます。         記 Sub 台帳ソート() Dim myrhg As Range Dim myar As Variant Dim i As Long Set myrng = Sheets("台帳").Range("a1").CurrentRegion myar = Array(1, 2, 3) With myrng For i = 0 To UBound(myar) .Sort key1:=Cells(1, myar(i)), Order1:=xlAscending, header:=xlYes Next End With Set myrng = Nothing End Sub

  • VBAのソートで

    お世話になります。 初歩的な質問なのですが・・。 表のソートをしたいのですが、 表は2行目に見出しがあり3列で100行の構成です。 下記の様な記述で表の範囲をセットするところでエラー がかかってしまうのですが、どうしたらうまくいくでしょうか。 どなたかご教示頂きたく宜しくお願い致します。    記 Sub ソート() Dim myrhg As Range Dim myar As Variant Dim i As Long Sheets("台帳").Range("A1").CurrentRegion.Select Selection.Offset(1, 0).Select Set myrng = Selection.Resize(Selection.Rows.Count - 1).Select myar = Array(1, 2, 3) With myrng For i = 0 To UBound(myar) .Sort key1:=Cells(1, myar(i)), Order1:=xlAscending, header:=xlYes Next End With Set myrng = Nothing End Sub

  • エクセルマクロのソートについて

    こんにちわ! エクセルマクロのソートについて質問です。 プロシャージャを使ってソート使いまわそうと思うのですが、範囲、並び替えキーを変えたいと思うのですが可能でしょうか? Sub Sort()    Range("A1:c10000").Sort _ Key1:=Range("a1") , Order1:=xlAscending _ , Header:=xlGuess _ , MatchCase:=False _ , Orientation:=xlTopToBottom _ , SortMethod:=xlPinYin End Sub 一応、動作はしませんが下記のようなイメージで動かしたいです。 Sub Sort() Dim key As String Dim hanni As String key = Range("a1") hanni = Range("A1:c10000") 'セルhanniの範囲のデータをkey列をキーに昇順に並べ替えます hanni.Sort _ Key1:=key _ , Order1:=xlAscending _ , Header:=xlGuess _ , MatchCase:=False _ , Orientation:=xlTopToBottom _ , SortMethod:=xlPinYin End Sub 可能でしょうか? わかる方おりましたらアドバイスの程お願いします。

  • マクロ ソートをしたいのですが、組み込めますか

    マクロの説明 1.Sub Sample7()はsheet4の列をソートするマクロです。 (単独では、このマクロでソートできる) 2.Sub sample2()はsheet4のソート以外は完成しています。 やりたいこと Sub sample2()の中にsheet4の重複データを削除したもののソートのコードを組み込みたい。 但し、組み込むとしてSub Sample7()のコードでよいのか、初心者なのでよくわかりません。 なお、Sub sample2()のマクロは途中省いています。 Sub Sample7() Sheets("sheet4").Range("A1:A1135").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes End Sub Sub sample2() Dim data As Variant 'データコピー用の使いまわし配列 Dim dic As Object Dim i As Long Set dic = CreateObject("Scripting.Dictionary") 'Sheet4~5のA列をリセット Sheets("Sheet4").Range("A2:A" & Rows.Count).ClearContents Sheets("Sheet5").Range("C3:C" & Rows.Count).ClearContents            ↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 'Sheet4に重複していないデータを書き込み With Sheets("Sheet4") .Cells(Rows.Count, "A").End(xlUp).Offset(1).Resize(dic.Count).Value = Application.Transpose(dic.keys) 'Sheet4のC列をSheet5にコピー data = .Range("C2:C" & .Cells(Rows.Count, "A").End(xlUp).Row).Value End With Sheets("Sheet5").Range("C3").Resize(UBound(data)).Value = data Set dic = Nothing End Sub

  • 二つのマクロで一気に処理したい

    以下のようなことができるのかお伺い致します。よろしくお願い致します。  やりたいこと   ※ 前提として、sheet1にすでにA列に通し番号で奇数の数字が入っている。    1.sheet1からsheet2へコピペーストする。しかし、A列からO列のすべてにデータがあった場合のみコピー貼り付けさせたい。     (前提で示したように、A列に通し番号で奇数の数字が入っていて、A列のみ数字があり、以外が空欄の行があるため)    2.下記のコピー貼り付けのコードと重複削除のコードを合体させて、一つの処理で動かしたい。 Sub コピー貼り付けつけ()  'コピー貼り付けつけのコード Dim lastRow As Long 'Sheet1のA3から最終行までをコピー With Sheets("sheet1") .Range("A3:O" & .Cells(Rows.Count, "A").End(xlUp).Row).Copy End With 'Sheet2のA列の最終行の次の行に貼付け Sheets("sheet2").Cells(Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial Application.CutCopyMode = False End Sub Sub 重複データを一括削除する() ' Macro1 Macro Dim i As Long, lastRow As Long, myRng As Range LastRow = Cells(Rows.Count, "A").End(xlUp).Row For i = 1 To lastRow - 1 If WorksheetFunction.CountIf(Range(Cells(i + 1, "O"), Cells(lastRow, "O")), Cells(i, "O")) > 0 Then If myRng Is Nothing Then Set myRng = Cells(i, "O") Else Set myRng = Union(myRng, Cells(i, "O")) End If End If Next i If Not myRng Is Nothing Then myRng.EntireRow.Delete End If End Sub

  • エクセル VBA セルの色をSheet1とSheet2の両方を変えたいのですが・・・

    最近困っているところが表題の通りなのですが Sheet1のB2を右クリックするとB2のセルの色を変えて Sheet2のB2のセルも色を変えたいというものです。 現状で Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Dim Rng As Range, myRng As Range Dim RngA As Range, myRngA As Range Set Rng = Range("B3:W3,b7:w8,b12:w12,d13:w13,d17:w18,d22:w23") Set myRng = Intersect(Target, Rng) If myRng.Interior.ColorIndex = xlColorIndexNone Then myRng.Interior.ColorIndex = 37 Else If myRng.Interior.ColorIndex = 37 Then myRng.Interior.ColorIndex = 45 Else myRng.Interior.ColorIndex = xlColorIndexNone End If End If Cancel = True End Sub とここまではあるのですが、これをどう改造すればSheet2の同じセルの色もかわるのでしょうか? 宜しくお願いいたします

  • Excel 文字列を検索して全て置換するマクロ

    当方VBA初心者なのですが、ExcelのVBAで作ったマクロでうまく動かなくて困っています。 もしおわかりになる方がいらっしゃったら是非よろしくお願いいたします。 *実現したいこと '”reference”という名前のシートに、次のようなデータが入っています。 (1) りんご (2) みかん (3) キウイ ・・・ これを、配列を2つ用意し、 (1)を配列Listに、(2)を配列List2へ格納して行きます。 '"data"という名前のシートには、A列の1~10行目までに文章が入っていて、 "家には、(1)があります。" "冬になるとよく(2)を食べます。" ・・・・ この全文をcというRangeに設定し、そのcの中において、 もし、配列1((1)等)のキーワードがあったら、 'そのキーワードを配列2(りんご等)の内容に書き換える。 'キーワードは、データシートに複数回出てくる場合もある。 *困っていること 下記のマクロだと、一度目のObjFindまでは成功するのですが、 List(i)を探しているはずが、2回目から、その変更後の文字列が含まれた全文を検索するようになってしまいます。 以下マクロです。 よろしくお願いいたします。 Sub TEST() Dim List() As String, List2() As String 'List Dim i As Integer Dim iRow As Integer iRow = Worksheets("reference").Cells(Rows.Count, 1).End(xlUp).Row ReDim List(iRow) ReDim List2(iRow) For i = 1 To iRow List(i) = Worksheets("reference").Cells(i, 1).Value List2(i) = Worksheets("reference").Cells(i, 2).Value Next i Dim lngYLine As Long Dim intXLine As Integer Dim objFind As Object Dim strAddress As String Dim strSamp As String Dim objRange As Range Dim c As Range For i = 1 To iRow Set objRange = Worksheets("data").Range("A1:A331") Set objFind = objRange.Cells.Find(List(i)) If Not objFind Is Nothing Then For Each c In objRange If c.Value = objFind Then lngYLine = objFind.Cells.Row intXLine = objFind.Cells.Column strSamp = Worksheets("data").Cells(lngYLine, 1) strSamp = Replace(strSamp, List(i), List2(i)) Worksheets("data").Cells(lngYLine, 1) = strSamp MsgBox List(i) + "は" + List2(i) + "に変更されました" Set objFind = Cells.FindNext(objFind) End If Next c Else MsgBox List(i) + "は見つかりませんでした" End If Next i End Sub

  • EXCEL VBA 作業用シートの使い回し

    データのあるシートから、一定の条件にあうデータを当初から用意した作業用シート抜き出してきた上で、抜き出したシートの1つの列にあるデータ集から重複のないデータを抜き出すため、advancedfilterを使用しています。 別のサブルーチンを作成して、同一作業用シートを使い回す形で上記の作業を実行すると、表題のみコピーしてデータをコピーしなくなる現象が生じました。 作業用シートを削除して、新たにシートを挿入して作業用シートと名前を付けて、advancedfilterを実行すると、正常に機能しました。 このような現象がおきる理由をご教示願います。 この現象を避けるには、作業用シートをサブルーチンごとに挿入・削除を繰り返す必要が生じ、処理スピードが落ちると予想されます。 よき、アドバイスがあればよろしくお願いします。 Sub フィルター() Dim rows As Double '重複を削除した番号リスト作成 With Worksheets("作業用") rows = .Range("b65536").End(xlUp).Row .Range(.Cells(6, 3), .Cells(rows, 3)).AdvancedFilter Action:=xlFilterCopy, _ copytorange:=.Range("N6"), unique:=True End With End Sub

  • ExcelのVBAの配列に関する質問です。

    ExcelのVBAの配列に関する質問です。 sheet1のデータをsheet2に表示するVBAを作成しています。。 sheet1のデータは7行目からスタートし、sheet2のデータは26行目からスタートしています。。 sheet1とsheet2の列は同じ並びではないため、それぞれのシートの列番号をCellsを用いて指定しています。 Sub test1() Dim endrow As Long endrow = Worksheets("sheet1").Range("A65536").End(xlUp).Row Dim i As Long Dim j As Long For i = 7 To endrow j = i + 19 Worksheets("sheet2").Cells(j, 1) = Worksheets("sheet1").Cells(i, 2) Worksheets("sheet2").Cells(j, 8) = Worksheets("sheet1").Cells(i, 28) Worksheets("sheet2").Cells(j, 9) = Worksheets("sheet1").Cells(i, 31) Worksheets("sheet2").Cells(j, 10) = Worksheets("sheet1").Cells(i, 32) ・ ・ ・ ※長いので省略 Next i End Sub 上記のtest1は正常に動くのですが、データ量が多いため、処理に時間がかかってしまいます。 高速化できないかと、以下のように変更しました。 Sub test2() Dim dataRange1 As Variant Dim dataRange2 As Variant dataRange1 = Worksheets("sheet1").Range("A1:GI10006") dataRange2 = Worksheets("sheet2").Range("A1:DZ10018") Dim endrow As Long endrow = Worksheets("sheet1").Range("A65536").End(xlUp).Row Dim i As Long Dim j As Long For i = 7 To endrow j = i + 19 dataRange2(j, 1) = dataRange1(i, 2) dataRange2(j, 8) = dataRange1(i, 28) dataRange2(j, 9) = dataRange1(i, 31) dataRange2(j, 10) = dataRange1(i, 32) ・ ・ ・ ※長いので省略 Next i End Sub test2は、エラーメッセージ等は表示されませんが、sheet2にデータが表示されません。 ちなみに、以下のようにsheet1のみ配列化した場合は、正常に表示されました。 Worksheets("sheet2").Cells(j, 1) = dataRange1(i, 2) Worksheets("sheet2").Cells(j, 8) = dataRange1(i, 28) Worksheets("sheet2").Cells(j, 9) = dataRange1(i, 31) Worksheets("sheet2").Cells(j, 10) = dataRange1(i, 32) test2は、どこが間違っているのでしょうか? ご教示ください。 よろしくお願いいたします。

専門家に質問してみよう