エクセルVBAで検索結果セル位置抽出時、実行時エラーが出ます。

このQ&Aのポイント
  • エクセルVBAで検索結果のセル位置を抽出する際に、実行時エラーが発生しています。
  • マクロを組んで検索結果のセル位置を抽出する作業を行っていますが、途中で「アプリケーション定義またはオブジェクト定義のエラーです」というエラーメッセージが表示されます。
  • エラーが発生している箇所は、検索されたセルの行番号を取得する部分です。何が原因でエラーが発生しているのか、ご教授いただけますか?
回答を見る
  • ベストアンサー

エクセルVBAで検索結果セル位置抽出時、実行時エラーが出ます。

エクセルVBAで  ・シート"log"のA列にある文字列(A1="AB<CD>EF")を2つにわけて、それぞれシート"edit"のセルに保存(A1="<CD>")(B1="EF")し  ・さらにA1セルをシート"NameList"にあるリストを元に置換する という作業をさせるマクロを組んでいるのですが、 途中で「アプリケーション定義またはオブジェクト定義のエラーです」が出て困ってます。 組んだマクロは下記の通りです。 Option Explicit Option Base 1 Sub Edit() Dim i As Integer Dim log_lastrow As Integer Dim list_lastrow As Integer Dim all As String Dim main As String Dim hn As String Dim chr() As Variant Dim j As Integer Dim k As Integer Dim chrname As String Dim cell As Range Dim line As Integer log_lastrow = 100 list_lastrow = 100 ReDim chr(list_lastrow, 4) For j = 1 To list_lastrow For k = 1 To 2 chr(j, k) = Sheets("NameList").Cells(j , k).Value Next Next For i = 1 To log_lastrow all = Sheets("log").Cells(i, 1).Value hn = Mid(all, InStr(all, "<"), (InStr(all, ">") - 2)) main = Right(all, Len(all) - InStr(all, ">")) Set cell = Sheets("NameList").Columns("A:A").Find(what:=hn, lookat:=xlWhole, MatchCase:=True, matchbyte:=True) line = Sheets("NameList").Range(cell).Row  chrname = chr(line, 2) Sheets("edit").Cells(i, 1).Value = chrname Sheets("edit").Cells(i, 2).Value = main Set cell = Nothing Next End Sub 下から7行目の line = Sheets("NameList").Range(cell).Row 1行上で検索されたセル位置情報の行番号をlineに入れようと思ったのですが、ここでエラーが出ます。何が悪いのかよろしくご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

#1です。 Set cell = Sheets("NameList").Columns("A:A").Find(what:=hn, lookat:=xlWhole, MatchCase:=True, matchbyte:=True) line = Sheets("NameList").Range(cell).Row この2行を下の6行にしてみて下さい。 Set cell = Sheets("NameList").Columns("A:A").Find(what:=hn, lookat:=xlWhole, MatchCase:=True, matchbyte:=True) If cell Is Nothing Then   MsgBox hn & "は見つかりません"   Exit Sub End If line = cell.Row 恐らく「見つかりません」メッセージが出ると思いますが如何ですか? Findは見つからない場合にNothingを返します。 変数 cell に発見した range が Set されないままでは当然 「オブジェクト変数またはwithブロック変数が設定されていない」 と言うエラーが出ます。 各シートにどんなデータが入っているか解らないので、これ以上は検証出来ませんけど。

-Kirin-
質問者

お礼

ありがとうございました。 MsgBoxのお陰で原因がNameListにあることが判明しました! お陰で、マクロ完成しました。ありがとうございました!!!

その他の回答 (2)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.3

#1です。 推測だけで書換えてみました。 シートの状況が解らないので上手く動く保障はありません。 試すならテスト環境で。 Sub Test() Dim log_lastrow As Long, i As Long, myCell As Range Dim all As String, hn As String log_lastrow = Worksheets("log").Range("A65536").End(xlUp).Row For i = 1 To log_lastrow   all = Worksheets("log").Cells(i, 1).Value   hn = Mid(all, InStr(all, "<"), (InStr(all, ">") - 2))   Set myCell = Worksheets("NameList").Columns(1).Find _          (what:=hn, lookat:=xlWhole, MatchCase:=True, matchbyte:=True)   If Not myCell Is Nothing Then     Worksheets("edit").Cells(i, 1).Value = myCell.Offset(0, 1).Value     Worksheets("edit").Cells(i, 2).Value = Right(all, Len(all) - InStr(all, ">"))   Else     Worksheets("edit").Cells(i, 1).Value = Null     Worksheets("edit").Cells(i, 2).Value = Null   End If Next i End Sub

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

通読してませんが、cell as range ですから、  line = Sheets("NameList").Range(cell.address).Row または  line = cell.Row にしたらどうなります?

-Kirin-
質問者

お礼

早速のご回答ありがとうございます。 残念ながら、いずれも、 「オブジェクト変数またはwithブロック変数が設定されていない」 と出ます。よろしくご教授願います。

関連するQ&A

  • VBAで実行時エラー'13': がでます

    初歩の初歩ですいません。 VBAで Dim A As Integer Dim B As Integer Dim C As Integer Dim gokei As Integer For i = 8 To 70 A = Cells(i, 4).Value B = Cells(i, 5).Value C = Cells(i, 6).Value goukei = A + B + C Cells(i, 7) = goukei Next i としていますが A = Cells(i, 4).Value のところで今使っているシートだと止まってしまいます。 新規でワークシートを使って仮に数字を代入すると普通に動きます。 今使っているシートもセル内には =100 と入力して 100 と表示され セルの書式設定も数値になってるんですがどうしてでしょうか?

  • VBA 実行時エラー1004(その2)

    毎度お世話になっております。 シート「sheet2」のA列のリスト内容を、シート「M_得意先」のリストからVLOOKUPして、指定のセルに書き出していくというコードを作成してみたのですが、VLOOKUPを実行する段階でエラーが出てしまいます。 少し変更して、同一シート内でのVLOOKUPは問題なく実行できたのですが...原因をご存知の方教えてください。 Dim b As String Dim endRcell2 As Long Dim cnt10 As long Sheets("sheet2").Select Sheets("sheet2").Range("A1").CurrentRegion.Select 'データ全体選択 Selection.SpecialCells(xlCellTypeLastCell).Select '最終行検出 endRcell2 = ActiveCell.Row cnt10 = 2 Do ↓実行時エラー1004が出る行 b = Application.WorksheetFunction.VLookup(Sheets("Sheet2").Range("A" & cnt10).Value, Sheets("M_得意先").Range(Cells(1, 1), Cells(endRcell, 2)), 2, False) ↑実行時エラー1004が出る行 Sheets("sheet2").Range("E" & cnt10).Value = b cnt10 = cnt10 + 1 Loop Until cnt10 = endRcell2

  • VBA 文字列の抜き出し

    VBAで文字列の抜き出しの方法を教えてください。 同様な質問があり、参考にしてみたのですがうまくいきません。 お分かりの方がいましたらご享受お願いいたします。 30~45字からなる文字列があります。 その中に特定の文字列が2つあり、そのうちの最初の特定文字列に続く文字2つ目の特定文字列前までを抜き出したいのですがうまくいきません。 具体的には abcdefghi GN=12jikl PE=fghj456 という文字列のなかから"GN="と"PE="の中間の文字を取り出したいのですが、 自分で書いたものでは"PE="以上が抜き出され、"GN="より前の文字列を抜き出せませんでした。 GN=......, PE=......の文字数はそれぞれ不規則です。また、GN=...よりも前の文字数も不規則です。 以下が作成したものです。 Dim i As Integer Dim Srch As String Dim Btwn As String Const Chr1 As String = "GN " Const Chr2 As String = "PE" Dim m As String Set sheetobj = ThisWorkbook.Worksheets("A") With sheeobj lastrow = sheetobj.Cells(sheetobj.Rows.Count, 10).End(xlUp).Row For i = 2 To lastrow Srch = sheetobj.Cells(i, 10) Btwn = Mid(Srch, InStr(Srch, Chr1) + 1, InStr(Srch, Chr2) - InStr(Srch, Chr1) - 1) sheetobj.Cells(i, 9) = Btwn Next i End With End Sub なにかいい方法があれば教えて頂けたらと思います。 よろしくお願い致します。

  • Excel VBAで検索結果を新規ブックにコピー

    Excel VBAの質問です。 コンボボックスで選択した文字列とSheet1のC列の文字列が一致したら、 その行を新規ブックのSheet1にコピーしたいのですが、うまくできません。 新規ブックは開くのですが、データはコピーされていません。 既存ブックのSheet2にはコピーできるので、たぶん、新規ブックのSheet1へコピーという 命令がうまくかけていないのだと思います。 書籍やネットで調べてもよく分かりませんでした。 大変困っているので、どなたかご教授ください。よろしくお願いします。 元のSheet1は以下のようにデータが入力されています。 例えば、コンボボックスで「めがね」と選択されたら、1,4,5行目のC列と一致するので それらの行を新規ブックにコピーしたいのです。 A B C D ----------------------------- 1|10 10:00 めがね 保管中 2|11 12:00 衣服  倉庫 3|12 13:00 自転車 保管中 4|13 11:00 めがね 保管中 5|14 13:00 めがね 倉庫 Private Sub Search_Click() Dim SearchWord As String Dim gyou As Long Dim word As String Dim LastRow As Long Dim count As Integer Dim baseBook As Workbook Dim newBook As Workbook Dim baseSheet As Worksheet Dim newSheet As Worksheet SearchWord = cmbsSyutokubutu_search.Text Set baseBook = ThisWorkbook Set baseSheet = baseB.Worksheets("Sheet1") baseSheet.Activate With Worksheets("Sheet1") count = 0 gyou = 4 LastRow = baseSheet.Cells(Rows.count, 5).End(xlUp).Row Set newB = Workbooks.Add Set newS = newBook.Worksheets("Sheet1") Do While Cells(gyou, 3) <> "" word = Cells(gyou, 3) If InStr(word, SearchWord) >= 1 Then Rows(gyou).Copy newBook.Cells(Rows.count, 1).End(xlUp).Offset(1, 0) End If gyou = gyou + 1 Loop End With End Sub

  • Excel VBAで検索する

    Excel VBAで、Sheet1に貼り付けたテキスト内から Sheet2に記載した(1列ごとの)キーワードを検索し キーワードが含まれている行をSheet3に貼り付ける処理をしているのですが、始めたばかりなので上手くいきません。 下記がソースです。 Dim moji As String Dim word As String Dim result As Integer For i = 3 To 103 For j = 2 To 21 moji = ThisWorkbook.Worksheets("Sheet1").Cells (i, 1).Value word = ThisWorkbook.Worksheets("Sheet2").Cells (j, 2).Value result = InStr(moji, word) If doResult <> 0 Then For k = 1 To 100 ThisWorkbook.Worksheets("Sheet3").Cells (k, 1).Value= moji Next k End If Next j Next i このソースでは上手くいかないのですが、どこがダメなのか分からないので、解決の糸口がつかめません。 アドバイスなどお願いします。

  • VBAを実行するとエクセルが落ちる

    同一フォルダ内にあるCSVデータを一つのエクセルにワークブックにまとめるため CSVデータを開いて、各シートに値を貼り付けるVBAを作成しました デバックモードで1行毎に実行するとエクセルが落ちることはありませんが 普通に実行するとエクセルが閉じてしまいます 原因が分からないためご指摘いただけると幸いです Win7のOffice2013です。 Sub contents() Sheets("01").Select Sheets("01").Cells.Select Selection.ClearContents Dim ShA As Worksheet Dim FileA As String Set ShA = ThisWorkbook.Sheets("01") ChDir "C:\Users\Public\Documents" FileA = "C:\Users\Public\Documents\01.csv" If FileA <> "False" Then Workbooks.OpenText Filename:=FileA, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlTextQualifierNone, Comma:=True ActiveSheet.Cells.CurrentRegion.Copy Destination:=ShA.Range("A1") ActiveWorkbook.Close False End If Set ShA = Nothing Sheets("02").Select Sheets("02").Cells.Select Selection.ClearContents Dim ShB As Worksheet Dim FileB As String Set ShB = ThisWorkbook.Sheets("02") ChDir "C:\Users\Public\Documents" FileB = "C:\Users\Public\Documents\02.csv" If FileB <> "False" Then Workbooks.OpenText Filename:=FileB, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlTextQualifierNone, Comma:=True ActiveSheet.Cells.CurrentRegion.Copy Destination:=ShB.Range("A1") ActiveWorkbook.Close False End If Set ShB = Nothing Sheets("03").Select Sheets("03").Cells.Select Selection.ClearContents Dim ShC As Worksheet Dim FileC As String Set ShC = ThisWorkbook.Sheets("03") ChDir "C:\Users\Public\Documents" FileC = "C:\Users\Public\Documents\03.csv" If FileC <> "False" Then Workbooks.OpenText Filename:=FileC, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlTextQualifierNone, Comma:=True ActiveSheet.Cells.CurrentRegion.Copy Destination:=ShC.Range("A1") ActiveWorkbook.Close False End If Set ShC = Nothing End Sub

  • VBA:実行時エラー1004

    VBAにて以下のコードを実行すると実行時エラー1004が出ます。 dim tokuisakicode as string If Not Sheets("sheet2").Range("A" & cnt2).Value = Sheets("sheet2").Range("A" & cnt2 - 1).Value Then  tokuisakicode = Sheets("Sheet2").Cells(cnt2, 1).Value ↓エラーが出る行  Sheets("A").Cells(1, cnt6).Value = tokuisakicode ↑エラーが出る行  cnt2 = cnt2 + 1  cnt6 = cnt6 + 1 Else  cnt2 = cnt2 + 1 End If エラー1004は自分の経験上記述ミスなどのケアレスミスが多いのですが、今回は原因がどうしてもわかりません。 お分かりの方みえたらお教えください。

  • EXCEL VBA:結合セルのデータを取り出すには?

    結合セルに書き込まれている文字列を取得したいのですが、 何か良い方法はありますか? 以下のような方法をとってみたのですが、 イマイチうまくいきませんでした。。。 Dim iRow as Integer Dim strData as String iRow = 1 strData = Cells(iRow, 1).MergeArea.Value どなたかご教授頂けないでしょうか? 何卒よろしくお願いします。

  • エクセルVBAでのエラー

    おはようございます。 昨日ここでいろいろ教えていただき、300のエクセルファイルから特定の範囲のデータ抽出方法を書いてみたのですが、セルが多すぎて実行できません、というエラーがでてしまいます。 これはどのように解消すればよろしいのでしょうか? Sub Test() Dim FPath1 As String, FPath2 As String Dim FName As String, myBook As String Const startROW As Long = 14, lastROW As Long = 20 Const startCOL As Long = 8, lastCOL As Long = 10 Const shtNAME As String = "sheet1" Application.ScreenUpdating = False FPath1 = "D:\MR5567\" FPath2 = "D:\New Microsoft Excel Worksheet\" Workbooks.Add myBook = ActiveWorkbook.Name FName = Dir$(FPath1 & "*.xls") Do While FName <> "" Workbooks.Open Filename:=FPath1 & FName ActiveWorkbook.Sheets.Select Sheets(1).Activate Sheets.Copy After:=Workbooks(myBook).Sheets(Sheets.Count) Workbooks(FName).Activate Application.DisplayAlerts = False ActiveWorkbook.Close FName = Dir$ Loop ActiveWorkbook.SaveAs Filename:=FPath2 & "Renketsu.xls", FileFormat:=xlNormal ActiveWorkbook.Close Application.ScreenUpdating = True End Sub

  • VBAトラブル

    Sub 百人一首一番から二十番() Dim hyakuSh As Worksheet Dim mySh As Worksheet Set mySh = Worksheets("百人一首クイズ") Set hyakuSh = Worksheets("百人一首") Dim myRow As Integer Randomize myRow = Int((21 - 2 + 1) * Rnd + 2) Dim kaminoku As String Dim kaminoku2 As String Dim kaminoku3 As String Dim simonoku As String Dim simonoku1 As String Dim sakusha As String kaminoku = hyakuSh.Cells(myRow, 3).Value kaminoku2 = hyakuSh.Cells(myRow, 4).Value kaminoku3 = hyakuSh.Cells(myRow, 5).Value shimonoku = hyakuSh.Cells(myRow, 6).Value shimonoku1 = hyakuSh.Cells(myRow, 7).Value sakusha = hyakuSh.Cells(myRow, 8).Value mySh.Activate mySh.Shapes("Text Box 2").Select Selection.Characters.Text = kaminoku & Chr(10) & kaminoku2 & Chr(10) & kaminoku3 Dim MyTBox As Integer Dim smRow As Integer Dim smRow2 As Integer Dim smRow3 As Integer Dim smRow4 As Integer Dim smRow5 As Integer Dim i As Integer mySh.Shapes(2).Select Randomize smRow5 = Int((51 - 2 + 1) * Rnd + 2) Selection.Characters.Text = hyakuSh.Cells(smRow5, 6).Value & Chr(10) & hyakuSh.Cells(smRow5, 7).Value & Chr(10) & hyakuSh.Cells(smRow5, 8).Value mySh.Shapes(3).Select Randomize smRow = Int((51 - 2 + 1) * Rnd + 2) Selection.Characters.Text = hyakuSh.Cells(smRow, 6).Value & Chr(10) & hyakuSh.Cells(smRow, 7).Value & Chr(10) & hyakuSh.Cells(smRow, 8).Value mySh.Shapes(4).Select Randomize smRow2 = Int((51 - 2 + 1) * Rnd + 2) Selection.Characters.Text = hyakuSh.Cells(smRow2, 6).Value & Chr(10) & hyakuSh.Cells(smRow2, 7).Value & Chr(10) & hyakuSh.Cells(smRow2, 8).Value mySh.Shapes(5).Select Randomize smRow3 = Int((51 - 2 + 1) * Rnd + 2) Selection.Characters.Text = hyakuSh.Cells(smRow3, 6).Value & Chr(10) & hyakuSh.Cells(smRow3, 7).Value & Chr(10) & hyakuSh.Cells(smRow3, 8).Value mySh.Shapes(6).Select Randomize smRow4 = Int((51 - 2 + 1) * Rnd + 2) Selection.Characters.Text = hyakuSh.Cells(smRow4, 6).Value & Chr(10) & hyakuSh.Cells(smRow4, 7).Value & Chr(10) & hyakuSh.Cells(smRow4, 8).Value Randomize MyTBox = Int((6 - 2 + 1) * Rnd + 2) mySh.Shapes(MyTBox).Select Selection.Characters.Text = shimonoku & Chr(10) & shimonoku1 & Chr(10) & sakusha mySh.Shapes("Text Box 2").Select Dim Ans As Integer Ans = InputBox(hyakuSh.Cells(myRow, 3).Value & hyakuSh.Cells(myRow, 4).Value & hyakuSh.Cells(myRow, 5).Value & Chr(10) & Chr(10) & "下の句を番号で答えなさい", Title:="百人一首", Xpos:=7500, Ypos:=2500) If Ans = MyTBox Then MsgBox " 正解!!! V(・ o ・)V " Else MsgBox ("間違いです!!!!!!!!" & Chr(10) & Chr(10) & hyakuSh.Cells(myRow, 6).Value & hyakuSh.Cells(myRow, 7).Value & Chr(10) & Chr(10) & sakusha & "です") End If End Sub 以上のマクロをエクセルで作ったのですが、VBE~マクロを走らせると順調に走るのですが、マクロをボタンに登録すると、Inputbox に解答を掘り込んであげないと、kaminokuもshimonokuもあたらしいものになりません 今マクロはシート上にあります、マクロを標準モジュールに移しても同じ結果です。何か解決策はありますか? かなり古くエクセル2000です、初心者なので難しいこことはわかりませんが、よろしくお願いします。

専門家に質問してみよう