dポイントプレゼントキャンペーン実施中!

現在仕事でVBAと悪戦苦闘しています。
下記のマクロを実行すると、実行時エラー'13':型が一致しません。
と表示されます。
初心者で対処法がわかりません。
よろしくお願いします。
Sub Macro1()
dat = InputBox("検索値")
Range("A1").Activate
Cells.Find(What:=dat, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, MatchByte:=False, SearchFormat:=False).Activate
gegyo = ActiveCell
Do
Cells.FindNext(After:=ActiveCell).Activate
If dat = ActiveCell Then
If gegyo = ActiveCell.Row Then End
Rows(ActiveCell.Row - 1 & ":" & ActiveCell.Row - 1).Delete Shift:=xlUp
Range("A" & ActiveCell.Row - 1).Activate
Rows(ActiveCell.Row + 1 & ":" & ActiveCell.Row + 1).Delete Shift:=xlUp
Rows(ActiveCell.Row & ":" & ActiveCell.Row).Delete Shift:=xlUp
End If
gegyo = ActiveCell.Row
Loop
End Sub

A 回答 (4件)

こんばんは。



ご自分で書いたのでしょうね。エラーは大した問題ではありません。ご自身で書いたものとすれば、相当の実力が潜在していると思います。テキストやHelpを見ながら続ければ、すぐに上達すると思います。後は、経験を増やしていくしかありません。
ただ、この程度は、VBAがある程度の経験者なら、コードをみて読めないといけませんけれどね。(私は、上から目線で言っているわけではありません!)


エラーの発生する箇所は、

2つ

Cells.FindNext(After:=ActiveCell).Activate 

「Cells.FindNext(After:=ActiveCell)」これは、オブジェクトでありながら、Nothing になることがあるので、エラーが発生します。(実行時エラー'91')

こちらは回避方法がないので、今のコードを維持する場合は、
 If WorksheetFunction.CountIf(Cells, dat) = 0 Then Exit Sub
こういう方法しかないと思います。

次に、

Rows(ActiveCell.Row - 1 & ":" & ActiveCell.Row - 1).Delete Shift:=xlUp

ActiveCell.Row -1
で、0 が発生すると、エラーが発生してしまいます。(実行時エラー'13':型が一致しません。)

この場合は、変数に一旦確保して、ActiveCell.Row -1が、0 になったら、1 にしてあげます。

それと、

Doの一行前の、
gegyo = ActiveCell
  ↓
gegyo = ActiveCell.Row
なのですが、これが生きてこないのです。

Help で、Find メソッドを調べてみてください。なかなか、自力ではコードを書けるものではありません。私は、未だにVBA用のテンプレートを使っています。

'-------------------------------------------
'修正後

Sub Macro1R()
Dim dat, j As Long
  dat = InputBox("検索値")
  Range("A1").Activate
  Cells.Find(What:=dat, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
  xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
  , MatchByte:=False, SearchFormat:=False).Activate
  Do
    If WorksheetFunction.CountIf(Cells, dat) = 0 Then Exit Sub 'チェック
    Cells.FindNext(After:=ActiveCell).Activate
    If dat = ActiveCell Then
      j = ActiveCell.Row - 1
      If j = 0 Then j = 1
      Rows(j & ":" & j).Delete Shift:=xlUp
      Range("A" & j).Activate
      Rows(j + 1 & ":" & j + 1).Delete Shift:=xlUp
      Rows(ActiveCell.Row & ":" & ActiveCell.Row).Delete Shift:=xlUp
    End If
  Loop
End Sub


'-------------------------------------------
'Findメソッドのパターンを使うと
'-------------------------------------------
Sub TestMMacro2()
  Dim c As Range
  Dim myRng As Range
  Dim dat As Variant
  Dim FirstAddress As String
  
  dat = Application.InputBox("検索値", Type:=2)
  If VarType(Date) = vbBoolean Or dat = "" Then Exit Sub
  
  Set c = Cells.Find( _
  What:=dat, _
  After:=ActiveCell, _
  LookIn:=xlFormulas, _
  LookAt:=xlPart) 'Excelの場合は省略が可能
  
  If Not c Is Nothing Then
    FirstAddress = c.Address
    Set myRng = c.Offset(-1).Resize(3)
    Do
      Set c = Cells.FindNext(c)
      If c.Address = FirstAddress Then Exit Do
      If c.Row > 1 Then
        Set myRng = Union(myRng, c.Offset(-1).Resize(3))
      Else
        Set myRng = Union(myRng, c.Resize(2))
      End If
    Loop Until c Is Nothing
  
  End If
  If Not myRng Is Nothing Then
    myRng.EntireRow.Delete xlUp
  End If

End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
参考にさせていただき無事に解決しました。

お礼日時:2009/10/06 16:00

変数gegyoの意味と型はなんですか


gegyo = ActiveCell
では何らかのvalue(string,integer,longなど)、activecellの値
ここでgegyoが変数宣言されてなければactivecellの値によって型が決定する
その後
If gegyo = ActiveCell.Row Then End
でgegyoがintegerかlongでなければエラーになる。
変数gegyoは何のための変数か自分でもはっきりしていないのでは

Option Explicitとして
きちんと変数宣言をするようにするようにしましょう。

さてエラーが解消した後のコード
最初のgegyo = ActiveCellがgegyo = ActiveCell.rowの間違いだと仮定すると
datと一致したセルがあったらその前後3行を削除する
その次の行がdatと一致したらまたその行前後3行を削除する...
というようなコードになっているようですが
本当にそういう意図なのでしょうか?
一致した行と前と後の3行を人塊で削除したいというようでしたらそうはならないと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
実際試してみましたが、他のエラーが発生してしまいました。
とても勉強になりましたありがとうございます。

お礼日時:2009/10/06 16:01

検索値が次々に削除されて行くのに、「次の値」がない場合の処理をちゃんとしなからエラーになるのです。



Cells.FindNext(After:=ActiveCell).Activate

の部分を

Set R = Cells.FindNext(After:=ActiveCell)
If R Is Nothing Then
End
Else
R.Activate
End If

としてみてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
参考とさせていただき、とても勉強になりましたありがとうございます。

お礼日時:2009/10/06 16:02

ロクに中身見てません、コードもテストしてません。

予想だけ

'アクティブセルオブジェクトが入ってる
gegyo = ActiveCell

'なぜかアクティブセルの行で判定してる
If gegyo = ActiveCell.Row Then End
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
参考にさせていただきましたが、解決にはなりませんでした。

お礼日時:2009/10/06 16:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!