Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2010 / 13645 ツリー ←次へ | 前へ→

【70516】削除 next 11/11/23(水) 13:24 質問[未読]
【70517】Re:削除 Abyss 11/11/23(水) 15:47 発言[未読]
【70518】Re:削除 Blue 11/11/23(水) 16:09 回答[未読]
【70523】Re:削除 UO3 11/11/24(木) 15:26 発言[未読]

【70516】削除
質問  next  - 11/11/23(水) 13:24 -

引用なし
パスワード
   Private sub 特定文字なら行削除()
Dim nn As Range
Dim bb As Variant
Application.ScreenUpdating = False
 For Each nn In ActiveSheet.UsedRange
  For Each bb In Array("名称", "工事番号", "小計")
   If nn.Value = bb Then
     nn.EntireRow.Delete
   End If
  Next bb
 Next nn
Application.ScreenUpdating = True
MsgBox "完了"
End Sub

名称、工事番号、小計が含まれる行を削除したいのですがエラーがでます。
理由がわかりまんせん。
if nn.value=bb then
ここが悪いみないなのですが。

【70517】Re:削除
発言  Abyss  - 11/11/23(水) 15:47 -

引用なし
パスワード
   >  nn.EntireRow.Delete

Forループで監視しているセル構成が変化しているから。

【70518】Re:削除
回答  Blue  - 11/11/23(水) 16:09 -

引用なし
パスワード
   たぶん、
>nn.EntireRow.Delete
が悪い。

外のFor Eachの範囲が行を削除したことで変わってしまうため。
(ループの中でループ元を変更するとおかしくなる)

以下適当に変更。

Private Sub 特定文字なら行削除()
Dim nn As Range
Dim bb As Variant
Dim r As New Collection

Application.ScreenUpdating = False
 For Each nn In ActiveSheet.UsedRange
  For Each bb In Array("名称", "工事番号", "小計")
   If nn.Value = bb Then
    On Error Resume Next
     r.Add nn, Str(nn.Row)
    On Error GoTo 0
   End If
  Next bb
 Next nn
 
For Each nn In r
 nn.EntireRow.Delete
Next
 
Application.ScreenUpdating = True
MsgBox "完了"
End Sub

【70523】Re:削除
発言  UO3  - 11/11/24(木) 15:26 -

引用なし
パスワード
   ▼next さん:

こんにちは

既に皆さんからコメントがありますが、行を削除する場合は
【下から攻める】が定番です。

ところで、不要な行を削除するという方式ではなく【必要な行を残す】という発想で。
ループ回数も若干少なくなっています。

Sub Sample()
  Dim k As Long
  Dim x1 As Variant
  Dim x2 As Variant
  Dim x3 As Variant
  Dim myA As Range
  Dim myR As Range
  Dim v As Variant
  
  With ActiveSheet.UsedRange
    Set myA = Range("A1", .Cells(.Cells.Count))
  End With
  
  ReDim v(1 To myA.Rows.Count)
  For Each myR In myA.Rows
    x1 = Application.Match("名称", myR, 0)
    x2 = Application.Match("工事番号", myR, 0)
    x3 = Application.Match("小計", myR, 0)
    If Not IsNumeric(x1) And Not IsNumeric(x2) And Not IsNumeric(x3) Then
      k = k + 1
      v(k) = WorksheetFunction.Index(myR, 1, 0)
    End If
  Next
  
  ReDim Preserve v(1 To k)
  Cells.ClearContents
  Range("A1").Resize(k, myA.Columns.Count).Value = _
    WorksheetFunction.Transpose(WorksheetFunction.Transpose(v))
  Set myA = Nothing
  
  MsgBox "完了"
  
End Sub

2010 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free