現在仕事で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
No.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
No.3
- 回答日時:
変数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行を人塊で削除したいというようでしたらそうはならないと思います。
回答ありがとうございました。
実際試してみましたが、他のエラーが発生してしまいました。
とても勉強になりましたありがとうございます。
No.2
- 回答日時:
検索値が次々に削除されて行くのに、「次の値」がない場合の処理をちゃんとしなからエラーになるのです。
Cells.FindNext(After:=ActiveCell).Activate
の部分を
Set R = Cells.FindNext(After:=ActiveCell)
If R Is Nothing Then
End
Else
R.Activate
End If
としてみてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルマクロで教えてください 2 2022/05/04 09:07
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Excel(エクセル) マクロで列を加えたら上手くいかなくなりました。 2 2022/05/23 17:59
- Visual Basic(VBA) ワークブック内すべて検索 2 2022/12/20 20:13
- Excel(エクセル) エクセル VBA実行中のApplication.ScreenUpdatingについて 3 2023/07/13 21:06
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) 【VBA】写真の縦横比を変えずに貼り付ける 5 2023/06/13 11:42
- Visual Basic(VBA) VBA初心者です。 2 2022/10/10 11:52
- Visual Basic(VBA) VBAで実行時エラー'424' オブジェクトが必要ですと出る 2 2022/10/07 09:25
- Visual Basic(VBA) vbaでセルに入力したときに,その横にあるセルを保護し入力不可にするマクロを作りたいです。 2 2022/04/24 20:59
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行時エラー 438になった時の...
-
ACCESS2000VBAでエラー「型が一...
-
エクセルエラー13型が一致しま...
-
excel vbaでレート取得について...
-
実行時エラー3001「引数が間違...
-
ADODB.Streamを使用してUTF-8を...
-
DoEventsは意味ない?
-
なぜエラーになるのでしょうか...
-
【Excel VBA】マクロをボタンに...
-
実行時エラー '32755' [キャン...
-
マクロでのActiveSheet.Pasteで...
-
Application.ActiveInspectorで...
-
VB6+SQL サーバー 2000 で 実行...
-
実行時エラー48発生時のDLL特定...
-
EXCEL VBAマクロ中断でデバッグ...
-
テキストボックスに記述した数...
-
ExcelVBA Range クラスの Page...
-
Excel VBA で End Subのところ...
-
Outlook.ApplicationをCreateOb...
-
エクセルVBAについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー 438になった時の...
-
エクセルエラー13型が一致しま...
-
【Excel VBA】マクロをボタンに...
-
なぜこんな初歩的なVBAのIf文で...
-
マクロについて教えてください...
-
実行時エラー3001「引数が間違...
-
VBAがブレークモードになっ...
-
ExcelVBA Range クラスの Page...
-
VBSで変数の宣言はできないので...
-
VBS実行時エラー オブジェクト...
-
OLEDB.NETで接続できない
-
プロシージャ名の取得
-
EXCEL VBAマクロ中断でデバッグ...
-
ADODB.Streamを使用してUTF-8を...
-
VBAでのエラー
-
実行時エラー48発生時のDLL特定...
-
Outlook.ApplicationをCreateOb...
-
VB6+SQL サーバー 2000 で 実行...
-
実行時エラー -'-2147417848
-
「コンパイルエラー:プロシー...
おすすめ情報