2016-05-31 10 views
1

もしあなたが私を助けることができたら、それは本当に私を助けるだろうので、それは素晴らしいだろう。ここで (検索語)が見つかった場合は、(操作)を実行します。そうでない場合は、終了する

は私がやろうとしているものです:

  1. 検索をセルに特定の用語を
  2. 見つかった場合、セルがであることを行全体をコピーして、その上の行に貼り付けます。見つからない場合は
  3. 、何もしないし、コード

を続けてここに私のコードです:

Sub Test() 
' 
' Test Macro 
' 
' Keyboard Shortcut: Ctrl+b 
' 

    Range("A5").Select 
    Cells.Find(What:="PL 1", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ 
     :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ 
     False, SearchFormat:=False).Activate 
    If Not IsEmpty(ActiveCell.Value) Then 
     ActiveCell.Rows("1:1").EntireRow.Select 
     Selection.Copy 
     Range("A5").Select 
     ActiveSheet.Paste 
    End If 
    Range("A5").Select 
    Cells.Find(What:="PL 2", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ 
     :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ 
     False, SearchFormat:=False).Activate 
    If Not IsEmpty(ActiveCell.Value) Then 
     ActiveCell.Rows("1:1").EntireRow.Select 
     Selection.Copy 
     Range("A6").Select 
     ActiveSheet.Paste 
    End If 
    Range("A5").Select 
    Cells.Find(What:="PL 3", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ 
     :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ 
     False, SearchFormat:=False).Activate 
    If Not IsEmpty(ActiveCell.Value) Then 
     ActiveCell.Rows("1:1").EntireRow.Select 
     Selection.Copy 
     Range("A7").Select 
     ActiveSheet.Paste 
    End If 
End Sub 

私のコード値が検出された場合にのみ機能します。それが見つからないなら、それは以下のエラーに実行します:enter image description here

+2

「明らかに「機能していません。何をしているのか、どのような特定のデータ、何を期待しているのかを教えてください。あなたのためにこれをデバッグするように頼んでいるだけでなく、あなたのソースデータがどのように見えるかを知らずに、デバッグを盲目的に実行するように求めています。 –

+1

また、これは何百回もSOに依頼されています。あなた自身のコードを書くのは良いですが、なぜ車輪を再発明するのですか? – findwindow

+0

@findwindowリンクがありますか?私はそれを見つけることができません。 –

答えて

3

Cells.Findを使用して(それがNothingではないことを意味する)の範囲は、実際に設定されたことを確認し、これを行うには、関数でありますRangeオブジェクト参照を返します。何も見つからない場合、参照はNothingになります。そして、あなたはNothing.Activateを呼び出すことはできません。

この方法を一致が見つからない場合はNothingを返します。 Findメソッドは、選択またはアクティブなセルには影響しません。

Cells.Find(What:="PL 2", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ 
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ 
    False, SearchFormat:=False).Activate 

MSDN

はあなたのコードを書き換えると .Selectと.Activateを回避し、あなたが持つ Cellsコールを限定しないことによって、やっている ActiveCellと暗黙的で ActiveSheet(での作業を回避する必要があります適切なワークシート参照)。

  • 引数が
  • ネストされたメンバーの呼び出しが上がらない
  • 行継続は任意の場所にpalcedされている別の行に指定されている」:

    あなたの書式設定は難しいいくつかの理由のために、コードを読み取るようになります

    :tはと比較

をラインアップ0

これは読みやすいです。問題は、基本的にと仮定して、.Findが有効なオブジェクト参照を返すということです。 を明示的にチェックし、想定しないでください:

Set result = Cells.Find(...) 
If Not result Is Nothing Then result.Activate 

しかし、実際に、あなたは.Selectと.Activateを回避する方法を把握する必要があります。

+1

うわー。完璧な答え。これはまさに私が探していたものです。今私はどこが間違っていたか分かります。 –

+0

なぜ、.Selectと.Activateが悪いのですか? –

+0

彼らはあなたのコードを非常に脆い、従うのが難しく、無駄に遅くするためです。 *回避する方法については、[この質問(http://stackoverflow.com/q/10714251/1188513)を参照してください。[このMSDNの記事](https://msdn.microsoft.com/en-us/library) /aa139976(v=office.10).aspx)と[このブログの投稿](http://www.businessprogrammer.com/power-excel-vba-secret-avoid-using-select/)と[このOffice *理由*のためのVBAのベストプラクティスに関するブログエントリ](https://blogs.office.com/2009/03/12/excel-vba-performance-coding-best-practices/) –

3

あなたは(未テスト)の代わりにこのような何かを試すことができます。

Sub HideAndSeek() 

    Dim foundCell As Range 

    For i = 1 To 3 
     Set foundCell = Cells.Find(What:="PL " & i, LookIn:=xlFormulas, LookAt:=xlPart) 
     If Not foundCell Is Nothing Then 
      Intersect(foundCell.EntireRow, ActiveSheet.UsedRange).Offset(-1, 0).Value = _ 
       Intersect(foundCell.EntireRow, ActiveSheet.UsedRange).Value 
     End If 
     Set foundCell = Nothing 
    Next 

End Sub 

あなたが一度に必要なコードを書いた後、作成原則ビーイングあなたのためにコードを繰り返すループ。

この答えの他の部分は、細胞が見つかったことを確認している - 私たちは

If Not foundRange Is Nothing 
+0

とても助けてくれてありがとう@Macro Man!私はこれを試してみる。他の人がその問題が何であるかを知ることは難しいかもしれないと思うので、あなたのような人を持つことができます。 –

+0

あなたのコードを理解するのに少し問題があります。なぜIntersect()を使ったのですか?シンプルなコピー&ペーストに比べて、そのメリットは何ですか? –

+0

'Intersect()' findsは、2の範囲が重複するセクション(または_intersect_)を返します。一般的には、範囲の値をコピー/ペースト(クリーナーとオーバーヘッドの少ない)ではなく別の範囲に直接書き込むほうがよいでしょう。残念です_entire_行ではなく、 'Intersect'を使用して、行全体と使用範囲が重複する部分を見つけて、その値を同じ領域に書き込みます。ただし、' Offset(-1、0 ) ' –

関連する問題