- ベストアンサー
マクロ FIND 検索方向の変更
- FINDを使用した検索方向の変更についての質問です。
- 下から一発目に捉えられたキーワードに変更する方法を教えてください。
- FINDの記述方法を大幅に変える必要があるのでしょうか。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
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)
その他の回答 (1)
- WindFaller
- ベストアンサー率57% (465/803)
こんばんは、失礼します。 解答はすでに出ていますが、コードを読んでいると、何か、私自身、後ろめたい気持ちになるのは、いくつかは、私と同じ省略した書き方でもあるからです。すぐに自分の書き方は見分けがつきます。私の書き方は、独特の癖がありますが、良い手本とは言えません。ただ、もう今後、私は、何度ここに書けるか分かりませんので、一度、原則的な書き方を書かせていただきます。このままでは心苦しいのです。余計なおせっかいですみません。 あくまでも、「原則」です。例外であったも、コード上に問題がなければ良いです。 ・ループの中で変数の宣言をするのは、旧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
お礼
返事が遅れて申し訳ありません。 以前、回答者からF1で意味を調べて下さいとのコメントがあったので、その回答があってからは、記述例でなんだろうと思ったらとりあえずF1を押すようにしています。しかし、理解力がないせいか、いまいち分からず、記述例をそのまま使わせてもらっている事が多々あります。その点を気にしているのでしたら、こいつアホだなぁ程度に思ってください。 あと、基本的なルールを教えて頂き、ありがとうございました。しかし、覚えが悪く応用力もないので、今回のルールを有効に使いきれるか・・・です。
お礼
返事が遅れてしまいすみませんでした。 FINDでF1を押したのですが、意味がさっぱり分からなくて、今回質問させて頂きました。事細かく書いて頂き、又、FINDの条件内容の数字の意味まで教えて頂きありがとうございました。