質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • VB.NET

    916questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

サーチ文字列を強調

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 350

k_mail

score 57

textbox1にある文字列から、
textbox2に記入された文字を探し、フォーカスを当てます。

コードの中で使われているpの立ち位置がわかりません

質問としては、

  1. p = -Len(TextBox2.Text) + 1
    ↑これは何をしているのか?(特に"-(マイナス)"がつく理由)

  2.  p = InStr(p + Len(TextBox2.Text), TextBox1.Text, TextBox2.Text)
    ↑第1引数は何をしているのか?

です。
ご教授お願いします。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Static p As Integer
        p = -Len(TextBox2.Text) + 1
        p = InStr(p + Len(TextBox2.Text), TextBox1.Text, TextBox2.Text)

        If p <> 0 Then
            TextBox1.HideSelection = False
            TextBox1.Select(p - 1, Len(TextBox2.Text))
        Else
            p = -Len(TextBox2.Text) + 1
        End If
    End Sub
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ozwk

    2017/02/03 11:23

    あとpがStaticで宣言されている理由とか書いてありますか?

    キャンセル

  • k_mail

    2017/02/03 11:48 編集

    >"aaaa"に対して"a"をサーチしようとしたら、何回クリックしてもフォーカス当たるのは最初の一文字だけですか? →その通りです。 また、pがStaticで宣言されている理由は明記されていませんでした。

    キャンセル

  • ozwk

    2017/02/03 11:57 編集

    なんか後々のページに出てくるとかもなく?だとすればその本投げ捨てたほうがいいかもです。

    キャンセル

回答 2

checkベストアンサー

0

2. InStrの第一引数

リファレンスの記載にありますが、検索開始位置です。

1. これは何をしているのか?(特に"-(マイナス)"がつく理由)

上のコードを見た限りでは意味不明ですね...
p = -Len(TextBox2.Text) + 1
無駄な計算に見えてもそこに何かの意図があるならそれがくみ取れると思うのですがご質問のコードの断片だけをみるとそこには大した意味はくみ取れない気がします。
教科書の前後にあるコード、説明などをよくみると何か手がかりがあるかも知れません。

例えばInStrを使ってs1の中から連続してs2を探すループ処理があったとします。pを最後に見つかった位置と考えると次の位置からs2を探すならこのようなコードになります。
p = InStr(p + Len(s2), s1, s2)
これでInStrを繰り返し呼び出すと、次々にpにs2が見つかった位置が入るわけですが、そのループを開始する際に一番最初の検索位置の初期値を与えるとすると
p = -Len(s2) + 1
で与えればよいことになります。しかし上のコードではループしてないのでこんなコードを書いても冗長なだけです。

ひょっとしたらこのコードを最初に提示して次のサンプルでループを使って何かするようなものが書いてありそのベースとするためにわざわざこんなコードにしてあるのでしょうか・・・


追記:
VB.NETのstaticの意味がわからないのですが、staticといってるぐらいなのでこのサブルーチンの局所変数ではなく大域的に「p=-Len(s2)+1 の初期化だけが行われている」と解釈すべきなら上の述べたようにサブルーチンが呼び出される度にあらたな検索位置に対してフォーカスを充てるというような処理になるのだと思います。スミマセン自分はstaticの意味を正確に知らないので自信ありません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/03 11:57 編集

    参考書から断片的に抜き出したのではなく、これですべてで、完結しているのです。(泣)
    前後に続きがあるわけではありません。

    参考書は意味不明なのですが、
    KSwordOfHasteさんのご説明が私が知りたいことでわかりやすかったです。
    (参考書は無視することにします)

    キャンセル

  • 2017/02/03 12:02

    VB.NETのstaticはCのstaticとだいたい同じ意味で、
    C#で言えばプライベートメンバに相当します。

    static宣言と同時に代入すれば、それが一度だけ行われるのですが、
    このコードだとstaticである意味ないです。

    キャンセル

  • 2017/02/03 12:05 編集

    > static宣言と同時に代入すれば、それが一度だけ行われるのですが、このコードだとstaticである意味ないです。

    やはりそうですか・・・
    Static p As Integer = -Len(TextBox2.Text) + 1
    となっていれば意味があるということなんでしょうか?
    (一言たりませんでした。またも回答しつつ勉強させていただきました。コメントありがとうございます。>ozwkさん)

    キャンセル

  • 2017/02/03 12:16

    そうなってるとクリックの度に順番に移動しますね

    キャンセル

0

ここ(Strings.InStr)にある通り、第一引数は検索を開始する文字数となります。

p = -Len(TextBox2.Text) + 1
に関してですが、変数pがStaticで宣言してあったり、検索文字列が見つからなかった場合に再計算していたりと、開示されていないコードで他の使い方等があるように見受けられ、この計算がどのような意図を持つのか判断できません。
textbox1にある文字列から、textbox2に記入された文字を探し、フォーカスを当てるという仕様を満たすだけであれば、必要ありません。

想像ですが、Button1をクリックしていくことにより、選択位置を次の該当文字へと移動させるようなロジックを作成しようとしているのでしょうか?
(それでもこの計算の意図は不明ですが)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/03 11:53

    開示されていないコードはありません。
    問題集に書かれているコードなのですが、これだけで完結しています。
    (個人的には、”選択位置を次の該当文字へと移動させるようなロジックを作成”したいですが。。。)

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    vbnet 電卓作成について

    元文系プログラミング初心者 プログラミング歴 java2ヶ月、vbnet一週間のものです。 初歩的なことかもしれませんが、 ヒントでも良いので、教えてくだされば ありがた

  • 解決済

    エクセルVBA   

    Sub ie_test() 'IEテストする。 'IEの起動 Dim objIE As InternetExplorer Dim htdoc As HTMLDocument

  • 解決済

    【VBA】入力をした順番通りに文字が反映されない

    現在業務で使うエクセルの表の分類・入力を楽にするために 「セルG12~G300orI12~I300のどれか一つに『携帯ショップスタッフor本社事務or審査事務』などの求人名を入力

  • 受付中

    VB.NET 一覧表示 検索機能

    今VB.netでBMIの計算機を作る課題がありましてその中で分からない部分があります ①そのプログラムで名前などの情報を入れてその入れた情報の一覧の確認ができる ② ①で入力した情

  • 解決済

    VBA セルB6~B300を参照し、内部データの右三文字を削除したい。

    お疲れ様です。 Takkoです。 VBAで現在ツール作成をしています。 B6~B300には文字データがほかのbookからコピーされ下記のようなデータが入っています。 1

  • 解決済

    VB.netで別フォームにテキストを移す方法について

    VB.netを使用して、Form1から、Form2のTextBoxにテキストを入れる方法を教えて下さい。 なお、ネットで調べて、テスト的に以下を入力してやってみると、Form2に予

  • 解決済

    vbaにおける可視セルの選択(複数行の場合)

    質問させていただきます。 Excelでデータベースを作成中です。(来店記録のようなものです) 現在、A列に名前、B列に住所が入っており、C列には日付、D列には○か☓が必ず入る予定の

  • 受付中

    入力時点で入力チェック

    テキストボックスに文字が入力されたときに負の値が入ったときにメッセージが出るようにするには 下記のようにするといいと思うんですけれども、 Private Sub TextBox

同じタグがついた質問を見る

  • VB.NET

    916questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。