<文字列を探す、InStr関数の使い方>
こんにちは、三流プログラマーKen3です。 今回は、 文字列を探すInStr関数の使い方 を軽く書きたいと思います。 へぇ〜、そうなんだぁ程度に、気楽に読んでください。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba053.lzh に test053-book.xlsが保存されています。 遊んでみてください。 /* * 1.今回のキッカケ */ [No.52 InternetExplorer.application .document.body.innerText] ( http://www.ken3.org/backno/backno_vba11.html#52 を参照) で、.body.innerTextを偶然発見し、HTMLのテキストデータの取得が出来た。 ? objIE.document.body.innerText [戻る] アクセス集計一覧 以下は当サイトのアクセス集計です。 リンク部をクリックすると該当ページへジャンプします。 順位項目カウント統計 1VBA系411 25.3% 2総合案内のページ(TOP)302 18.6% 3VBA系バックナンバー目次215 13.2% 4コンビニ166 10.2% 5愚痴系バックナンバー目次138 8.5% 6ASP系のメルマガ122 7.5% 7ASP系バックナンバー目次94 5.8% 8愚痴92 5.7% 9VB.NET(有料版)30 1.8% 10有料版メルマガ(TOP)24 1.5% 11Officeで作る(有料版)15 0.9% 12ASPで作るGame(有料版)14 0.9% 計1,623 ・ ・ ・ まで、HTML内の文字列を知ることが出来ました。 さてと、取出したいのは最後の 計1,623 ~~~~~~~ なんだよね。 計の文字でも探して見ますか。 /* * 2.文字列を探す関数、InStrを使用してみる */ 文字列を探す関数で、InStr関数があります。 構文 InStr([start, ]string1, string2[, compare]) です。 ? instr("ABCDEFABC", "BC") 2 この検索スタート位置が省略できるのが気になるけど、 Instr(検索開始,検索される文字列,探したい文字列) でOKです。 ? instr(3, "ABCDEFABC", "BC") 8 と、3を検索開始位置に指定することも出来ます。 ? instr("ABCDEFABC", "ZBC") 0 見つからなかった時は、0を返してくれます。 なかなか、使えそうですね。 ←参考画面 /* * 3.最後の「計」を探す */ 'UserFormを開く(確認用) frmINFO.txtINFO.Value = strTEXT 'TEXTを代入 frmINFO.Show 'フォームを開く と、テキストがフォームに代入されているので、 ホームにボタンを作成して、取出してみます。 Private Sub btnSETDATA_Click() 'テキストボックスから計の文字を探して抜き出す Dim nLOC As Integer '計の文字位置 Dim nSTART As Integer '検索開始位置 nLOC = 0 '初期化 nSTART = 1 '検索開始位置 Do While True '無限ループにする nSTART = InStr(nSTART + 1, Me![txtINFO], "計") '計の文字を探す If nSTART = 0 Then '見つからなかったら Exit Do 'ループを抜ける End If nLOC = nSTART '検索位置を保存 Loop If nLOC = 0 Then '1回も見つからなかったら MsgBox "「計」の文字が見つかりませんでした" Exit Sub '関数を途中で抜ける End If '数値に変換して、結果を表示する Dim strWORK As String '計の後ろを取出す Dim nKAZU As Integer '変換した数値を受け取る strWORK = Mid(Me![txtINFO], nLOC + 1, 10) '計の次から10文字取る nKAZU = CInt(strWORK) 'Cintで数値変換 MsgBox "来場者は、" & nKAZU & "です" End Sub 少し、苦労しそうなのが、 計って単語、 ・アクセス集計一覧 ・以下は当サイトのアクセス集計です。 ・順位項目カウント統計 ・計1,623 と、いろいろひっかかりそうなんです。。。 なので、一番最後の計の単語を探すために一工夫してます。 前準備で変数を初期化してます。 nLOC = 0 '初期化 nSTART = 1 '検索開始位置 無限ループを Do While True '無限ループにする で作ってます、~~~必ず条件がTrueになるような変なループです。 次に、文字を探します。 nSTART = InStr(nSTART + 1, Me![txtINFO], "計") '計の文字を探す ポイントは、前回見つけた位置+1(次の文字)から、探します。 If nSTART = 0 Then '見つからなかったら Exit Do 'ループを抜ける End If ここで、見つからなかった時(最後まで探し終わったら)、 Exit Doでループを抜けます。 見つかった時は、位置を保存します。 nLOC = nSTART '検索位置を保存 Loop この処理で、最後に見つかった位置がnLOCに保存されます。 If nLOC = 0 Then '1回も見つからなかったら MsgBox "「計」の文字が見つかりませんでした" Exit Sub '関数を途中で抜ける End If お約束の、1つも見つからなかった時のエラー処理です。 メッセージ表示後、Exit Subで関数を抜けます。 位置がわかったので、 後は、関数を駆使して(笑)、変換するだけです。 '数値に変換して、結果を表示する Dim strWORK As String '計の後ろを取出す Dim nKAZU As Integer '変換した数値を受け取る strWORK = Mid(Me![txtINFO], nLOC + 1, 10) '計の次から10文字取る nKAZU = CInt(strWORK) 'Cintで数値変換 と、あまり気にしないで変換処理を行ってます。 ←参考画面 /* * 4.一番最後なんだから、後ろから探せよ */ できる読者さんの心の声が遠くから聞こえて来たような、 「一番最後なんだから、後ろから探せよボケ」 (ボケまでは、言われないかな(笑)) さてと、得意の脈略無し解説で、余談的に書きますが、 下記のように後ろから探すって考え方もありです。 Private Sub btnP2_Click() Dim n As Integer '文字列の最後から先頭文字まで探る For n = Len(Me![txtINFO]) To 1 Step -1 '計の文字が見つかったかチェックする If Mid(Me![txtINFO], n, 1) = "計" Then Exit For Next n 'データ無しのチェック If n = 1 Then 'カウンタが1(先頭?) MsgBox "「計」の文字が見つかりませんでした" Exit Sub '関数を途中で抜ける End If '数値に変換して、結果を表示する Dim strWORK As String '計の後ろを取出す Dim nKAZU As Integer '変換した数値を受け取る strWORK = Mid(Me![txtINFO], n + 1, 10) '計の次から10文字取る nKAZU = CInt(strWORK) 'Cintで数値変換 MsgBox "来場者は、" & nKAZU & "です" End Sub たまたま、短くなったけど、 '文字列の最後から先頭文字まで探る For n = Len(Me![txtINFO]) To 1 Step -1 文字数をLen関数で数えます、それをnに代入、 Forのループは、1まで、カウンタはStep-1の指定でループ毎に−1される '計の文字が見つかったかチェックする If Mid(Me![txtINFO], n, 1) = "計" Then Exit For 1文字調べて、計ならExit Forでループを抜けます Next n なんて書いたけど、ハヤイ話、文字列の最後から1文字単位で調べてるだけです。 ループで前から調べないで、後ろから調べる方法もあります。 *たまには、ForやStep-1を使いたかったので(笑)強引に作成 その後の処理は、同じです。 /* * 5.おわりの挨拶 */ 今回は、 ・Instr関数で文字列を探す ・For文Step-1で後ろから探す でした。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba053.lzh に test053-book.xlsが保存されています。 文字列を探すのにも一苦労してました。 人間様の目で判断する能力って凄いんですよね。。。 プログラムも同じ処理でいろいろな書き方もあるし、楽しいですよね。 えっ、だから迷うんだって? いろいろと迷うのも楽しいんですよ(キットそんな日が来ますよ) 違うシンプルな処理を違う人がやってたら、参考にしたり悔しがったり、 自分はもっと簡単でハヤイルーチン作りを目指したり人それぞれ、 プログラミングで楽しんでると思います。 何か素朴な疑問などあったら、メール、掲示板に気軽に書いてください。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- [No.50 IE起動 CreateObject("InternetExplorer.application")] ( http://www.ken3.org/backno/backno_vba11.html#50 を参照) では、IEの起動方法を書きました。 [No.52 InternetExplorer.application .document.body.innerText] ( http://www.ken3.org/backno/backno_vba11.html#52 を参照) では、.document.body.innerTextでHTMLのテキストデータが取れることを少し解説 時間があったら、あわせてみて下さい。 -------------------- 読者からのお便り紹介 -------------------- In message "Internet Explorer オブジェクト", しょうもさん wrote... >[VBAで楽しくプログラミング No.052 ] 2003/01/26 ><InternetExplorer.application .document.body.innerText> >に関するコメントです。 > >> 目的のテーブル関係のオブジェクトは見つからなかったのですが > >テーブル関係のオブジェクトとは言えませんが、テーブルデータを >取り出すのなら >ITHMLElementCollection コレクション >が役立ちそうです。 > >'--------------------------------------------------------------- > Dim objElement As Object > For Each objElement In objIE.Document.all.tags(tagName:="TD") > Debug.Print objElement.innerText > Next >'--------------------------------------------------------------- > >こんなオブジェクト扱ったの今回が初めてなので、正しい記述なのか >否か分かりませんが・・・。 ---- 参考メール、いつもどうもです。 なんか面白そうなコレクションだなぁ。 次回あたりネタに加工して、偉そうに私発見しましたよ、、と発表しようかなぁ。 *えっ、ここに読者からのアドバイス載せたら、バレバレだって?あっそっか(笑) 過去のメルマガでも気がついたことあったら、みなさん気軽にメール下さい。 また、下記のようにネタにしてよ、、、とリクエストメールも気軽に。 In message "ネタにしてください", 茶坊さん wrote... >ナンバープレイスって知ってます? >9x9のマスの中に数字を埋めていく奴です > >http://www.asahi-net.or.jp/~gi5j-uehr/puzzle/ >とか >フリーソフトもいっぱいありますが・・・ > >ken3エクセルで作れませんか? >解説してください ---- なんか面白そう。 ループの解説と表のデータセット、参照など、 サンプルの例として説明したいネタが詰まっているような気がする。 それを読んだ一流読者からのアドバイスか? *またまた、いつもの深読みのし過ぎ(笑) 一流読者アレルギーの三流作者Ken3でした。
ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
気になったジャンル↓を選択してください。 人気記事(来場者が多いTOP3): Excel関係: Access関係: その他:VBAの共通関数やテキストファイルの操作など 開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う] 仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力] ※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。 |
Blogとリンク:[三流君の作業日記]/
[VBAやASPのサンプルコード]/
広告-[通販人気商品の足跡]