ExcelVBAに関する質問です。(カテ違いで質問したためこちらで再度質問します)
部課ごとに研修管理表.xlsx(共有)を作成しています。
A列:№
B列:研修内容
C列:備考欄
D列~AD列:氏名
9行目~100行目あたりまで、B列に研修内容が記載されています。
D~AD列に書かれた個人が、研修を受けたいセルに自分で○印をつけます。
(氏名の記載は、D8~AD8にあります。 ※ADを超える場合も想定しています。)
D9~AD100に○印が入力されている行のみ残し、入力されていない行を削除したく、
色々調べて以下のようなコードをみつけたので修正したうえで記述してみました。
実行結果は、○印のある行を抽出することはできましたが、○印のない行を削除できません。
○印の開始はD9ですが、最終はAD列以降になる可能性もあります。(人が増えたら)
また、研修内容も100行以降増えないと思いますが、増えてもいいようにしたいです。
VBAに精通しているかた、どうぞよろしくお願いします。
Sub sample()
Dim a As Range
Dim r As Range
Dim c As Range
Dim f As Range
Set a = Range("D9:AD100")
Set c = a.Find(what:="○", lookat:=xlWhole)
If c Is Nothing Then
MsgBox "処理すべきものがありません"
Exit Sub
End If
Set f = c
Do
If r Is Nothing Then
Set r = c.EntireRow
Else
Set r = Union(r, c.EntireRow)
End If
Set c = a.FindNext(c)
Loop While c.Address <> f.Address
MsgBox "以下の行を残して他の行を削除します" _
& vbLf & Join(Split(r.Address, ","), vbLf)
r.Delete
End Sub
No.1
- 回答日時:
for分でいいんじゃないですか?
ちなみに、for分で削除するときは「下から上へ」です。
for分の終了条件を変数か定数にしとけば、とりあえずOK。
どの程度理解できました?
No.2ベストアンサー
- 回答日時:
こんな感じでしょうか。
Sub sample()
Dim I As Long
For I = Cells(Rows.Count, "A").End(xlUp).Row To 9 Step -1
If WorksheetFunction.CountIf(Range(Cells(I, "D"), Cells(I, Columns.Count)), "○") = 0 Then
Rows(I).Delete Shift:=xlUp
End If
Next
End Sub
No.3
- 回答日時:
こんばんは!
行すべてを削除しても良いのですね?
一例です。
Sub Sample1()
Dim i As Long, lastCol As Long
Dim c As Range, myRng As Range, myArea As Range
lastCol = Cells(8, Columns.Count).End(xlToLeft).Column '←8行目で最終列取得//
For i = 9 To Cells(Rows.Count, "A").End(xlUp).Row '←9行目~A列最終行まで//
Set myRng = Range(Cells(i, "D"), Cells(i, "AD"))
Set c = myRng.Find(what:="○", LookIn:=xlValues, lookat:=xlWhole)
If c Is Nothing Then
If myArea Is Nothing Then
Set myArea = myRng
Else
Set myArea = Union(myArea, myRng)
End If
End If
Next i
If Not myArea Is Nothing Then
myArea.EntireRow.Delete shift:=xlUp
End If
End Sub
※ 質問文にあるコードは「FindNext」を使っていらっしゃいますが、
上記コードは行ごとに検索し、その行にあるか?ないか?だけの判断にしています。m(_ _)m
No.4
- 回答日時:
No.3です。
投稿後気づきました。
コード内の
>Set myRng = Range(Cells(i, "D"), Cells(i, "AD"))
の行を
>Set myRng = Range(Cells(i, "D"), Cells(i, lastCol))
に変更してください。
前回のコードではAD列までの範囲になってしまいます。
どうも失礼しました。m(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) エクセルVBAのコードで質問です。 下のコードはJ16の文字列をB3を起点とする範囲から探して、見つ 5 2023/04/07 11:07
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Excel(エクセル) 指定文字列が該当するA列をアクティブセルにするには 3 2022/08/17 13:18
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Excel(エクセル) マクロで行を追加、削除すると行位置がずれますが、解決方法はありませんか?。 5 2022/05/28 16:03
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELにて複数列を同条件(色)...
-
行数が不規則な一週間ごとの合...
-
シート保護の状態で行の追加を...
-
エクセルの関数について(日付で...
-
エクセルで行挿入した際、自動...
-
【初歩】エクセルでのマクロ(...
-
[Excel VBA]空白セル以外に連番...
-
エクセルでマクロを実行し、最...
-
エクセルで空白以外のセルの値...
-
エクセルVBA 複数列をコピーす...
-
エクセル VBA 指定の範囲内をコ...
-
エクセル マクロ 貼り付け先が...
-
エクセルで縦に長い表を印刷
-
特定の桁数を抽出
-
エクセルのマクロ、AVERAGEIFを...
-
Excelの非表示列も含めてコピー
-
一行おきにコピーするマクロが...
-
エクセルで反転コピー
-
EXCELマクロ 最下行のセルの数...
-
A1セルに入力したら、入力時間...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELにて複数列を同条件(色)...
-
一行おきにコピーするマクロが...
-
エクセルで行挿入した際、自動...
-
行数が不規則な一週間ごとの合...
-
Excelの非表示列も含めてコピー
-
エクセル マクロ 貼り付け先が...
-
シート保護の状態で行の追加を...
-
エクセルで表示された値だけ行...
-
エクセルで空白以外のセルの値...
-
エクセル VBA 指定の範囲内をコ...
-
エクセルの関数について(日付で...
-
[Excel VBA]空白セル以外に連番...
-
エクセルで反転コピー
-
【初歩】エクセルでのマクロ(...
-
エクセルで縦に長い表を印刷
-
エクセルVBA 複数列をコピーす...
-
マクロで値がある列までコピー
-
Excel VBAで日にちを入力して線...
-
《エクセル2000》A列・B列の和...
-
マクロ ScrollColumn について
おすすめ情報