• ベストアンサー

VBAで、この場合のループ処理の終了条件の記述方法がわかりません。

Excelのシート名『Pn』のなかから、変数iの文字列と一致するセルをアクティブにする というマクロを組んでみました。以下のマクロのループ処理の終了条件を、「変数iの文字列と一致するセルが見つかるまで」としたいのですが、ネットで調べても記述方法がわかりませんでした。 シート名の、nは枚数に応じて1から順に番号がつけられていて、場合によって何枚あるかは変わってきます。 『Pn』以外にもシートが色々とあるので、すべてのシートのなかからの検索は避けたいのです。 Dim i as string Dim n as integer dim FoundCell as Range i = TextBox1.Value n = 1 Do Until  終了条件  Sheets("P" & n).Activate Set FoundCell = Cells.Find(What:=i, After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, MatchByte:=False, SearchFormat:=False) n = n + 1 Loop 終了条件をどのように記述したらよいのでしょうか? 当方のパソコンは WindowsXP、 Excel2003 です。 よろしくお願いいたします。

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

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.1

Sub test01() Dim i as string Dim n As Integer Dim FoundCell As Range i = TextBox1.Value n = 1 Do Until Not FoundCell Is Nothing Sheets("P" & n).Activate On Error Resume Next Set FoundCell = Cells.Find(What:=i, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, MatchByte:=False, SearchFormat:=False) If Not FoundCell Is Nothing Then FoundCell.Select MsgBox "発見!Selectしました。" End If On Error GoTo 0 n = n + 1 Loop End Sub ではいかがでしょう?

lovensis
質問者

お礼

動作確認完了いたしました! 本当に有難うございました!!!!

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

質問には長々と説明があり、コード実例が載っているが、質問の表現の仕方が悪いと思う。 ーー エクセルVBAで「セルの値による検索!」において、終了条件はどうするのかという表現なら、質問の意味が1発で判る。 ーー (1)FindメソッドでNothing法 http://officetanaka.net/excel/vba/cell/cell11.htm (2)FindNextメソッド状態で、最初に見つかったセルにもどったことを検知法 http://www.moug.net/tech/exvba/0050116.htm があるようだ。 ーー VBAでFindを使ったらすぐぶつかる問題で、本にも解説が必ずあり、WEB照会すれば、記事が沢山でてくる問題だ。 そういう世界を広げよう。ただ初心者には、異色で難しい点だと思うが。

lovensis
質問者

お礼

ご回答有難うございます 説明のしかたについては以後気をつけます。

関連するQ&A

  • 2つの条件が一致した場合です

    下記のコードは、工事元帳複写シートのL列の金額を工事台帳に記述するものです。 Sub 工事台帳記述() Dim iRow As Long Dim FoundCell1 As Variant, FoundCell2 As Variant Dim MySheet1 As Worksheet, MySheet2 As Worksheet Set MySheet1 = Worksheets("工事台帳") Set MySheet2 = Worksheets("工事元帳複写") Set FoundCell1 = MySheet2.Range("F:F").Find(what:=MySheet1.Range("E1").Value, LookIn:=xlValues, LookAt:=xlWhole) <工事元帳複写のF列の値が工事台帳のE1に一致> Set FoundCell2 = MySheet1.Range("C14:O14").Find(what:=FoundCell1.Offset(0, 23).Value, LookIn:=xlValues, LookAt:=xlWhole) <工事台帳のC14からO14までのコードが工事元帳複写のAC列の 値と一致したら日付等を工事台帳に以下のコードで記述> iRow = MySheet1.Range("a10000").End(xlUp).Row + 1 MySheet1.Cells(iRow, 1).Value = FoundCell1.Offset(0, -4).Value MySheet1.Cells(iRow, 1).NumberFormatLocal = "m月d日" MySheet1.Cells(iRow, 2).Value = FoundCell1.Offset(0, 20).Value MySheet1.Cells(iRow + 1, 2).Value = FoundCell1.Offset(0, 21).Value FoundCell2.Offset(iRow - 14, 0).Value = FoundCell1.Offset(0, 6).Value End Sub このコードではF列の値が同一の場合には一つしか記述しません。 上記で記述した下の行につづけて表示したいのです。 ご指導お願いします

  • vba boolean変数を開放する方法

    エクセルのセルに「○○○○○○○○○○××××××××××」と入っているものをランダムに並べ代えるマクロを探してみました。 Sub macro2() Dim i, m As Integer Dim b, c As String Dim flg(1 To 20) As Boolean b = Cells(1, 1).Value Randomize For i = 1 To 20 Do m = Int(20 * Rnd + 1) If flg(m) = False Then flg(m) = True Exit Do End If Loop c = c & Mid(b, m, 1) Next i Cells(1, 2).Value = c End Sub これはうまく動くのですが、10行分やろうとして、以下のように変更すると暴走(終わらない)します。 Sub macro2() Dim i, m, n As Integer Dim b, c As String Dim flg(1 To 20) As Boolean For n = 1 To 10 b = Cells(n, 1).Value Randomize For i = 1 To 20 Do m = Int(20 * Rnd + 1) If flg(m) = False Then flg(m) = True Exit Do End If Loop c = c & Mid(b, m, 1) Next i Cells(n, 2).Value = c next n End Sub 一行目が終わってもboolean変数の値がそのまま残っているのが原因らしいのですが開放する方法がわかりません。 取りあえずもう一つマクロを追加してやりたいことはできたのですが、 Sub macro1() Dim n As Integer For n = 1 To 10 Call macro2(n) Next n End Sub Sub macro2(n As Variant) 以下略 なんかスッキリしません。 boolean変数を開放し、マクロひとつですます方法を教えて頂きたくお願いします。 flg(m) = Falseを挿入してもダメでした。

  • EXCEL2003 VBAで動作が速くなるようにマクロ記述したいのです

    EXCEL2003 VBAで動作が速くなるようにマクロ記述したいのですが、どのように行えばいいのでしょうか? Sheet1のA1からA300まで、関数によって計算されたデータが格納されています。 そのA1からA300の値(関数の計算結果のみ)を、コマンドボタンをクリックした時にSheet2のA1からA300にコピーしています。 コマンドボタンをクリックする度に、Sheet1のA1からA300までの値を、Sheet2に列を変えてコピーし、値を蓄積する方法を取っています。 以下のマクロを記述して走らせてみましたが、動作が遅いのが気になります。 コピーして貼り付けている動作が遅くなっているのでしょうか? もう少し早くなる方法はありますでしょうか? よろしくお願いします。 Sub CommandButton1_Click1() Dim I Dim N Worksheets("sheet1").Range("F1").Value = Range("F1").Value + 1 N = Worksheets("sheet1").Range("F1").Value For I = 1 To 300  Application.ScreenUpdating = False   Worksheets("sheet1").Cells(I, 1).Copy   Worksheets("sheet2").Cells(I, N).PasteSpecial Paste:=xlValues  Application.ScreenUpdating = True Next End Sub

  • 複数のオブジェクトをループで処理したい場合

    以下のような処理をしたい場合 Dim objData1 As Object Dim objData2 As Object Dim objData3 As Object Dim objData4 As Object Dim i As Integer For i=0 to 4 ここでオブジェクトの1~4を順番に処理 Next 変数iをobjData[i]の様にしたいのですが どのようにすればいいのでしょうか?

  • If Like Then条件式可変の場合の処理

    VBAにてSheet1の指定された番地にあるセルの値がSheet2のセル範囲にない場合はセルに色をつけると言うマクロを組んでいます。 Sub test() Dim i,z As Integer Dim WS As Worksheet Dim LastRow As Integer Dim Word1,Word2,Word3 As String Set WS = Worksheets("Sheet1") Word1 = WS.Cells(1,16).Value Word2 = WS.Cells(1,17).Value Word3 = WS.Cells(1,18).Value with Worksheets("Sheet2") LastRow = .Range("A" & Rows.Count).End(xlUp).Row For i = 3 To LastRow For z = 6 To 9 If .Cells(i,z).Value Like "*" & Word1 & "*" Or _ .Cells(i,z).Value Like "*" & Word2 & "*" Or _ .Cells(i,z).Value Like "*" & Word3 & "*" Then Else .Cells(i,z).Interior.ColorIndex = 6 End If Next Next End Sub 上記のマクロで変数Word1,2,3が1つだけの場合もあれば Word10まである場合も有り式を変更する必要が有ります。。 この場合、If Like 変数 Or の部分をフレキシブルに対応させる為にはどの様な式を書けば良いでしょうか(ToT)? 申し訳ありませんがご教授下さい(ToT) 宜しくお願い致します。

  • EXCEL2002 VBAのループ処理について

    セルB1~B24に入力した数字を i とすると、 コマンドボタンを押したときに、セルB1~B24にの全てに値が入力されていて、 セル( F & i )が空白であれば、そこにセルA1の値を入れるようなマクロを作成しています。 セル( F & i )への入力は、セルB1~B24の全部に数値が入力されており、セル( F & i )が空白があるときのみ処理が実行されるように。どちらかが満たされない場合には、メッセージボックスを表示し、処理しないようにしたいのですが、どうしても途中まで入力されてしまいます。 以下のようなコードですが、何か良い方法はないでしょうか? Private Sub CommandButton1_Click() 'ロール確認 Dim 入力 As String, パレット As String Dim i As Long, t As Long For i = 1 To 24 入力 = Range("B" & i) パレット = Range("F" & i) If 入力 = "" Then MsgBox "aaa" Exit For End If 'パレットNo.転記 If パレット <> "" Then MsgBox "bbb" Exit For ElseIf パレット = "" Then Range("F" & 入力).Value = Range("A1").Value End If Next i End Sub

  • エクセルのマクロで変動する範囲にコピペ

    いつもお世話になっております。 やりたいことは、 Sheet1において計算結果A1の値を変数nでとって、 (nが1以下になることはありません) A2のデータを W2からWnまで貼り付けたいのです。 そこで以下のマクロを書いてみました。 Range("A2").Select Selection.Copy Dim i As Integer Dim n As Integer n = Val(Worksheets("Sheet1").Range("A1").Value) For i = 2 To n Cells(i, 23).Select Next ActiveSheet.Paste しかし、これでは、(nが10とすると)  W10セルにしか貼り付けられません。 正しい記述方法をご教示ください。 よろしくお願いします。

  • Excel2010 VBA終了時に強制終了する

    Excel2003、2007で実行した場合は正常終了するが Excel2010で実行するとVBA終了時に強制終了します。 処理は、マクロありブックからマクロなしブックを作成するために、 新規ブックを作成しマクロありブックからシートを移動する処理です。 VBA起動は、フォームコントロールから行っています。 VBA終了時に(End Sub)後にEXCELがなぜか強制終了します。 (Microsoft Excel は動作を停止しました。のメッセージが表示される) なお、 ・フォームコントロールから実行した場合はEXCELが強制終了し、   デバックモードで実行した場合は強制終了しません。  ・マクロありファイルの種類:Excel 97-2003ブック  ・★★★のソースが含まれていると、Excelが強制終了します。 以下、ソース。 Sub ファイル保存()   'マクロなしファイルを作成 CreateNoMacroBook End Sub '←ここで異常終了が発生する。 Sub CreateNoMacroBook() Dim fname As String Dim ns As Integer Dim cnt As Integer Dim i As Integer 'マクロありブックの名前を取得 fname = ActiveWorkbook.Name 'マクロありブックのシート数を取得 cnt = ActiveWorkbook.Worksheets.Count 'すべてのシートをMoveするとエラーになるのでシートを追加 Worksheets.Add After:=Worksheets(Worksheets.Count) '新規ブック作成時のデフォルトのシート数を保管 ns = Application.SheetsInNewWorkbook '新規ブック作成時のシート数を変更 Application.SheetsInNewWorkbook = 1 '新規ブック作成 Workbooks.Add '新規ブック作成時のデフォルトのシート数に戻す Application.SheetsInNewWorkbook = ns 'マクロありブックのシートを新規ブックの"Sheet1"シートの前に移動 For i = 1 To cnt Workbooks(fname).Worksheets(1).Move Before:=Workbooks(Workbooks.Count).Worksheets("Sheet1")  '★★★ Next i '表示用に新規ブックの一枚目のシートをアクティブにする Workbooks(Workbooks.Count).Worksheets(1).Activate Application.DisplayAlerts = False '新規ブックのデフォルトシート"Sheet1"を削除する Workbooks(Workbooks.Count).Worksheets("Sheet1").Delete Workbooks(Workbooks.Count).Activate Application.DisplayAlerts = True End Sub

  • Union メソッド ?

    いつもこちらでお世話になっております。 全くのど素人で申し訳ありません。 会社でエクセル2003を使用しています。 データを一括検索したく、あるサイトでこのマクロを見つけました。 「検索結果のセルをすべて選択する」 Sub SelectTargets() Dim Target As String Dim FoundCell As Range, SearchArea As Range Dim Addr As String Dim FoundAddr() As String Dim i As Long Target = Application.InputBox("検索文字列入力", "検索", Type:=2) If Target = "False" Then Exit Sub Set SearchArea = ActiveSheet.UsedRange Set FoundCell = SearchArea.Find(what:=Target, LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) If FoundCell Is Nothing Then Exit Sub Addr = FoundCell.Address Do ReDim Preserve FoundAddr(i) '配列の内容を維持したまま再宣言 FoundAddr(i) = FoundCell.Address '検索結果のアドレスを配列に格納 Set FoundCell = SearchArea.FindNext(After:=FoundCell) i = i + 1 If FoundCell Is Nothing Then Exit Do Loop Until FoundCell.Address = Addr '配列に格納されたアドレスをカンマ区切りで結合し、セル範囲を一括選択 Range(Join(FoundAddr, ",")).Select '---(1) End Sub 補足として Rangeプロパティの引数に指定する文字列には文字数制限があるため、検索対象のセルが多いと(1)でエラーが発生します。その場合はUnionメソッドを使用して対象セルを選択すると良いでしょう。 と、補記があり調べてみると「変数Targetの文字数が255を超えたとき」エラーとなるとのこと。 「Union メソッド」をいろいろ調べて試してみたのですが… やはり、さっぱり全くできません。 ご教授いただけませんでしょうか?

  • 日付と時刻を比較して一致した行を抜き出す。

    【Sheet1】             【Sheet2】     A        B        A         B 1 2008/1/2   00:00      1 2008/1/1   22:00 2 2008/1/2   01:00      2 2008/1/1   23:00 3 2008/1/2   02:00      3 2008/1/2   00:00 4 2008/1/2   02:00      4 2008/1/2   01:00 【Sheet1】のA行セルと【Sheet2】のA行セルの文字列を比較し、 一致しない場合は【Sheet2】のセルを一つずらしA3【一致】するセルと比較するまで ループを続ける。 ※ 上記例の場合だと日付一致は【Sheet1】A1 ⇔ 【Sheet2】A3 一致した時点で一致した【Sheet1】のAセルの隣B列と比較して、 【Sheet1】の日付、時刻が一致した列を検出する。 ※ 最終的に条件が一致して抜き出すのは 結果 : 【Sheet1】のA1行 そんなマクロを作っているのですが、 何かもっと簡潔に作れるやり方ってありますでしょうか? ヒントだけでもいいのでご教授していただけたら幸いです・・。 わかりにくくてすいません; ----------------------------------------------------------------------------------------------------- Dim Com As Integer Dim Com2 As Integer Dim Storage As String Dim i As Long ' Month関数を使う Do Until Month(Cells(i, 1).Value) = 11 For Com = 1 To 100 'Com = 日付 ' 【Sheet1】の指定されたAセルが【Sheet2】の指定されたAセルが一致しているかどうか If CDate(Worksheets(Sheet1).Range("A" & Com)) = CDate(Worksheets(Sheet2).Range("A" & Com)) Then ' 一致すれば【Sheet1】のAセルの文字列をStorage変数に格納 Storage = ActiveCell.Value Else ' Falseの場合、1行改行する ActiveCell.Offset(1, 0).Select End If Next Loop ----------------------------------------------------------------------------------------------------

専門家に質問してみよう