[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロコードをまとめたい』(宇土会な)
下記のコードを作りました。これを重複などが多いので、まとめたいのですがどのようにしたらよいでしょうか。教えて頂けませんか。また、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
1.「初めての方へ」をクリック
2.(e) [既存の書き込みに書き込む]機能のなかの「こちらから → 直接編集用ページ」のリンクをクリック
3.注意書きをみればわかると思いますが、2重の角括弧で記事番号を囲ったものを入力して「編集」をクリック
で編集可能です。
機能的には、ご自身以外が投稿された内容も編集できますが、他の方が書き込んだ内容を勝手に編集するのはマナーとしてどうかとおもいますので、ご自身以外の投稿を修正するには、投稿された方に編集してよいか確認した方がよいとおもいます。
そういった意味では、今回は、この文章を含め、私の発言を一部修正しないと辻褄が合わなくなるので、併せて編集してくださって結構です。
↑記事編集の話ここまで。
(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
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
全セルを値に変換
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
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
また、
'連続データの生成 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
なお、
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
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
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
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
(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
↑でしたが、、、
一度、Sortメソッドについて調べなおしてみてはいかがでしょうか?
With ActiveSheet '「 」 With .Range("A3:N28").Sort(Key1:=Range("K3"), Order1:=xlDescending) End With End With
これ↑をなおすと、本当にそれになりますか?ファイナルアンサー?
(もこな2) 2018/03/13(火) 00:16
(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
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
とりあえず、(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)カギ括弧内を埋めてください。
「アクティブ」シートの「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
(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.