No.3ベストアンサー
- 回答日時:
こんにちは
>マクロの実行に時間がかかってしまったので、
>効率の良いコードがあれば教えてほしい。
No1様の回答に1票です。
マクロは所詮マクロなので、エクセルの内部計算の方が速いです。
どうしてもマクロで処理したくて、かつ速度を向上したいのであれば・・
検索すれば、画面更新を止めるなどの方法がすぐに見つかると思います。
上記でもそれなりの効果はありますが、マクロで時間がかかるのはシートへのアクセス(=読み・書き)です。
これを減らすロジックにすれば、速度は向上します。
現状がどのような計算を行っているのか不明ですけれど・・
もしも、1セルずつ処理するような方法を取っているのなら、セル範囲でまとめて処理する方法にすることで格段に速度は向上します。
ひとつの例として、データをまとめて読んで、メモリ内で計算し、結果をまとめて返す(=記入する)などが考えられます。
ただし、メモリを必要としますので、データ量が多いような場合には、ある程度に区切って処理するなどの工夫が必要かも知れません。
No.2
- 回答日時:
Sub CheckAndCopyData()
Dim wsData As Worksheet
Dim wsFiltered As Worksheet
Dim lastRow As Long
Dim i As Long
Dim age As String
Dim gender As String
Dim ageGroup As String
Dim ageColumn As Range
Dim genderColumn As Range
Dim ageGroupColumn As Range
Dim targetRow As Long
' シートの設定
Set wsData = ThisWorkbook.Sheets("Sheet1") ' データがあるシート名を適宜変更
Set wsFiltered = ThisWorkbook.Sheets.Add ' 結果をコピーするシートを新規作成
' ヘッダー行から必要な列のインデックスを取得
Set ageColumn = wsData.Rows(1).Find("年齢", LookIn:=xlValues, LookAt:=xlWhole)
Set genderColumn = wsData.Rows(1).Find("性別", LookIn:=xlValues, LookAt:=xlWhole)
Set ageGroupColumn = wsData.Rows(1).Find("年代別区分", LookIn:=xlValues, LookAt:=xlWhole)
If ageColumn Is Nothing Or genderColumn Is Nothing Or ageGroupColumn Is Nothing Then
MsgBox "必要な列が見つかりません。", vbExclamation
Exit Sub
End If
' 最終行を取得
lastRow = wsData.Cells(wsData.Rows.Count, ageColumn.Column).End(xlUp).Row
' データのチェックとコピー
targetRow = 1 ' コピー先シートの最初の行
For i = 2 To lastRow ' 2から始める(1行目はヘッダー)
age = Trim(wsData.Cells(i, ageColumn.Column).Value)
gender = Trim(wsData.Cells(i, genderColumn.Column).Value)
ageGroup = Trim(wsData.Cells(i, ageGroupColumn.Column).Value)
' 必須項目のチェック
If age = "" Or gender = "" Or ageGroup = "" Then
' 必須項目が空白の場合は網掛けしてコピー
wsData.Rows(i).Interior.Color = RGB(255, 255, 0) ' 黄色で網掛け
' データをコピー
wsData.Rows(i).Copy wsFiltered.Rows(targetRow)
targetRow = targetRow + 1
End If
Next i
' 結果シートの整形
wsFiltered.Columns.AutoFit
' メッセージボックスで終了を通知
MsgBox "処理が完了しました。", vbInformation
End Sub
No.1
- 回答日時:
関数で処理できるような内容だと思います。
> ・…、スペースであれば網掛けを行う。
> ・網掛けをした行のみ別シートにコピペする。
この場合は、単に、
スペースがあれば、その行全体を抽出する、
でよいはず。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 2つのシートの任意のセルの番号が一致したら、一致した行をコピーする VBA 2 2023/06/19 20:48
- Visual Basic(VBA) VBAで、1つのエクセルで、2つのシートからもう1つのシートに条件のある転記コードを教えてください。 1 2023/03/16 18:07
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) エクセルVBAで『A列』に新規で数値を入力し『B列』から右方向の空白セルにその値を貼り付ける方法 4 2022/11/05 08:37
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて RemoveDuplicatesを使 3 2023/02/28 01:13
- Visual Basic(VBA) Excel vbaについて知恵もしくは、コード教えて下さいm(__)m ① 表にあるデータをコピー、 2 2022/09/01 23:57
- Visual Basic(VBA) Excel VBA 文字列のセルを反映させたいです 2 2024/02/24 00:06
- Visual Basic(VBA) エクセルについて教えてください。 3 2023/06/28 09:11
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
再質問です。マクロの修正箇所を教えてください。
Excel(エクセル)
-
数字入力後他の文字等が表示される方法について
Excel(エクセル)
-
2列に入っているデータを1列で表示する関数について
Excel(エクセル)
-
-
4
【関数】スペースがいくつ入った後の文字列を取り出したい
Excel(エクセル)
-
5
エクセルで上位バイトのセルと下位バイトのセルを1つのセルにして16進数を作る方法
Excel(エクセル)
-
6
Excelで、10000,20000,30000と表示されているのですが、時々10000,20000
Excel(エクセル)
-
7
Excelにて数式を使用して 工数計算をしたいのですが、 計算方法が分からないので教えて下さい。 1
Excel(エクセル)
-
8
Excelにてある膨大なデータを管理しています。 そこで、特定の市町村にのみ色を付けたいです。 Ex
Excel(エクセル)
-
9
Excelについて教えてください
Excel(エクセル)
-
10
VBAについての質問です
Excel(エクセル)
-
11
エクセルでバーコード作成し使用しているんですが、違うパソコンで同じエクセルファイルを使用したらバーコ
Excel(エクセル)
-
12
職場の人から聞かれており、こんなことができるか教えて下さい。 vbaとかはできません。。 下記リスト
Excel(エクセル)
-
13
エクセルをエクセレントに究める
Excel(エクセル)
-
14
【ExcelVBA】名前を付けて保存→PDF保存をマクロで実行できますか?
Excel(エクセル)
-
15
下記マクロでMsgBox 空白です。"の部分の メッセージボックスは現れるものの 空白です。の文字"
Excel(エクセル)
-
16
エクセルのクイックアクセスツールバーには何を登録したら良いですか?罫線を引く「格子・枠なし・外枠」と
Excel(エクセル)
-
17
Excelの表示についての質問
Excel(エクセル)
-
18
自動入力で今月はMONTH(TODAY())で良いのですが、翌月はどのようにすれば良いでしょうか。
Excel(エクセル)
-
19
西暦や和暦の表示をyyyymmdd表示へ変更をしたい
Excel(エクセル)
-
20
時間によってファイル名が変わるエクセルをほかのエクセルでデータを参照する方法
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelのVlookup関数の制限について
-
VBAで繰り返しコピーしながら下...
-
エクセルの保護で、列の表示や...
-
文字の色も参照 VLOOKUP
-
Excel の複数シートの列幅を同...
-
Excelでの並べ替えを全シートま...
-
エクセル複数シートのデータを...
-
エクセルVBAで、ある文字を含ん...
-
エクセル マクロ 標準モジュー...
-
【エクセル】1列のデータを交...
-
エクセルで、チェックボックス...
-
エクセルVBA 行追加時に自...
-
データチェックを行うエクセル...
-
Excelに自動で行の増減をしたい...
-
VBAで検索して、行をコピー&追...
-
ある数値に対して、値を返す数...
-
エクセルのブック分割マクロを...
-
【条件付き書式】countifsで複...
-
Excel VBA ピボットテーブルに...
-
SUMPRODUCTにて別シートのデー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字の色も参照 VLOOKUP
-
ExcelのVlookup関数の制限について
-
エクセルの保護で、列の表示や...
-
VBAで繰り返しコピーしながら下...
-
Excel の複数シートの列幅を同...
-
Excel複数シートにあるデータを...
-
エクセルの列の限界は255列以上...
-
【条件付き書式】countifsで複...
-
エクセル マクロ 標準モジュー...
-
Excelでの並べ替えを全シートま...
-
SUMPRODUCTにて別シートのデー...
-
エクセルで、チェックボックス...
-
スプレッドシートでindexとIMPO...
-
VLOOKアップ関数の結果の...
-
Excel VBA ピボットテーブルに...
-
エクセルで横並びの複数データ...
-
Excelに自動で行の増減をしたい...
-
【VBA】ピボットテーブルを既存...
-
【VBA】複数のシートの指定した...
-
オートフィルタ使用時にCOUNTIF...
おすすめ情報
毎年同じ作業をするので、マクロにチャレンジしたいと思っています。
参考までに自分が作成してみたマクロを貼っていますのでアドバイスをいただければ…
10行×50列でマクロを作成し動作確認したうえで、本データにて実行してみましたが、”1行目がスペースまで作業をしている?”のか時間がかかり強制終了し、一度も作業が完了していません。
Sub 過不足チェック()
'定義
Dim ws As Worksheet
Dim cell As Range
Dim lastRow As Integer
Dim lastCol As Integer
' シート名は適宜変更
Set ws = ThisWorkbook.Sheets("Sheet1")
つづく
' 範囲指定(最終行、列まで)
lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row '1列目の最終行をカウント
lastCol = ws.Cells(2, Columns.Count).End(xlToLeft).Column '2行目の最終列をカウント
For Each cell In ws.Range(Cells(3, 3), Cells(lastRow, rng))
'未検査項目チェック(必須項目漏れに黄色を設定)
' A列(年齢)<30 かつ 1行目(年代別検査項目)=20 または
' A列(年齢)>=30 <40 かつ 1行目(年代別検査項目)<=30 のセルが
'空白以外なら…
つづく