[[20180306195924]] 『マクロコードをまとめたい』(宇土会な) ページの最後に飛ぶ

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

 

『マクロコードをまとめたい』(宇土会な)

下記のコードを作りました。これを重複などが多いので、まとめたいのですがどのようにしたらよいでしょうか。教えて頂けませんか。また、Macro2()は教えてもらって作ったものですが、これと一緒にできたらと思っています。これまで教えて頂くと有難いのですが、よろしくお願いします。

Sub Macro1()
'
' Macro1 Macro
' マクロ記録日 :
'

    Rows("3:316").Select
    Range("A316").Activate
    Selection.Sort Key1:=Range("D3"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
        :=xlPinYin, DataOption1:=xlSortNormal
    Application.Run "'30  3  4  サンプル  クラス分けのデータ.xls'!?A学級ごと重複データを一括削除する"
    Application.Run "'30  3  4  サンプル  クラス分けのデータ.xls'!?A学級ごと重複データを一括削除する"
    Selection.Sort Key1:=Range("B3"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
        :=xlPinYin, DataOption1:=xlSortNormal
    Rows("3:3").Select
    Selection.Delete Shift:=xlUp
    Cells.Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("E6").Select
    Application.CutCopyMode = False
    Range("A3").Select
    ActiveCell.FormulaR1C1 = "1"
    Range("A4").Select
    ActiveCell.FormulaR1C1 = "2"
    Range("A3:A4").Select
    Selection.AutoFill Destination:=Range("A3:A28"), Type:=xlFillDefault
    Range("A3:A28").Select
    Range("A29").Select
    ActiveCell.FormulaR1C1 = "1"
    Range("A30").Select
    ActiveCell.FormulaR1C1 = "2"
    Range("A29:A30").Select
    Selection.AutoFill Destination:=Range("A29:A68"), Type:=xlFillDefault
    Range("A29:A68").Select
    Range("A69").Select
    ActiveCell.FormulaR1C1 = "1"
    Range("A70").Select
    ActiveCell.FormulaR1C1 = "2"
    Range("A69:A70").Select
    Selection.AutoFill Destination:=Range("A69:A108"), Type:=xlFillDefault
    Range("A69:A108").Select
    Range("A109").Select
    ActiveCell.FormulaR1C1 = "1"
    Range("A110").Select
    ActiveCell.FormulaR1C1 = "2"
    Range("A109:A110").Select
    Selection.AutoFill Destination:=Range("A109:A148"), Type:=xlFillDefault
    Range("A109:A148").Select
    Range("A149").Select
    ActiveCell.FormulaR1C1 = "1"
    Range("A150").Select
    ActiveCell.FormulaR1C1 = "2"
    Range("A149:A150").Select
    Selection.AutoFill Destination:=Range("A149:A188"), Type:=xlFillDefault
    Range("A149:A188").Select
    Range("A189").Select
    ActiveCell.FormulaR1C1 = "1"
    Range("A190").Select
    ActiveCell.FormulaR1C1 = "2"
    Range("A191").Select
    ActiveCell.FormulaR1C1 = "3"
    Range("A190:A191").Select
    Selection.AutoFill Destination:=Range("A190:A228"), Type:=xlFillDefault
    Range("A190:A228").Select
    Range("A229").Select
    ActiveCell.FormulaR1C1 = "1"
    Range("A230").Select
    ActiveCell.FormulaR1C1 = "2"
    Range("A229:A230").Select
    Selection.AutoFill Destination:=Range("A229:A268"), Type:=xlFillDefault
    Range("A229:A268").Select
    Range("B271").Select
    ActiveWindow.SmallScroll Down:=-294
    Range("M1").Select
    ActiveCell.FormulaR1C1 = "226"
    Range("M1").Select
    ActiveCell.FormulaR1C1 = "=COUNT(R[2]C[1]:R[267]C[1])"
End Sub

Sub Macro2()
'
' Macro2 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, "D"), Cells(lastRow, "D")), Cells(i, "D")) > 0 Then
If myRng Is Nothing Then
Set myRng = Cells(i, "D")
Else
Set myRng = Union(myRng, Cells(i, "D"))
End If
End If
Next i
If Not myRng Is Nothing Then
myRng.EntireRow.Delete
End If
End Sub

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


質問のたびにニックネーム変えるのはあんまり感心しないですけど単なるタイプミスでしょうか・・・

とりあえず、「下記のコードを作りました。」と仰っていますが、提示されたものは「マクロの」記録により得られたコードでしょうから、まずは勉強がてら不要な記述の削除やインデント付けなどの整理に取り組んでみてはいかがでしょうか

(もこな2) 2018/03/06(火) 21:07


タイプミスでした。すみません、初心者で申し訳あのません。
(宇土会な) 2018/03/06(火) 22:37

↓記事編集について
無理強いはしないですが、直接編集機能を使えばちょっとした誤字は修正可能です。

1.「初めての方へ」をクリック
2.(e) [既存の書き込みに書き込む]機能のなかの「こちらから → 直接編集用ページ」のリンクをクリック
3.注意書きをみればわかると思いますが、2重の角括弧で記事番号を囲ったものを入力して「編集」をクリック
で編集可能です。

機能的には、ご自身以外が投稿された内容も編集できますが、他の方が書き込んだ内容を勝手に編集するのはマナーとしてどうかとおもいますので、ご自身以外の投稿を修正するには、投稿された方に編集してよいか確認した方がよいとおもいます。
そういった意味では、今回は、この文章を含め、私の発言を一部修正しないと辻褄が合わなくなるので、併せて編集してくださって結構です。

↑記事編集の話ここまで。


私の「2018/03/06(火) 21:07」のコメント以降、アドバイスに関するレスがないですが、がんばって整理をしているところでしょうか?
そうであれば以下の追加アドバイスも参考にしてください。
【他の回答者さんへ】
  変なところがあればツッコミお願いします。(特にSortメソッドあたりが自信なし・・・)

(1)
「〇〇〇.Select」や「〇〇〇.Activate」のあとに「Selection.×××」「Active×××」みたいにってなってるところが、いくつかありますがたいていの場合は、〇〇を選択(アクティブに)して、選択している(アクティブになっているものを)××するという記述ではなく、〇〇を××するというように記述することが可能です。

(2)
並び替えを2回にわけておこなっていますが、一度の並び替えでキーを3つまで指定できるので、1つの記述にまとめることができるとおもいます。
※RUMメソッドで何が実行されているのかよくわからないので、当該が並び替えの条件等に影響しないものであればですが。

(3)
全セルをコピーして、そのまま同じ場所に形式を選択して貼り付け(値)を実行していますが、同じことをもうちょっと簡単に記述することが可能とおもわれます。

(4)
AutoFillメソッド関係で、1,2を設定してから、「Type:=xlFillDefault」でオートフィルしてますが、「Type:=xlFillSeries」であれば、1だけ設定すればよいとおもいます。

(5)M1セルで、"226"を設定した直後に数式を設定しなおしているので,”226”の設定に意味が無いようにおもうんですが、どういう意図なんでしょうか?

とりあえず。(1)〜(4)を踏まえて、「Macro1」を一部だけ整理するとこんな感じになるとおもいます・

Sub Macro1の整理()

    '並び替えの実行
    Rows("3:316").Sort _
        Key1:=Range("B3"), Order1:=xlAscending, _
        Key2:=Range("D3"), Order2:=xlAscending, _
        Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
        Orientation:=xlTopToBottom, SortMethod:=xlPinYin, _
        DataOption1:=xlSortNormal

    '3行目を削除
    Rows("3:3").Delete Shift:=xlUp

    '全セルを値に変換
    Cells.Value = Cells.Value

    '連続データの生成
    With Range("A3")
        .Value = 1
        .AutoFill Destination:=.Resize(26, 1), Type:=xlFillSeries
                        'Resize(26)でも可 ↑
    End With

    With Range("A29")
        .Value = 1
        .AutoFill Destination:=.Resize(40, 1), Type:=xlFillSeries
    End With

    With Range("A69")
        .Value = 1
        .AutoFill Destination:=.Resize(40, 1), Type:=xlFillSeries
    End With

    〜中略〜

    With Range("M1")
        .Value = "226"
        .Formula = "=COUNT(A2:A267)"
    End With

End Sub
(もこな2) 2018/03/08(木) 11:07


Macro2の方も、インデントがついておらず非常に見づらいので、少なくとも誰かに見せるときはインデントを付けた上で見せるようにしたほうがよいとおもいます。

 Sub Macro2整理()
'==変数の宣言など
    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, "D"), Cells(lastRow, "D")), Cells(i, "D")) > 0 Then
                If myRng Is Nothing Then
                    Set myRng = Cells(i, "D")
                Else
                    Set myRng = Union(myRng, Cells(i, "D"))
                End If
            End If
        Next i

    If Not myRng Is Nothing Then
        myRng.EntireRow.Delete
    End If
End Sub

そして、整理した上で内容を読むと、実はこんなことで十分だったりしませんか?
Sub Macro2改()
'==変数の宣言など

    Dim lastRow As Long

'==処理

   With ActiveSheet
        lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

        .Range(.Rows(2), Rows(lastRow)).RemoveDuplicates _
            Columns:=4, Header:=xlNo
    End With
End Sub

(もこな2) 2018/03/08(木) 13:41


(もこな2) さんありがとうございました。なるほどできました。中略のところなどを作って完成出来ました。但し、下記のところで、エラーメモリー不足が出たので、過去のエクセル学校の記事から、コードを見つけてやったらエラーが消えてできました。

全セルを値に変換

    Cells.Value = Cells.Value
過去のエクセル学校の記事から
Range("A3:N300").Value = Range("A3:N300").Value

大変お世話になり有難うございました。もっと勉強が必要なことがわかりました。

(5)M1セルで、"226"を設定した直後に数式を設定しなおしているので,”226”の設定に意味が無いようにおもうんですが、どういう意図なんでしょうか? なお、これについては、意味がないようです。これがついたことは、私もよくわかりませんでした。266の間違いのようでもあります。対象が266件でしたので打ち間違いなのかもしれません。いらないことをしてしまったので、申し訳ありません。
(宇土会な) 2018/03/09(金) 18:38

>エラーメモリー不足が出たので、過去のエクセル学校の記事から、コードを見つけてやったらエラーが消えてできました。

なるほど。全セルは無理があったみたいですね。失礼しました。
「Range("A3:N300").Value」をそのままつかったら、A3〜N300固定になっちゃうので適宜必要な範囲に直してるとおもいますけど、UsedRange 使うって手もあるとおもうので、そちらも研究してみるとよいかもしれません。

また、整理してみてお分かりになったかとおもいますが、29行目以降は40行おきに1〜40の連続数を作るって作業を繰り返してるだけですよね。
規則的に繰り返す(=反復処理)ならば、いちいち全部書かなくても条件を満たすまで繰り返せって、Excel君に1回伝えれば、そのとおり処理してくれます。

なので私が整理すると、こんな感じでしょうか。
(実データないので試してないけど、たぶんいける・・ハズ)
Sub Macro1の整理()
'==宣言など

    Dim i As Long
    Dim buf As String

'==処理

    With ActiveSheet.Rows("3:316")

        '並び替えの実行
        .Sort _
            Key1:=Range("B3"), Order1:=xlAscending, _
            Key2:=Range("D3"), Order2:=xlAscending, _
            Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
            Orientation:=xlTopToBottom, SortMethod:=xlPinYin, _
            DataOption1:=xlSortNormal

        '3行目を削除
        .Rows(1).Delete

        'ActiveSheet.UsedRange と ActiveSheet.Rows("3:316") が交わる範囲だけ値化
        With Intersect(.Parent.UsedRange, .Cells)
            .Value = .Value
        End With

    End With

    With ActiveSheet
        '連続データの生成
        With .Range("A3")
            .Value = 1
            .AutoFill Destination:=.Resize(26), Type:=xlFillSeries
        End With

        For i = 29 To 229 Step 40
            With .Cells(i, "A")
                .Value = 1
                .AutoFill Destination:=.Resize(40), Type:=xlFillSeries
            End With
        Next i

        buf = .Range(.Cells(2, "A"), .Cells(.Rows.Count, "A")).Address(0, 0)
        .Range("M1").Formula = "=COUNT(" & buf & ")"
    End With
End Sub
(もこな2) 2018/03/09(金) 22:45

上記でちょっとミスしました。

buf = .Range(.Cells(2, "A"), .Cells(.Rows.Count, "A")).Address(0, 0)

buf = .Range(.Cells(2, "A"), .Cells(.Rows.Count, "A").End(xlUp)).Address(0, 0)

です。
(もこな2) 2018/03/09(金) 22:50


 色々と有難うございました。(もこな2)さんの言うとおりで出来ました。スピードも瞬時で終わる感じです。最初でそこまで言うで気でしたが、再度、新たに欲が出まして「並べ替え」までしてみようと思い、コードを入れてみました。Aの部分は並べ替えと連番で完成できますが、BからGはどうしてもできないので、教えて頂くわけにはいきませんか。よろしくお願い致します。

Sub Macro1の整理()
'==宣言など

    Dim i As Long
    Dim buf As String

'==処理

    With ActiveSheet.Rows("3:316")

        '並び替えの実行
        .Sort _
            Key1:=Range("B3"), Order1:=xlAscending, _
            Key2:=Range("D3"), Order2:=xlAscending, _
     Key3:=Range("K3"), Order3:=xlAscending, _
            Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
            Orientation:=xlTopToBottom, SortMethod:=xlPinYin, _
            DataOption1:=xlSortNormal

        '3行目を削除
        .Rows(1).Delete

        'ActiveSheet.UsedRange と ActiveSheet.Rows("3:316") が交わる範囲だけ値化
        With Intersect(.Parent.UsedRange, .Cells)
            .Value = .Value
        End With

    End With

    With ActiveSheet
        '連続データの生成
        With .Range("A3:N28").Sort( _
        Key1:=Range("K3"), _
           Order1:=xlDescending)
        End With

        With .Range("A3")
            .Value = 1
            .AutoFill Destination:=.Resize(26), Type:=xlFillSeries
        End With

        For i = 29 To 229 Step 40
        With .Range("A29:N229").Sort( _
           Key1:=Range("K3"), _
           Order1:=xlDescending)
        End With

            With .Cells(i, "A")
                .Value = 1
                .AutoFill Destination:=.Resize(40), Type:=xlFillSeries
            End With
        Next i

         buf = .Range(.Cells(2, "A"), .Cells(.Rows.Count, "A").End(xlUp)).Address(0, 0)
        .Range("M1").Formula = "=COUNT(" & buf & ")"
    End With
End Sub

(宇土会ね) 2018/03/10(土) 16:22


「2018/03/10(土) 16:22」の追加質問が私には理解でききません。

また、

        '連続データの生成
        With .Range("A3:N28").Sort( _
        Key1:=Range("K3"), _
           Order1:=xlDescending)
        End With

        For i = 29 To 229 Step 40
        With .Range("A29:N229").Sort( _
           Key1:=Range("K3"), _
           Order1:=xlDescending)
        End With
            With .Cells(i, "A")
                .Value = 1
                .AutoFill Destination:=.Resize(40), Type:=xlFillSeries
            End With
        Next i
↑の部分、特に
 '連続データの生成
   With .Range("A3:N28").Sort(Key1:=Range("K3"), Order1:=xlDescending)
   End With
と
 With .Range("A29:N229").Sort(Key1:=Range("K3"),Order1:=xlDescending)
  End With
で何をやりたいのか(どうしたかったのか)わかりません。

以下について学習してみると、道が開けるかもしれません。
・Withステートメント
・(できれば、Sortメソッドについても)
(もこな2) 2018/03/10(土) 22:34


大変、申し訳ありません。並べ替えをしてABCDEFGのグループに分けることは、教えて頂き、Aグループは26行BCDEFGグループは40行にソートは出来ました。完成してから気づいたのですが、もう一つ合計のK列を降順でソートしなければならないことを忘れてしまっていました。そこで、下記のように「'連続データの生成」のところで、Aは26行BCDEFG40行の合計の降順でソートをしてみましたが、Aグループの合計の降順は上手くできましたが、BCDEFG40行のグループの合計の降順でソートは既存のコードで考えてやってみましたが、うまく行きません。どのようなコードにしたらよいかを伺いたくて質問致しました。("A29:N268")の行が40行ずつの中でソートするにはどうしたら良いかと言うことです。
("A29:N229")も間違っていました。("A29:N268")の間のことでした。すみません。

なお、
Key3:=Range("K3"), Order3:=xlAscending, _これも必要ですか、わかりません。

With .Range("A3:N28").Sort(Key1:=Range("K3"), Order1:=xlDescending)

   End With
これは、思う結果になりましたが、これも変な気がしています。

With .Range("A29:N229").Sort(Key1:=Range("K3"),Order1:=xlDescending)

  End With
これは、思う結果になりませんでしたので、どのようにしたらよいかわからなくなっています。26以降の全てのK列の降順のソートになってしまっていて、40行ずつの区切りでソートができません。

'並び替えの実行

        .Sort _
            Key1:=Range("B3"), Order1:=xlAscending, _
            Key2:=Range("D3"), Order2:=xlAscending, _
     Key3:=Range("K3"), Order3:=xlAscending, _

↑の部分、特に

 '連続データの生成
   With .Range("A3:N28").Sort(Key1:=Range("K3"), Order1:=xlDescending)
   End With
と
 With .Range("A29:N229").Sort(Key1:=Range("K3"),Order1:=xlDescending)
  End With

(宇土会ね) 2018/03/10(土) 23:30


(1)
>並べ替えをしてABCDEFGのグループに分けることは、教えて頂き、Aグループは26行BCDEFGグループは40行にソートは出来ました
仰っていることがよくわかりません。(特に、「並べ替えをしてABCDEFGのグループに分ける」)
↓を実行するとどうなるかわかりますか?

    ActiveSheet.Rows("3:316").Sort _
        Key1:=Range("B3"), Order1:=xlAscending, _
        Key2:=Range("D3"), Order2:=xlAscending, _
        Key3:=Range("K3"), Order3:=xlAscending, _
        Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
        Orientation:=xlTopToBottom, SortMethod:=xlPinYin, _
        DataOption1:=xlSortNormal

「〇〇」を対象に、「〇〇」「〇〇」「〇〇」を条件として「〇〇」する。
↑を穴埋めしてみてください。
(もっと詳しくかける場合はそのまま書いて下さい、例:オプションとして〇〇が付いてる。など)

(2)
>これも変な気がしています。
>これは、思う結果になりませんでしたので、〜
とりあえず、コードは一旦おいておいて、
「Withステートメント 」について学習してみてください。
(もこな2) 2018/03/12(月) 12:22


(1)のことについては、266を26・40に分けて結果を以前のコードでできていることが前提で書いておりました。言葉足らずです。  
(グループのことは最初一言も言っていませんでした、すみません)

(2)のことについて、With〜End Withの間で主語(操作の対象)を省略したときは、それを明示するためにピリオドから書き始めるということです。

    言い換えると、ピリオドで始まっているオブジェクト式は、Withでくくったものが操作の対象になっているわけです。

    「ステートメント」と呼ばれる命令文の集まりということがwebサイトにありました。

 なお、次の部分は、勘違いが多くて申し訳ありません。
  ActiveSheet.Rows("3:316").Sort _

        Key1:=Range("B3"), Order1:=xlAscending, _
        Key2:=Range("D3"), Order2:=xlAscending, _
        Key3:=Range("K3"), Order3:=xlAscending, _  ←ここは、xIDescendigとするつもりでした。これでは、連番にすることになります。
また、例えxIDescendiにしてもK列に1番〜266番を対象にする指示に
なっていましたし、私の考えのなさで、結果はもとんでもない結果になって
驚きました。

        Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
        Orientation:=xlTopToBottom, SortMethod:=xlPinYin, _
        DataOption1:=xlSortNormal

「〇〇」を対象に、「〇〇」「〇〇」「〇〇」を条件として「〇〇」する。 ↑を穴埋めしてみてください。
(もっと詳しくかける場合はそのまま書いて下さい、例:オプションとして〇〇が付いてる。など)
 このことについては、現在K列にはそれぞれの人の成績合計がデータとしてあります。それで、「「K列」を対象にして」、

合計点数を元にして降順のソートをしようとしました。
「「ABCDEFG」」の7つのグループの人数が26・40に分かれたデータがありますのでそれぞれのグループこどに、AはAのグループで降順ソート、

BCDEFGのそれぞれのグループはBはBでCはCで・・・・・というように降順ソートしたいと思ってのことです。最後に、それぞれのグループごとに、

1番から順に連番の番号がついて完成にしたかったのです。
「〇〇」を対象に、「〇〇」「〇〇」「〇〇」を条件として「〇〇」する。これを埋めるとするならば、

「A列からN列のデータの中で「K列」を対象に、」「全体を26が1つと40の6つに分かれているデータを」「全体の266名分でなく、

ABCDEFGのグループごとを前提とする」ことを条件として、「降順ソートとソート後に、グループごとに1番から連番で上からA列に番号が付く」ということをする。
 しっかり、書いたつもりが、つもりでした。大変申し訳ありません。お詫びします。

(宇都会ね) 2018/03/12(月) 16:56


えっと・・・
とりあえず、(1)のほうはご自身がやりたいことやどう思って書いたかは一時忘れて下さい。理解間違えしていないかという確認をしたいんです。
(2)のほうは、そのような理解でよいとおもいますので、次はどのように修正すればよいか考えてみてください。

(1)出題です。以下を実行すると、どうなるか「」の中をうめてください。
 ・「  」を対象に、「 」「 」「 」を条件として「  」される。
 なお、(もっと詳しくかける場合はそのまま書いて下さい。例:オプションとして〇〇が付いてる。など)

    ActiveSheet.Rows("3:316").Sort _
        Key1:=Range("B3"), Order1:=xlAscending, _
        Key2:=Range("D3"), Order2:=xlAscending, _
        Key3:=Range("K3"), Order3:=xlAscending, _
        Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
        Orientation:=xlTopToBottom, SortMethod:=xlPinYin, _
        DataOption1:=xlSortNormal

(2)出題です。「」の中をうめつつ、以下のおかしいと思うところを修正してください。
    With ActiveSheet
        '「  」
        With .Range("A3:N28").Sort(Key1:=Range("K3"), Order1:=xlDescending)
        End With
    End With
(もこな2) 2018/03/12(月) 17:44

問題の回答ですが、どうでしようか。

(1)・「"3:316"」を対象に、「"B3"」「"D3"」「"K3"」を条件として「xlAscending (昇順に並び替える)」される。

(2)'「降順のデータの生成」これでしょうか。
修正は、End Withが一つ多いのかと思います。
(宇土会ね) 2018/03/12(月) 22:15


(1)
「"3:316"」とはなんですか? 
「"B3"」「"D3"」「"K3"」を条件とはどのような条件なんですか?

(2)
実際修正したものを書いてみてください。
(もこな2) 2018/03/12(月) 22:23


下記のように考えたのですが、違っていますか。

ActiveSheet.Rows("3:316").Sort _

ActiveSheet.だから、シートのRows行の("3:316")を.Sort _ソートするというのが対象ということだと思っていますが間違っていますか。

Key1:=Range("B3")  Key1・2・3の番号順番で処理がなされる

("3:316")全体  「"B3"」「"D3"」「"K3"」条件だと思いました。

全体のデータを列毎に処理する前提条件かと思いました。

 Sub Macro1の整理()
'==宣言など

    Dim i As Long
    Dim buf As String

'==処理

    With ActiveSheet.Rows("3:316")

        '並び替えの実行
        .Sort _
            Key1:=Range("K3"), Order1:=xlDescending. _
            Key2:=Range("B3"), Order2:=xlAscending, _
            Key3:=Range("D3"), Order3:=xlAscending, _
         Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
            Orientation:=xlTopToBottom, SortMethod:=xlPinYin, _
            DataOption1:=xlSortNormal

        '3行目を削除
        .Rows(1).Delete

        'ActiveSheet.UsedRange と ActiveSheet.Rows("3:316") が交わる範囲だけ値化
        With Intersect(.Parent.UsedRange, .Cells)
            .Value = .Value
        End With

    End With

    With ActiveSheet
        '降順と連続データの生成
        With .Range("A3:N28").Sort( _
        Key1:=Range("K3"), _
           Order1:=xlDescending)
        End With

        With .Range("A3")
            .Value = 1
            .AutoFill Destination:=.Resize(26), Type:=xlFillSeries
        End With

        For i = 29 To 229 Step 40
        With .Range("A29:N229").Sort( _
           Key1:=Range("K3"), _
           Order1:=xlDescending)
        End With

            With .Cells(i, "A")
                .Value = 1
                .AutoFill Destination:=.Resize(40), Type:=xlFillSeries
            End With
        Next i

         buf = .Range(.Cells(2, "A"), .Cells(.Rows.Count, "A").End(xlUp)).Address(0, 0)
        .Range("M1").Formula = "=COUNT(" & buf & ")"
    End With
End Sub

(宇土会ね) 2018/03/12(月) 22:47


う〜ん
(1)
Rows行の("3:316")ってなんだろう・・・・
一応、期待してた答えは
「アクティブシートの3〜316行目全体」を対象に「第一優先:B列、昇順」「第二優先:D列、昇順」「第三優先:K列、昇順」を条件として「並び変え」する。
オプションとして以下の条件がついている
・先頭行がタイトル行か自動判定
・ユーザー設定の並べ替え順のリスト1番目を使用
・大文字・小文字を区別しない
・行方向に並び替え
・並び替えにふりがなを使う
・数値データとテキスト データを別々に並び替える

↑でしたが、、、
一度、Sortメソッドについて調べなおしてみてはいかがでしょうか?


(2)は
「」の中をうめつつ、以下のおかしいと思うところを修正してください。
    With ActiveSheet
        '「  」
        With .Range("A3:N28").Sort(Key1:=Range("K3"), Order1:=xlDescending)
        End With
    End With

これ↑をなおすと、本当にそれになりますか?ファイナルアンサー?
(もこな2) 2018/03/13(火) 00:16


ご面倒おかけしています。(1)については、よくわかりました。その通りだとわかりました。

(2)は、前回の回答以外に考えられないのですが、違うのですね。大変申し訳ない気持ち

です。 ('降順と連続データの生成)

「」の中をうめつつ、以下のおかしいと思うところを修正してください。

    With ActiveSheet
        '「  」
        With .Range("A3:N28").Sort(Key1:=Range("K3"), Order1:=xlDescending)
        End With
    End With

'並び替えの実行

        .Sort _
            Key1:=Range("B3"), Order1:=xlAscending, _
            Key2:=Range("K3"), Order2:=xlAscending, _
            Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
            Orientation:=xlTopToBottom, SortMethod:=xlPinYin, _
            DataOption1:=xlSortNormal

 (宇土会ね) 2018/03/12(月) 22:47

上記のことについては、回答した通りで28のグループだけですが、結果としては、思う通

りの結果になります。あくまでも、28のグループだけのことですが、End Withをとらない

でやったら、Range("A3")のところがエラーになってしまいます。とってやると、できるの

です。また、(宇土会ね) 2018/03/12(月) 22:47の「並べ替え実行」のところをのKey1・

2を上記のように変更したらできました。(あくまで、28のグループのみですが)

(宇都会ね) 2018/03/13(火) 12:47


私の問題の出し方がわるいのかなぁ・・・・

問題3
(1)Sortメソッド、Withステートメントについてネット検索でしらべてみてください。
    (調べていただければ良いと思うので、回答不要です)
(2)やりたいことは一旦忘れて、下記の「問題3」というプロシージャは何をする
   コードなのか考えて答えてみてください。
   (ヒント:Sortメソッドは何をさせる命令でしょうか)
(3)やりたいことは一旦忘れて、下記の「問題3」というプロシージャのコードで
   不自然(不要な操作)をしているところがあれば修正して答えてみてください。
   (ヒント1:エラーには、ならないかもしれませんが、意味の無いことを
         している箇所がないか見てみましょう)
   (ヒント2:Withステートメントは何をするものだったか思い出して
         みましょう)

    Sub 問題3()
        With ActiveSheet
            'Sortメソッドの実行
            With .Range("A3:N28").Sort(Key1:=Range("K3"), Order1:=xlDescending)
            End With
        End With
    End Sub

これでもわからないとなると、もう私の説明能力ではうまくお伝えすることは無理です・・・・
(もこな2) 2018/03/13(火) 13:37


webサイトの例です。
Sub Sample1()
    ''C列を基準に昇順で並べ替えます
    Range("A1:C10").Sort Key1:=Range("C2"), Order1:=xlAscending, Header:=xlYes
End Sub

問題3の回答です。どうでしようか?

With .Range("A3:N28").Sort(Key1:=Range("K3"), Order1:=xlDescending)

With .Range("3:28").Sort(Key1:=Range("K3"), Order1:=xlDescending)

xlTopToBottom 既定値。行方向の並べ替えを規定していること

With ActiveSheet.Rows("3:316") との関連

With ActiveSheetの対応     End With

                 End Sub
(宇都会ね) 2018/03/13(火) 15:41

2018/03/13(火) 15:41 に投稿された内容はどれに対するものでしょうか・・・
私が、2018/03/13(火) 13:37に投稿した「問題3」は(1)〜(3)まであったかと思います。

とりあえず、(1)のことであれば、調べていただければ良いと思いますので、どのように調べたのか、どのようにサイトに載っていたか等の報告は不要です。
※〇〇〇のように載っていたけど意味がよく理解できなかったということであれば、そのような聞き方をなさってください。

(2)のことであれば、回答欄が無かったのがよくないですね。
改めて、

(2)カギ括弧内を埋めてください。
「  」シートの「  」のセル範囲を対象に「  」という条件で「  」が実行される。

(3)であれば、Sub 〜 End Sub までを見て、思うように修正してそのまま(Sub〜End Sub まで)回答してみてください。
  ※直す部分がなければ、直す部分無しと回答してくださって結構です。

    Sub 問題3()
        With ActiveSheet
            'Sortメソッドの実行
            With .Range("A3:N28").Sort(Key1:=Range("K3"), Order1:=xlDescending)
            End With
        End With
    End Sub

(もこな2) 2018/03/13(火) 18:57


(2)の回答ですが、どうでしょうか。

(2)カギ括弧内を埋めてください。

「アクティブ」シートの「A3〜N28全体」のセル範囲を対象に「第一優先:K列、降順」とい

う条件で「並べ替え」が実行される。

(3)の回答ですが、どうでしょうか。

Sub 問題3()

'==宣言など

    Dim i As Long
    Dim buf As String

'==処理

    With ActiveSheet.Rows("3:28")

    'Sortメソッドの実行
        .Sort _
             Key1:=Range("K3"), Order1:=xlDescending, _
             Header:=xlGuess, OrderCustom:=1, MatchCase:=False, _
             Orientation:=xlTopToBottom, SortMethod:=xlPinYin, _
             DataOption1:=xlSortNormal

      End With

End Sub

(宇都会ね) 2018/03/14(水) 13:14


(2)は、間違いではないですが、
「A3〜N28全体」のセル範囲 とおっしゃるのでああれば、その”全体”に対する”一部”とはなんですか?
ただ、この話を詰めていっても日本語の解釈の話であって、質問とは逸れると思うので深掘りはしません。(返答不要です)
一応、私の場合は、「3〜28行目」”全体”のうち、「A〜N列」に該当するセル範囲は「A3:N28」です。という意味で「全体」という言葉を使っています。

(3)は半分不正解です。
 意味の無い Withステートメントを外したという面ではOKだとおもいますが、それを実行すると、行全体を対象にしてるわけですから、たとえば、O列やZ列など、関係無い列まで並び替えに巻き込まれるでしょう。
また、以下の引数は省略可能ですし、指定の値は規定値なので、わざわざ記述する必要性が薄いとおもいます。(あえてわかるように記述するという方針であれば、それはそれでアリだとはおもいますが・・)
Header:=xlGuess、MatchCase:=False、Orientation:=xlTopToBottom、SortMethod:=xlPinYin、DataOption1:=xlSortNormal
 また、出題ではユーザー設定リスト使うとはしていないので、OrderCustom:=1 の記述は正しくないんじゃないでしょうか?
 よって(3)の回答を拝見すると、もう一度Sortメソッドについて調べてみたほうが良いかと思います。
※私もSortメソッド関係はほどほどにしか解ってないので、説明サイトで確認したり、他の回答者さんの意見も聞いてみてください。

最後に
・(3)について、もし私が記述するとしたらこんな感じにすると思います。

  Sub 問題3()
     '並び替え
     ActiveSheet.Range("A3:N28").Sort Key1:=Range("K3"), Order1:=xlDescending
  End Sub

・度々、Sortメソッド(並び替えの命令)の直ぐ上に、「降順のデータの生成」という趣旨のコメントを入れているのが気になります。
 もうおわかりになったともいますが、Sortメソッドは並び替えをしてるだけで、データを作っているわけではありません。

以上。
(もこな2) 2018/03/14(水) 16:15


大変、勉強になりました。色々な勉強して、自分なりの追求をして行きながら、ゆっくり

かもしれないですが、努力します。誠に有難うございました。また、教えて頂ければと

思っております、申し訳ありません。

(宇土会ね) 2018/03/14(水) 22:42


コメント返信:

[ 一覧(最新更新順) ]


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