[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『テーブルの並び替え』(たたき)
複数シートのテーブルの最終行の次の行に転記後、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
おはようございます ^^ 深夜までお疲れさまです。。。すみません。寝てしまいました^^; >>ソートメソッドの所で再度シートの指定 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
(たたき) 2020/08/31(月) 22:03
(隠居じーさん) 2020/08/31(月) 22:15
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.