• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:マクロ FIND 検索方向の変更)

マクロ FIND 検索方向の変更

このQ&Aのポイント
  • FINDを使用した検索方向の変更についての質問です。
  • 下から一発目に捉えられたキーワードに変更する方法を教えてください。
  • FINDの記述方法を大幅に変える必要があるのでしょうか。

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

  • ベストアンサー
  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.1

 VBE(Visual Basic Editor) のコードペインで、「Find」にカーソルを合わせ、[F1] ボタンを押下してください。  [Find メソッド] のヘルプが開きますので、[Range オブジェクトの Find メソッド] をクリックしてください。 expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat) と書かれていますので、「SearchDirection:=xlPrevious」を付加してください。 Set c = .Columns("H").Find("増", , xlValues, 1, , xlPrevious) でよろしいですかね。 #「xlValues」の後の「1」は「xlWhole」の意味かと存じますが、引数が省略できますので、途中のカンマの位置等は是正してください。  もしくは、名前付き引数を明示するのがよろしいでしょうか。。。 Set c = .Columns("H").Find(What:="増", LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlPrevious)

kero1192kero
質問者

お礼

返事が遅れてしまいすみませんでした。 FINDでF1を押したのですが、意味がさっぱり分からなくて、今回質問させて頂きました。事細かく書いて頂き、又、FINDの条件内容の数字の意味まで教えて頂きありがとうございました。

その他の回答 (1)

回答No.2

こんばんは、失礼します。 解答はすでに出ていますが、コードを読んでいると、何か、私自身、後ろめたい気持ちになるのは、いくつかは、私と同じ省略した書き方でもあるからです。すぐに自分の書き方は見分けがつきます。私の書き方は、独特の癖がありますが、良い手本とは言えません。ただ、もう今後、私は、何度ここに書けるか分かりませんので、一度、原則的な書き方を書かせていただきます。このままでは心苦しいのです。余計なおせっかいですみません。 あくまでも、「原則」です。例外であったも、コード上に問題がなければ良いです。 ・ループの中で変数の宣言をするのは、旧VB系ではしません。VB.Net ならOKです。   Dim c As Variant   Dim R As Range   Dim s As Range ・Worksheets("一覧").Cells(d, 2).Value これは、一旦、変数に取ります。  その上で、Worksheets のパラメータに入れます。 ・.Find("増", , xlValues, 1) ここは、#1さんの言う通り、名前付き引数にしたほうが、良いのですが、その書き方は、私の書き方だから、何も言えません。(^^; これは、コードの文字列を少なくするという迷信から、出たものです。VBAは、完全なインタプリタ言語ではありませんが、そう信じられていました。それで、そのような書き方になったのです。 ただし、「1」は、省略はできません。LookAt:= xlPart か xlWhole ですが、デフォルト値を持ちません。したがって、ワークシートで残っていた検索パラメータが使われてしまいます。 ・ListSh, shName など、カウンター以外の変数は、大文字・小文字を組み合わせ、入力ミスを少なくします。ちなみに、ここでは、d, e が使われていますが、カウンター変数は、i,j,k が代表的です。なぜそうするのかははっきりしませんが、iは、itinerary(巡回)からかと思います。なお、定数は、大文字を使うのが原則です。 ・今のパソコンは、32bitが種類なので、整数は、Long型が基本です。  32bitの場合、16bitのInteger型は内部で32bit変換されながらコードが実行されます。32bitのLong型はこのオーバーヘッドがない分、高速であるといわれています。 ・識別子は、なるべく単語の省略・短縮形を使わない。ただし公認のものは可能です。(sh =Sheet, c = Cells, wb = Workbook) ・変数名には、(アンダースコア「_」)を使わない。 ・リテラル値は、基本的には書かない、型宣言文字(#,!,$など)で宣言はしない。  例:× If a = 10.01# http://home.att.ne.jp/zeta/gen/excel/c04p15.htm (Excel大事典--ただし、プレフィックスは、あまり頻繁に使うのは好ましくない、とかなり前からMS側では、喚起されています。理由は、VB.Net では、IntのInteger型やLngのLong型この容量が変わりますので、今後、移植の際に混乱を来すので使わないようにする、ということです。) 後は、「VBAコードを最適化する」という名目でMSDNが出ていますので、参考にしてください。 http://msdn.microsoft.com/ja-jp/library/cc375992.aspx (元は、「Visual Basic プログラマーズガイド」という分厚い本から、抜き出された文章です。たぶん、もう手に入らないと思います。本当はこの本の97版が分かりやすいです。) VBA用ではないのですが、こうしたルールだけを書いた一冊の本がありました。しかし、出版社が倒産になり、その本も絶版になってしまいました。 以下は、位置情報など、こちらの推測で作りましたので、間違っているかもしれませんが、ここの他の何人かも、このような書き方をしていたと思います。 '// Sub Test_R()  Dim d As Long  Dim e As Long  Dim c As Variant  Dim ListSh As Worksheet  Dim editSh As Worksheet  Dim shName As String  Dim rSum As Double  d = 3 '初期値 [コメントを入れる}]  e = 3 '初期値  Set ListSh = Worksheets("一覧")  Set editSh = Worksheets("編集用一覧")  ListSh.Select  Do While ListSh.Cells(d, 2).Value <> ""   shName = ListSh.Cells(d, 2).Value 'シート名 [ここは、変数に取る]   With Worksheets(shName)    Set c = .Columns("H").Find("増", , xlValues, 1, , 2) '2=xlPrevious    If Not c Is Nothing Then      editSh.Cells(e, 4).Resize(, 2).ClearContents  '不要かもしれない      editSh.Cells(e, 4).Value = c.Offset(, -5).Value      editSh.Cells(e, 5).Value = Application.Sum(.Range(c.Offset(1, -4), .Cells(Rows.Count, "D").End(xlUp))) '本来は変数を置いたほうがよい    End If   End With   d = d + 1   e = e + 4  Loop  Set ListSh = Nothing  Set editSh = Nothing End Sub

kero1192kero
質問者

お礼

返事が遅れて申し訳ありません。 以前、回答者からF1で意味を調べて下さいとのコメントがあったので、その回答があってからは、記述例でなんだろうと思ったらとりあえずF1を押すようにしています。しかし、理解力がないせいか、いまいち分からず、記述例をそのまま使わせてもらっている事が多々あります。その点を気にしているのでしたら、こいつアホだなぁ程度に思ってください。 あと、基本的なルールを教えて頂き、ありがとうございました。しかし、覚えが悪く応用力もないので、今回のルールを有効に使いきれるか・・・です。

関連するQ&A