[[20200829165624]] 『テーブルの並び替え』(たたき) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『テーブルの並び替え』(たたき)

複数シートのテーブルの最終行の次の行に転記後、A列、E列の優先順位で昇順で並び替えをしたく、下記コードまでたどり着きました。1枚のシート(sheet1)だったら上手くいくのですが、試しに2枚(sheet1とsheet2)で実行しようとしたらこういったエラーがでてきます。

エラー文
実行時エラー1004
並び替えの参照が正しくありません。参照が並び替えるデータ内にあることと、「最優先されるキー」ボックスが空白でないことを確認してください。

調べたのすがよくわかりません。
詳しい方いたら教えていただけないでしょうか?

コードは下記になります。
Private Sub CommandButton1_Click()

     Dim RowNum As Long
    Dim Ctrl As Control
    Dim dic As Object
    Dim ws As Worksheet
    Dim i As Long
    Dim rc As Integer

    rc = MsgBox("登録をしてよろしいですか?", vbYesNo + vbQuestion, "メッセージ")

    If rc = vbYes Then

    Select Case ComboBox1.Value

    Case "りんご"
      Set dic = CreateObject("Scripting.Dictionary")

        For i = 1 To 2            ←1枚だけにすると上手く実行されます。
           dic("Sheet" & i) = Empty
        Next

        For Each ws In Worksheets
           If (dic.Exists(ws.CodeName)) Then
             With ws
              RowNum = .Cells(Rows.Count, 1).End(xlUp).Row + 1

              .Cells(RowNum, 2).Value = ComboBox1.Value
              .Cells(RowNum, 3).Value = TextBox1.Value
              .Cells(RowNum, 4).Value = TextBox2.Value
              .Cells(RowNum, 6).Value = ComboBox3.Value

              .Range("A4").ListObject.Sort.SortFields.Clear
              .Range("A4").ListObject.Range.Sort key1:=Range("A4"), order1:=xlAscending, _
                                                 key2:=Range("E4"), order1:=xlAscending, _
                                             order1:=xlAscending, _
                                             Header:=xlYes, _
                                             Orientation:=xlTopToBottom, _
                                             SortMethod:=xlPinYin

                                Exit Sub
              End With

            End If

          Next

        Set dic = Nothing

  以下Caseが3つ続き、

      ・
      ・
End Select
 Else
        MsgBox "中止します。"
    End If

End Sub

上記コードの
.Range("A4").ListObject.Range.Sort key1:=Range("A4"), order1:=xlAscending, _

                                                 key2:=Range("E4"), order1:=xlAscending, _
                                             order1:=xlAscending, _
                                             Header:=xlYes, _
                                             Orientation:=xlTopToBottom, _
                                             SortMethod:=xlPinYin

ここの部分がデバックになります。
A列とE列は、両方とも番号が入ります。
テーブルは4行目が見出しとなっています。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 こんばんは ^^
ソートのキーのレンジオブジェクトのシートの指定がされていないので
アクティブなシートが設定されていますので、どちらかアクティブでない
シートでエラーになるのでは。。。と。。。思いますです。m(_ _)m
(隠居じーさん) 2020/08/29(土) 19:36

  後、Order2 がないよぉ〜ですが大丈夫ですか。
 .Range("A4").ListObject.Sort.SortFields.Clear

                                    ↑
 はソートメソッドをお使いなので、要らないかもです。
 ま、あっても、何もないとはおもいますが。。。( ̄▽ ̄)
https://excel-ubara.com/excelvba1/EXCELVBA388.html
が参考になると思います。省かないほうが良いオプションも
有るみたいですよ。
(隠居じーさん) 2020/08/29(土) 20:05

 追伸の追伸 (#^^#)
何度も相済みません。^^;。。。
Orientationもなんか変だな〜とか思うのですが
どちらも、定数は。。1.。。なので、結果、同じことなのでしょうね。。。
以上、気が付いた点だけでした。。。m(_ _)m
(隠居じーさん) 2020/08/29(土) 21:46

助言ありがとうございます。

シートの指定は、For i= 1 to 2で順番にされている訳ではないということですか?
全部で10シートくらい指定したいのですが、どのように指定したらよいのでしょうか?
またcaseいよっては、間を飛ばすこともしたいのですが、どのように指定したらよいでしょうか?

.Range("A4").ListObject.Range.Sort key1:=Range("A4"), order1:=xlAscending, _

                                                 key2:=Range("E4"), order2:=xlAscending, _
                                             Header:=xlYes, _
                                             SortMethod:=xlPinYin

Orientationは省略しても問題ないですかね
(たたき) 2020/08/29(土) 22:22


 こんばんは ^^
>>シートの指定は、For i= 1 to 2で順番にされている訳ではないということですか? 
   いえ、指定されていると思います。10シート位なら、私でしたら配列を使いますが。。。
   それはそれ、それぞれお気に入りの方法があるかと処理速度も問題にならない程度ですし
>>間を飛ばすこともしたいのですが、どのように指定したらよいでしょうか? 
   こちらも同様、IF なり select case なり、必要な分だけ
配列にするとか。。。さまざまですね。
>>Orientationは省略しても問題ないですかね
    ヘルプとは違うようですが、それでよいという、サイトも有ります。
    省略しても、上から下方向が既定値の様なので、← 多分
  この辺は、間違ってたり、変な日本語のサイトもあるようなので
  迷いますね^^;実験が一番!(◎_◎;)、
  
 ただ、手動で前回おこなった、設定が、一部オプションで引き継がれるようですので
現在の情報に合わせて設定された方が、安全性が増すという意味で申し上げました
詳細は、ヘルプ[マイクロソフト様とか参考サイト]をご参照ください。
(隠居じーさん) 2020/08/29(土) 23:27

指定されてるけど、ソートメソッドの所で再度シートの指定をしなければならないということでしょうか?
無知ですみません
(たたき) 2020/08/29(土) 23:57

 おはようございます ^^
深夜までお疲れさまです。。。すみません。寝てしまいました^^;
>>ソートメソッドの所で再度シートの指定
key1、key2 は 一度も指定されていない、と思います。結果
コード実行時、のアクテイブシートを指定したことになります。
テーブルは各シートを指定、キーはアクテイブシートのまま変化
致しませんので、テーブルは、Sheet2の物、keyはSheet1 の物
、という状況になった時、エクセル様が判定不能になりエラーを
お出しになる。とかだと思います。
複数シート取扱時は、基本。。。シート指定は、全てのレンジオブジェクトに
指定しないと、トラブル発生の源になると思います。詳しくは、解ったと思い込
んでいる私より他の回答者様のアドバイスをお待ちいただくか、関係書籍、関係
サイト等でご確認くださいませ。m(_ _)m
(隠居じーさん) 2020/08/30(日) 07:37

 こんばんわぁ〜 ^^
回答ではありませんが、恐怖の憶測と推測のデモコードでぇ〜す
^^;。テーブルのお勉強になりました。おやりになりたいこと
を、実験したつもりですが。。。外していましたらお許しを。
Sheet1、Sheet3、Sheet6が変化致します。
新規ブックにシートを6枚作成、シート名[Sheet1 〜 Sheet6]、
後、下記コードを標準モジュールにコピペして、IJ00103.xlsm
で保存してからお試しを、ご考察の、何かの足しにでも、なれば
幸甚です。
Option Explicit
Sub OneInstanceMain()
    Const zProgramID  As String = "IJ00103.xlsm"
    Dim ztb           As Workbook
    Dim i             As Long
    Dim zf            As Boolean
    Dim v(1 To 5)     As Variant
    Dim sNm()         As Variant
    Dim tN()          As Variant
    Dim zVar          As Variant
    Randomize
    Set ztb = Workbooks(zProgramID)
    If Not ztb.Worksheets("Sheet1").Cells(1, 4).Value = True Then zDummyDataMaker ztb
    sNm = Array("Sheet1", "Sheet3", "Sheet6")
    tN = Array(10001, 80988, 65211)
    For Each zVar In sNm
        With ztb.Worksheets(zVar)
            If .ListObjects.Count = 1 Then
                If .ListObjects(1).Range.Rows.Count > 16 Then zf = True
                With .ListObjects(1)
                    v(1) = tN(Int((2 - 0 + 1) * Rnd + 0))
                    v(2) = "営 業"
                    v(3) = "天 丼"
                    v(4) = Format(Int((990 - 100 + 1) * Rnd + 100) * 100, "#,0")
                    v(5) = Int((100 - 1 + 1) * Rnd + 1)
                    With .ListRows.Add
                        .Range(1).Resize(, 5) = v
                    End With
                    .Range.Sort Key1:=.Range.Range("A1"), _
                                Key2:=.Range.Range("E1"), _
                                Order1:=xlAscending, _
                                Order2:=xlAscending, _
                                Header:=xlYes, _
                                Orientation:=xlSortColumns, _
                                MatchCase:=True, _
                                SortMethod:=xlPinYin
                End With
            End If
        End With
    Next
    If zf Then
        zDummyDataMaker ztb
        zf = False
    End If
    Set ztb = Nothing
    Erase v, sNm, tN
End Sub
Private Sub zDummyDataMaker(ByVal ztb As Workbook)
    Dim i As Long
    Dim j As Long
    Dim r As Range
    For i = 1 To ztb.Worksheets.Count
        With ztb.Worksheets(i)
            If .ListObjects.Count > 0 Then
                For j = 1 To .ListObjects.Count
                    With .ListObjects(j)
                        .TableStyle = ""
                        .Unlist
                    End With
                Next
            End If
            .UsedRange.Clear
            .Buttons.Delete
            .Cells(4, 1).Resize(, 5) = Array("担当名", "部所", "商品名", "売上金額", "考査")
            .ListObjects.Add(xlSrcRange, .Cells(4, 1).CurrentRegion, , xlYes).Name = "MyTBL" & Format(i, "000")
        End With
    Next
    With ztb.Worksheets("Sheet1")
        Set r = .Range("A1:B1")
        With .Buttons.Add(r.Left, r.Top, r.Width, r.Height)
            .OnAction = "OneInstanceMain"
            .Characters.Text = "BTN"
        End With
        .Cells(1, 4) = True
    End With
    Set r = Nothing
End Sub
(隠居じーさん) 2020/08/30(日) 20:59

 ↑のSortメソッドの Key1、 Key2 は
     .Range.Sort Key1:=.Range(1), _
                 Key2:=.HeaderRowRange(5), _
等がお作法なのかもしれません。でも、テーブルとはいえエクセル
のセルなので多分、様々な参照方法が有るのでしょうね。でわ、と
りあえず、私はこれにて失礼させて戴きます。便利なのが出来ると
良いですね。m(_ _)m
(隠居じーさん) 2020/08/30(日) 22:21

隠居じーさんさん、ありがとうございます。
試させていただきました。
すごいですね。
ソートする時、Arrayで配列指定しているということでしょうか?

(たたき) 2020/08/31(月) 22:03


こんばんは ^^
恐縮です。。。m(_ _)m
http://officetanaka.net/excel/vba/table/03.htm
こちらを参考にさせて頂きました。配列ではなく、
テーブル特有のセル指定方法の様に思われます。

(隠居じーさん) 2020/08/31(月) 22:15


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.