
このサイトでいただいた回答を利用し、また、マクロの記録を使って切り貼りして何とかやりたいことができるようになったマクロですが、記述に無駄があると思います。どのように書きかえるともっとスマートになるでしょうか。
作ったのは、190数名の数学と英語の点数を入力し、オートフィルタを使ってまず、数学の100点満点を取ったものを抽出します。そのリストをコピーし、隣のシートにコピーします。次に同じく数学ですが、60点未満のものを抽出し、それをコピーし、隣のシートのさっきコピーした隣にコピーします。それからオートフィルタを解除して、同じことを英語にも行います。最後に4つの表が並んだシートの不要な列を削除し、タイトルをつけ、列幅を調節し、オートフィルタを解除して終了します。
以下にマクロの記述をコピーします。まだなステイトメントばかりだと思いますので、アドバイスお願いいたします。
Sub 条件生徒抽出シンプル版new()
Dim wS As Worksheet
Set wS = Worksheets("Sheet2")
wS.Cells.Clear
With Range("A1").CurrentRegion
.AutoFilter field:=5, Criteria1:=100 '数学の満点者を抽出
.Copy wS.Range("A1") '上のリストをコピー
.AutoFilter field:=5, Criteria1:="<60" '数学の不合格者を抽出
.Copy wS.Range("h1") '上のリストをコピー
Selection.AutoFilter '元データリストのオートフィルタを解除
.AutoFilter field:=6, Criteria1:=100 '英語の満点者を抽出
.Copy wS.Range("o1") '上のリストをコピー
.AutoFilter field:=6, Criteria1:="<60" '英語の不合格者を抽出
.Copy wS.Range("v1") '上のリストをコピー
End With
Sheets("Sheet2").Select
Range("A:A,F:F,H:H,M:M,O:O,S:S,V:V,Z:Z").Select
Selection.Delete 'コピーした表の不要な列を削除
Rows("1:1").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 'タイトル行を追加
Range("A1").Select
ActiveCell.FormulaR1C1 = "数学満点者"
Range("F1").Select
ActiveCell.FormulaR1C1 = "数学不合格者"
Range("K1").Select
ActiveCell.FormulaR1C1 = "英語満点者"
Range("P1").Select
ActiveCell.FormulaR1C1 = "英語不合格者"
Rows("2:2").Select
Selection.HorizontalAlignment = xlCenter '追加したタイトルをセンタリング
Columns("A:A").ColumnWidth = 4.63 '各列の幅を変更
Columns("C:C").ColumnWidth = 12
Columns("C:C").ColumnWidth = 12.75
Columns("D:D").ColumnWidth = 6.38
Columns("F:F").ColumnWidth = 4.63
Columns("H:H").ColumnWidth = 12.75
Columns("I:I").ColumnWidth = 6.38
Columns("K:K").ColumnWidth = 4.63
Columns("M:M").ColumnWidth = 12.75
Columns("N:N").ColumnWidth = 6.38
Columns("P:P").ColumnWidth = 4.63
Columns("R:R").ColumnWidth = 12.75
Columns("S:S").ColumnWidth = 6.38
Sheets("今週の点数").Select
Selection.AutoFilter 'オートフィルタを解除
End Sub
No.3ベストアンサー
- 回答日時:
Sheet2にデータをコピー、列削除後に、わざわざ1行下に落とすなら、最初から2行目にコピーしたほうがよいような気が。
>Range("A1").Select
>ActiveCell.FormulaR1C1 = "数学満点者"
これについては#1さんのご指摘通り。無駄なSelectはしない、という以下記事を。
http://officetanaka.net/excel/vba/speed/s2.htm
最後の列幅変更は同じものをまとめるといいのでは。
私は、列番号で、For Next で回し、列番号のSelect Case で処理することが多いです。
(列削除も同じ形にしています。行削除も列削除もケツからが鉄則なので、ループカウンタは逆回しです。)
いちおう以下ご参照ください。
※私のテスト時には、あなたのコードで処理したものと、全く同じものができました。
トライ時はバックアップのうえお願いします。
********************************************************************************
Sub Test条件生徒抽出シンプル版new()
Dim wS1 As Worksheet, ws3 As Worksheet
Dim i As Integer, j As Double
Set wS1 = Worksheets("今週の点数")
Set ws3 = Worksheets("Sheet3")
Application.ScreenUpdating = False
ws3.Cells.Clear
wS1.Select
With wS1.Range("A1").CurrentRegion
.AutoFilter field:=5, Criteria1:=100
.Copy ws3.Range("A2")
.AutoFilter field:=5, Criteria1:="<60"
.Copy ws3.Range("h2")
ActiveSheet.AutoFilterMode = False
.AutoFilter field:=6, Criteria1:=100
.Copy ws3.Range("o2")
.AutoFilter field:=6, Criteria1:="<60"
.Copy ws3.Range("v2")
End With
ws3.Select
For i = 28 To 1 Step -1
Select Case i
Case 1, 6, 8, 13, 15, 19, 22, 26
Columns(i).Delete
End Select
Next i
Range("A1").Value = "数学満点者"
Range("F1").Value = "数学不合格者"
Range("K1").Value = "英語満点者"
Range("P1").Value = "英語不合格者"
Rows(2).HorizontalAlignment = xlCenter
For i = 1 To 21
Select Case i
Case 1, 6, 11, 16
j = 4.63
Case 3, 8, 13, 18
j = 12.75
Case 4, 9, 14, 19
j = 6.38
Case Else
j = Columns(i).ColumnWidth
End Select
Columns(i).ColumnWidth = j
Next i
wS1.Select
ActiveSheet.AutoFilterMode = False
Application.ScreenUpdating = True
Set wS1 = Nothing
Set ws3 = Nothing
End Sub
大変詳しく教えていただきありがとうございました。select caseステイトメントというもの学ぶことができました。また、画面がちらつく動作を消すことや、最後にオブジェクトのリンクを解除することなど、基本を覚えることができました。
本当にありがとうございます。
No.2
- 回答日時:
ColumnWidthもか。
C列への定義がダブリ。
同じ列幅はまとめられませんか?
Range("A:A,F:F,K:K,P:P).ColumnWidth = 4.63
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) ExcelVBAについて。 2 2022/12/10 20:08
- Excel(エクセル) excelVBAについて。 8 2022/12/11 13:47
- Visual Basic(VBA) excelVBAについて。 4 2022/11/21 16:15
- Visual Basic(VBA) excelVBAについて。 1 2022/11/30 06:16
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) データのある範囲を選択するVBAについて 2 2022/09/03 00:20
- Visual Basic(VBA) エクセルのマクロで 1 2022/04/09 06:44
- Visual Basic(VBA) excelVBAについて。 5 2022/11/27 18:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
一つのシートの中に複数のペー...
-
WEB上の表の列コピー選択方法は?
-
エクセルで作成した縦に長い表...
-
西暦から和暦への生年月日の変...
-
マクロの記述をもっとシンプル...
-
エクセルで名簿作成中、名前順...
-
ピボットテーブル→参照が正しく...
-
エクセルの関数の使い方 繰越...
-
エクセルに詳しい方、助けてく...
-
Excelピボットテーブルで 総計...
-
Excel でハイパーリンクも一緒...
-
エクセルのリストから欠番を拾...
-
メモ帳からエクセルに貼り付け...
-
エクセルが表示されなくなった
-
◆エクセルで行単位で重複検索し...
-
【エクセル】行挿入で数式もい...
-
PDFからExcelに変換する時に「...
-
Excelでセル参照したとき、書式...
-
勤続年数の平均を求めたい時の関数
-
エクセルの色も=イコールでき...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
一つのシートの中に複数のペー...
-
WEB上の表の列コピー選択方法は?
-
エクセルで作成した縦に長い表...
-
【エクセル】行挿入で数式もい...
-
Excelピボットテーブルで 総計...
-
メモ帳からエクセルに貼り付け...
-
オートフィルタのリストを順番...
-
Excelの数式のコピーで列移動で...
-
ピボットテーブル→参照が正しく...
-
Excel 表から値をさがして隣の...
-
エクセルVBAで、行コピーを複数...
-
エクセルの関数の使い方 繰越...
-
エクセルの列幅
-
エクセルのリストから欠番を拾...
-
エクセルで各ページに同じ文書...
-
ACCESSのデータをEXCELに貼り付...
-
◆エクセルで行単位で重複検索し...
-
VBA csvを100万行ずつ各...
-
Excelで検索結果をテキストボッ...
-
エクセル シートのコピーをリ...
おすすめ情報