Excel VBAで任意の順番にシートを並び替える方法

このQ&Aのポイント
  • ExcelのVBAを使用して、任意の順番にシートを並び替える方法について説明します。
  • 指定した順番にシートを並び替えるためには、VBAのプログラムを使用します。
  • プログラムを実行すると、指定したシートが末尾に移動され、指定した順番で表示されます。
回答を見る
  • ベストアンサー

Excel 指定順にシートの並び替え VBA

http://okwave.jp/qa/q8383406.html 以前も質問させて頂きました。 任意の順番にシートを並び替えるプログラムです。 Sub Sheet_sort_Select() Dim A As Variant, I As Integer A = Array("更新履歴", "統計", "全データ", "商品金額", "販売台数", "販売累計") For I = 0 To UBound(A) Worksheets(A(I)).Move after:=Worksheets(Worksheets.Count) Next I End Sub 上記方法で並び替えを行っています。 色んなシートから並び替えを実行するのですが、 最後に選択していたシートに戻るということは可能でしょうか? このsortをした後に、またselectなりすれば シート選択できますが、他に方法はあるのでしょうか? Excel2003を使用しています。

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

  • ベストアンサー
回答No.1

事前にオブジェクト(今回はシート)を変数に放り込んで、記録しておきます。 Sub Sheet_sort_Select()   Dim A As Variant, s As Worksheet, I As Integer   A = Array("更新履歴", "統計", "全データ", "商品金額", "販売台数", "販売累計")   Set s = ActiveSheet   For I = 0 To UBound(A)     Worksheets(A(I)).Move after:=Worksheets(Worksheets.Count)   Next I   s.Select  ' 1 シートのみを選択したい場合は「s.Activate」と書いてもよい End Sub

satoron666
質問者

お礼

回答ありがとうございます! 並び替えの前に、アクティブシートを保持しておくのですね! 全く思いつきもしませんでした…orz 回答頂き、ありがとうございます! 良いプログラムを組めるようにがんばります!

関連するQ&A

  • Excel 指定順にシートの並び替え VBA

    http://okwave.jp/qa/q8383406.html 上記の続きになります。 Sub macro() Dim A As Variant, I As Integer A = Array("更新履歴", "統計", "全データ", "商品金額", "販売台数", "販売累計") For I = 0 To UBound(A) Worksheets(A(I)).Move after:=Worksheets(Worksheets.Count) Next I End Sub このようにシートを並び替えているのですが、 この中で”統計”シートが無かった場合、 更新履歴 全データ 商品金額 販売台数 販売累計 と並び替える方法はありますか? 配列に入っているシート名があったら、並び替える。 (無かったらそこは飛ばす) そういう方法はないのでしょうか? 回答よろしくお願い致します!

  • Excel 指定順にシートの並び替え VBA

    お世話になっております。 今回は、シートの並び替えをしたいと考えています。 例として、 シート名 販売台数 販売類型 統計 商品金額 全データ 更新履歴 とあったとします。 シートを削除し、作り直すというマクロを組んでいるため シートの位置をわざわざ変えるのは面倒です。 シートを指定順に並べ替える方法がしりたいです。 販売台数 販売類型 統計 商品金額 全データ 更新履歴 ↓ 更新履歴 統計 全データ 商品金額 販売台数 販売累計 商品金額 販売台数 統計 全データ 販売類型 更新履歴 ↓ 更新履歴 統計 全データ 商品金額 販売台数 販売累計 かならず、矢印の下のように並び替えたいと思います。 この設定方法を、 WorkSheet(1)=更新履歴 WorkSheet(2)=統計 などと位置を決めて動かせたら良いと思っているのですが、 方法はあるのでしょうか? シートを移動する、MOVEとかもありましたが、 考えるだけで気が遠くなりそうです… ちなみに、Excel2003を仕様しております。 回答よろしくお願いいたします!

  • 新しいワークブックのシートが指定できません

    エクセルでマクロを作成中です。 マクロの動作の中で新しいワークブック作成して、 その中のワークシートを指定してデータを入力したいのですが、 全て1つ目のシートに入力されてしまいます。 どのようにしたら2つ目以降のシートを指定できるのでしょうか? ソース Public Csvfile Public Csv_bk As Workbook Public Xls_bk As Workbook Public ch As Integer Public i As Integer Public LineCSV As Variant Public LineXLS As Variant Sub CSV_XLS() Set Csv_bk = Workbooks.Open(Csvfile) Set Xls_bk = Workbooks.Add ch = FreeFile Open Csvfile For Input As #ch i = 1 Do Until EOF(ch) Line Input #ch, LineCSV LineXLS = Split(LineCSV, ",") Xls_bk.Worksheets(1).Range(Cells(i, 1), Cells(i, UBound(LineXLS) + 1)) = LineXLS i = i + 1 Loop End Sub DO文の中のWorksheets(1)をWorksheets(2)にしても全て 1つ目のシートに入力されてしまいます。 上のソースでは全てのデータを同じシートに入力していますが、 実際にはWorksheets(n)として nを使ってデータをシート毎に振り分けたいと考えています。 Csvfileには別のフォームからファイル名を取得しています。

  • エクセル マクロ 範囲指定。

    先日、OKWAVEのサイトでエクセルマクロの質問をさせていただき 下記の回答を活用したいのでしが myKey = Worksheets("Sheet2").Range("A1").ValueをA1A2・・・A50のように 50個を一度に処理したいのですがどのように変更すればよろしいのでしようか 自分なりに調べてみましたが知識がなくできませんでした ご回答のいただいたmitarashiさんにお聞きしたいのですがお聞きする手段がわからず 再度、質問させていただきます。                       宜しくお願いいたします。 Sub test() Dim targetRange As Range Dim buf As Variant Dim i As Long, j As Long, myColorIndex As Long Dim myKey As Variant Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Set targetRange = Worksheets("Sheet1").Range("J10:BB10000") buf = targetRange myColorIndex = 4 myKey = Worksheets("Sheet2").Range("A1").Value With targetRange For i = 1 To UBound(buf, 1) For j = 1 To UBound(buf, 2) If buf(i, j) = myKey Then .Cells(i, j).Interior.ColorIndex = myColorIndex Next j Next i End With Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub

  • VBA 複数シート選択について

    Sub test() Dim i As Integer i = ActiveWorkbook.Worksheets.Count Worksheets(Array(2, i)).Select End Sub シート2とシートi の選択ではなく、2~iまでの複数シート を選択するにはどのように書くのかご教示下さい。

  • 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は、どこが間違っているのでしょうか? ご教示ください。 よろしくお願いいたします。

  • エクセルVBA

    よろしくお願いいたします。 エクセルのVBAですが、下記のコードを実行すると処理が遅いです。処理が早くなるコード教えてください。 よろしくお願いいたします。 Sub Macro3() Dim aa As Variant Dim i As Variant Application.ScreenUpdating = False Range("A14:i46").Select aa = ActiveSheet.Name ActiveWorkbook.Worksheets(aa).Sort.SortFields.Clear ActiveWorkbook.Worksheets(aa).Sort.SortFields.Add Key:=Range("B15:B46"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ActiveWorkbook.Worksheets(aa).Sort.SortFields.Add Key:=Range("C15:C46"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets(aa).Sort .SetRange Range("A14:i46") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With For i = 0 To 31 Cells(15 + i, 7).Select If Selection.Value = 0 Then Selection.EntireRow.Hidden = True End If Next i Range("A1").Select Application.ScreenUpdating = True End Sub

  • 下記エクセル列の並び替えマクロで、Callの際に変数が引き継がれません

    下記エクセル列の並び替えマクロで、Callの際に変数が引き継がれません。 何か方法はありませんでしょうか。 Sub 各学校() Dim i As Integer Worksheets("Sheet1").Activate For 元列 = 1 To 16 If Cells(1, i) = "学校" Then 新1列 = 元列 ElseIf Cells(1, i) = "住所" Then 新2列 = 元列 ElseIf Cells(1, i) = "電話" Then 新3列 = 元列 (略) End If Next Call 列の並び替え End Sub Sub 列の並び替え() Worksheets("Sheet2").Activate Cells.Clear Worksheets("Sheet1").Columns(新1列).Cut Worksheets("Sheet2").Columns("A").Insert Worksheets("Sheet1").Columns(新2列).Cut Worksheets("Sheet2").Columns("B").Insert Worksheets("Sheet1").Columns(新3列).Cut Worksheets("Sheet2").Columns("C").Insert (略) End Sub

  • Excelシートを複数選択するvbaについて

    タイトルのvbaを作成していますが、インデックスエラーとなりうまく選択できません。 社員番号をシート名にしたシートが複数あります。 ここでは、2番目のシートから仮に060001~060100までとします。 (社員番号は6桁で整理しています。) 1番目のシートには、別途、条件に一致した社員番号リストを作成しています。 (シート名が6桁のため、セルの書式設定で"000000"をしています。) A1=060002 A2=060005 A3=060088 この社員番号リスト(A1、A2、A3)に一致するシートを別ブックにコピーするのが目的ですが、まずは、選択するところから始めたところ、インデックスエラーにより選択できません。 シート名と配列にしたリストの型がよくないと思い、文字列に直すなどを試してみましたがうまくいかず、結局どのように直していいのかわかりませんでした。 ご教示いただけないでしょうか? よろしくお願いいたします。 以下に、実行したプログラムを記載させていただきます。 Option Base 1 Sub Sample() Dim Sh As Worksheet Dim ArrShName() As String Dim i As Long ReDim ArrShName(1) For i = 1 To 3 ReDim Preserve ArrShName(i) ArrShName(i) = Cells(i, 1) Next i ' Worksheets(Array("060002", "060005", "060088")).Select Worksheets(ArrShName).Select End Sub

  • 【VBA】全てのシートを並び替え 反映せず

    For Each Ws In Worksheets Ws.Activate 「並び替えの処理」 Next Ws を記述したのですが、 「並び替えの処理」を記憶マクロからコピペした為、 ("Sheet1")しか並び替えの処理がされません。(全シート並び替えの処理がしたい) 下記コードをどの様に修正すれば良いでしょうか。 ご教示願います。 '5行目から最終行迄範囲選択し、W列で昇順に並び替え Rows("5:5").Select Range(Selection, Selection.End(xlDown)).Select ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("W5:W40") _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Sheet1").Sort .SetRange Range("A5:X40") .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With

専門家に質問してみよう