[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.053 文字列を探す、InStr関数の使い方

文字列を探す、InStr関数の使い方

メルマガ発行内容

<文字列を探す、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でした。

フィードバック

VBA系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.053を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります

ページフッター(リンクや広告など)


[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます


広告
-- [通販系の売れ筋広告へ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列

情報を探す

情報を探すならGoogleかな?

↓Web全体、サポート情報(support.microsoft.com)や三流君VBA(ken3.org)から検索する
Google
Web www.ken3.org
www.microsoft.com support.microsoft.com

あとは、項目別にMSでお勉強かな?
◆ マイクロソフト サイトの歩き方
◇ How-To インデックス
◇ FAQ インデックス
◇ スキルレベル別おすすめコンテンツ
◇ テクノロジ マップ
◇ テーマ別技術資料一覧

書籍の購入

Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??

コンピュータ書籍の発送がハヤイ専門店

コンピュータの本・専門店
種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり

amazon.co.jpでキーワード別チェック

下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・