• ベストアンサー

文字列検索チェック

VB6.0について質問です。 VBからデータベースのデータを読込んでそれに応じたチェックボックスを チェックするという制御がうまくいきません。 詳細は、データは空白で区切られていて3つまでは固定された文字で送られてきます。(リンゴ バナナ オレンジ) これだけだと以下のプログラムで済むのですがこの3つ以外に不確定の文字が 入っている場合はその他にチェックを入れたいのですが どのようにプログラムを組めばよいですか? チェックは複数選択可能です。 *targetStringにデータベースからのデータが入ってきます If InStr(targetString, "リンゴ") <> 0 Then Chk1(0).Value = 1 Else Chk1(0).Value = 0 End If If InStr(targetString, "バナナ") <> 0 Then Chk1(1).Value = 1 Else Chk1(1).Value = 0 End If If InStr(targetString, "オレンジ") <> 0 Then Chk1(2).Value = 1 Else Chk1(2).Value = 0 End If

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

  • ベストアンサー
noname#223623
noname#223623
回答No.5

#1です。#2さんのコード、なかなかの力作ですね。ただ、私の意図とは少し違っているので自分でも書いてみました。VB6がないのでVBScript(WSH)ですが、私の考えはわかっていただけると思います。チェックボックスの代わりに配列で擬似的に処理しているので、適宜置き換えて読んでください。#1の対応部分をコメントで入れておきました。 'test.vbsここから Option Explicit dim targetString dim myarray, item dim Chk1 dim i targetString = "リンゴ バナナ パイナップル オレンジ" 'チェックボックスの値をすべて0にする(既に0なら不要) 'ここでは配列で擬似的にやっているので実際は書き換えが必要 Chk1 = Array(0, 0, 0, 0) myarray = split(targetString, " ") 'split関数で文字列を配列に分割 'ループ処理で配列の要素を順番に取り出す for each item in myarray WScript.echo item ' debug '値をselect caseでチェック select case item 'イチゴ、バナナ、オレンジだったら対応するチェックボックスの値を1にする case "リンゴ" : Chk1(0) = 1 case "バナナ" : Chk1(1) = 1 case "オレンジ" : Chk1(2) = 1 'それ以外ならその他のチェックボックスの値を1にする case else : Chk1(3) = 1 end select next '結果表示 for i = 0 to 3 WScript.echo "Chk1(" & i & ") => " & Chk1(i) next 'test.vbsおわり targetStringの内容をいろいろ変えて実行してもらえればなんとなくわかると思います。細かい説明をすると長くなるので書きませんが、疑問があればお答えしますので補足してください。VBで書けなくてごめんなさい。

go_osaruku
質問者

お礼

お世話になっております。 masa_peeさんの助言を参考にしましたら無事に動きました^^ 私なんかのためにここまで細かく説明してくださってありがとうございました! 心より感謝いたします。。。 またお知恵をお借りすることがあるかもしれませんが そのときはよろしくお願いします。 では本当にありがとうございました。

その他の回答 (5)

noname#22222
noname#22222
回答No.6

s_husky です。 listString = "リンゴ バナナ"=>CutStr(listString, " ", I) listString = "リンゴ,バナナ"=>CutStr(listString, ",", I) listString = "リンゴ;バナナ"=>CutStr(listString, ";", I) Private Sub Command1_Click()   Dim I      As Integer   Dim intIndex   As Integer   Dim listString  As String   Dim targetString As String     listString = "リンゴ バナナ"   Do     I = I + 1     targetString = CutStr(listString, " ", I)     If Len(targetString & "") > 0 Then       intIndex = Abs((InStr(1, targetString, "リンゴ", vbTextCompare) > 0) _            + (InStr(1, targetString, "バナナ", vbTextCompare) > 0) * 2 _            + (InStr(1, targetString, "オレンジ", vbTextCompare) > 0) * 3)       intIndex = intIndex + Abs((intIndex = 0) * 4)       Check1(0).Value = Check1(0).Value + Abs(intIndex = 1)       Check1(1).Value = Check1(1).Value + Abs(intIndex = 2)       Check1(2).Value = Check1(2).Value + Abs(intIndex = 3)       Check1(3).Value = Check1(3).Value + Abs(intIndex = 4)       DoEvents     End If   Loop Until targetString = "" End Sub こんなんでOKと思います。 listString = "リンゴ バナナ リンゴ " というデータは想定していません。

go_osaruku
質問者

お礼

ご返答ありがとうございました>< やってみたのですがやはりうまくいきませんでした。 targetString = CutStr(listString, " ", I)でエラーがはしるようです。 私の力不足でご迷惑をお掛けしました>< またお知恵を借りることがあるかもしれません。 そのときはどうぞよろしくお願いします。。。

noname#22222
noname#22222
回答No.4

s_husky です。 即答でないと役に立たないようですね! 質問者は、以下のコードを試して下さい。 そうすると、チェックボックスの値が目的通りに設定されていくのが判ると思います。 このスタイルですと、質問者のコードとの相性もいい筈です。 Check1(0) -> chk1(0) と修正 Private Sub Command1_Click()   Dim targetString As String   Dim intIndex   As Integer      Do     targetString = InputBox("targetString を入力して下さい。未入力で終了です。")     If Len(targetString & "") > 0 Then       intIndex = Abs((InStr(1, targetString, "リンゴ", vbTextCompare) > 0) _            + (InStr(1, targetString, "バナナ", vbTextCompare) > 0) * 2 _            + (InStr(1, targetString, "オレンジ", vbTextCompare) > 0) * 3)       intIndex = intIndex + Abs((intIndex = 0) * 4)       intIndex = intIndex - 1       Check1(0).Value = Abs(intIndex = 0)       Check1(1).Value = Abs(intIndex = 1)       Check1(2).Value = Abs(intIndex = 2)       Check1(3).Value = Abs(intIndex = 3)       DoEvents     End If   Loop Until targetString = "" End Sub

go_osaruku
質問者

補足

お世話になっております。 すいません補足質問なのですが s_huskyさんのやり方では複数チェックができないようです。 実行しましたら決まった値がintIndexに入り無限ループ状態になってしまいます。 複数検索チェックを実現したいのですがお知恵をおかしください><

noname#22222
noname#22222
回答No.3

s_husky です。 ちょっと、理解しにくいコードと思いますので補足です。 ? (1=1) True ? (1=0) False です。 True=-1 です。 False=0 です。 つまり、論理式を利用しています。 ※この論理式の利用は、覚えた方がいいですよ! ※If-Then文が追放できます。

noname#22222
noname#22222
回答No.2

うーん! おじさんは、ちょっと違うやり方をします。 No1さんの答えの具体例です。 GetIndexNumber の戻り値 - 1 がチェクボックスのインデックスです! Command1_Click() を試せば、 1、2、3、4 と表示される筈です。 ですから、-1すれば、チェックボックスのインデックスに一致します。 Private Sub Command1_Click()   Dim I    As Integer   Dim N    As Integer   Dim strSend As String   Dim strWord As String      strSend = "リンゴ バナナ オレンジ その他"   strWord = "Start"   Do     I = I + 1     strWord = CutStr(strSend, " ", I)     If strWord <> "" Then       MsgBox GetIndexNumber("リンゴ バナナ オレンジ", strWord)     Else       Exit Do     End If   Loop Until (0) End Sub Public Function GetIndexNumber(ByVal strList As String, ByVal strWord As String) As Integer   Dim N As Integer          N = Abs((strWord = "リンゴ") + (strWord = "バナナ") * 2 + (strWord = "オレンジ") * 3)   GetIndexNumber = N + Abs((N = 0) * 4) End Function Public Function CutStr(ByVal Text As String, _             ByVal Separator As String, _             ByVal N As Integer) As String   Dim strDatas() As String      strDatas = Split("" & Separator & Text, Separator, , 0)   CutStr = strDatas(N * Abs((N <= UBound(strDatas)))) End Function

noname#223623
noname#223623
回答No.1

えーと、InStrを使うのはまずいと思います。targetStringが"イチゴ 台湾バナナ オレンジ"でも、バナナにチェックがつきますよね。なので、ここは配列に分割して、各要素の値をチェックしたほうがいいと思います。考え方としては  * チェックボックスの値をすべて0にする(既に0なら不要)  * split関数で文字列を配列に分割  * ループ処理で配列の要素を順番に取り出す  * 値をselect caseでチェック  * イチゴ、バナナ、オレンジだったら対応するチェックボックスの値を1にする  * それ以外ならその他のチェックボックスの値を1にする でいいと思います。 ここからは余談です。怒らないで聞いてくださいね。過去の質問をいくつか拝見しましたが、あまりお礼や補足を書いていないようですね。回答する立場から言うと、リアクションのない人には答えようか迷うことがあります。感情的な理由がないとは言いませんが、それよりも質問者の技術レベルがわからないので答えにくいんです。もちろん、書くか書かないかは質問者さんの自由ですので強制は致しませんが、良い回答を期待するならなるべく書いた方がいいと思いますよ。

関連するQ&A

  • select case文について

    VB6.0のSelect Case文について質問です。 現在、ある文字列(mojiretu)の中から特定の文字を検索して その文字が文字列(mojiretu)の中に存在したらチェックボックスにチェックという一連の処理を行いたいのですがうまくいきません>< このSelect Case文のどこを直すべきでしょうか? select case mojiretu case instr(mojiretu,"abc") chk1.value=1 case instr(mojiretu,"def") chk2.value=1 case else chk3.value=1 end select

  • VBA 文字列で検索し結果をカウントする

    すいません VBAど初心者、猛勉強中の者です。 前回と同じようなご質問になりますが、応用が加わると途端に手が止まってしまいました。 どなたか教えて頂けませんでしょうか。 ※子供と大人に好きな果物、さらに好きな季節を調査をした結果です。    A列  B列    C列 1行:子供  りんご   1.春 2行:大人  バナナ   2.夏 3行:大人  バナナ   夏物 4行:子供  りんご   秋 5行:大人  りんご   3.秋 6行:子供  りんご   4.冬 7行:大人  バナナ   春    8行:子供  りんご   4.冬 9行:大人  りんご   2.夏 ・・・以下1000行まで続く というデータがあるとして、A列が「子供」かつB列が「りんご」と回答した人数は 出来たのです、以下の人数を出すことができません。 ■教えて頂きたい内容 A列が「子供」かつB列が「りんご」、かつC列が"春"または"夏"の文字列を含む人数 以下のソースですと人数が「0人」となり正確にカウント出来ません。 前回と同じような内容で恐縮ですが、応用が加わると途端に手詰まりになってしまいます。 度々の質問で申し訳ございませんがどうぞよろしくお願い致します。 --------------------------- Sub CounterMacro() Dim Counter As Integer Dim EndCount As Integer Dim Child_Apple As Integer Dim Child_AppleSeason As Integer Counter = 1 EndCount = Worksheets("Sheet1").Range("A1").End(xlDown).Row + 1 Child_Apple = 0 Child_AppleSeason = 0 Do While Counter < EndCount If Worksheets("Sheet1").Range("A" & Counter).Value = "子供" Then If Worksheets("Sheet1").Range("B" & Counter).Value = "りんご" Then Child_Apple = Child_Apple + 1 End If If Worksheets("Sheet1").Range("C" & Counter).Value = "*春* or *夏*" Then Child_AppleSeason = Child_AppleSeason + 1 '■←教えて頂きたい内容 End If End If Counter = Counter + 1 Loop MsgBox "「子供」かつ「りんご」" & Child_Apple & "人 " & "「子供」かつ「りんご」かつ「春まはた夏」" & Child_AppleSeason & "人 " End Sub

  • 下記のマクロはC列5行目から文字の

    下記のマクロはC列5行目から文字の入っている最後の行までの範囲で セル内に蜜柑や林檎、苺の文字が入っていたら同一行のA列にも蜜、林、苺 の文字を入れるというマクロなのですが・・・ たとえばC列12行目が 『蜜柑林檎苺』 となっていた場合、A列に入る言葉は『苺』となり『蜜』『林』という言葉が 消えてしまいます。 そこでこのマクロを少し改造して、 C列が『蜜柑林檎苺』や『蜜柑苺』となっている場合 A列に入る言葉は『蜜林苺』ないし『蜜苺』という風に積み重ねていくように改造はできないでしょうか? ↓この部分を改造すればできるようになりますか? Cells(i, 2).Offset(0, -1).Value = "蜜" Sub 蜜柑林檎苺() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "蜜柑") > 0 Then MsgBox i & "行目アウト!" Cells(i, 2).Offset(0, -1).Value = "蜜" End If If InStr(.Cells(i, "C"), "林檎") > 0 Then MsgBox i & "行目アウト!" Cells(i, 2).Offset(0, -1).Value = "林" End If If InStr(.Cells(i, "C"), "苺") > 0 Then MsgBox i & "行目アウト!" Cells(i, 2).Offset(0, -1).Value = "苺" End If Next i End With End Sub

  • 【VBA】「同じ文字を含むセルがあるならば」とやりたい

    こんばんは。 エクセル2003を使用しています。 例えば A1→「りんご」 A2→「りんご食べたい」 の場合、 「りんご」は2個以上あります としたいのですがうまくいきません。 Sub 重複() For 行 = 1 To Cells(65536, 1).End(xlUp).Row If Cells.Find(what:=Range("a" & 行), LookAt:=xlPart) Is Nothing Then Else 'あるならば MsgBox Range("a" & 行) & "は2個以上あります" End If Next End Sub これだと取得セルもカウントされてしまうため、必ずMsgBoxが表示されてしまいます。 どうすれば取得セル意外にも取得セルを含むセルがあるかを調べられるのでしょうか? そしてこれは A1→「りんご」 A2→「りんご食べたい」 A3→「みかん」 A4→「みかんはオレンジ」 A5→「バナナ」 ・ ・ ・ と続いており 最終的には →「りんご食べたい」 →「みかんはオレンジ」 →「バナナ」 にしたいのです。 よろしくお願いします。

  • チェックボックスの入力チェックについて

    VB.NETに関する質問です。 画面の一覧(SPREAD等)にチェックボックスがあり、 全てのチェックボックスにチェックがついているかどうかを調べたいです。 「もし一つでもチェックがついていた場合は、チェック処理から即座に抜け、 もし全てのチェックがついていない場合は、エラーメッセージを出力する」 という動作を求めています。 例えば、 For intRowIndex As integer = 0 To MaxRowCount - 1 If CBool(Cells(intRowIndex, checkboxColumn).Value) Then '' チェックがついている場合 Exit For Else If intRowIndex = MaxRowCount Then '' エラーメッセージ出力 End If End If Next という処理で求める動きは可能ですが、 もう少しスマートなロジックがないかと考えています。 どなたか教えて頂けませんでしょうか?

  • チェックボックスについて

    こんにちは。 フォームで「個人別状態」が「成約済み」の時に チェックボックスにチェックがつくようにしたいのですが、 動作しません。 どこが間違っているのでしょうか。。。 Private Sub チェック31_Click() If Me.個人別状態 = "成約済み" Then Me.チェック31.Value = False Else Me.チェック31.Value = True End If End Sub

  • チェックボックス&セレクトボックスからの検索

    htmlからチェックボックス&セレクトボックスを使って postgresで検索し、phpで表示するフォームを作っています。 チェックボックスで検索されたデータをセレクトボックスで 絞り込みたいのですがうまくいきません。 or の部分を and に変えたりしたのですが検索結果が 変わってしまいます。 どなたか教えてもらえないでしょうか。 HTML <input type="checkbox" name="chk1" value="1">chk1 <input type="checkbox" name="chk2" value="1">chk2 <select name="add">  <option value="北海道">北海道</option>  <option value="沖縄">沖縄</option> </select> PHP  if ($chk1 != "") {   $sqlSelect .= "abc = '" . $chk1 . "' or ";  }  if ($chk2 != "") {   $sqlSelect .= "abc = '" . $chk2 . "' or ";  }  if ($add != "") {   $sqlSelect .= "add = '" . $add . "' ;  }

    • ベストアンサー
    • PHP
  • 文字列の比較をしたい

    String str1 = "北海道" String str2 = "北海道" str1とstr2が同じ場合にある処理をしたい場合、比較のところの記述はどのように書けばよいのでしょうか。 単純に If str1 = str2 Then ~~~~~ Else   ~~~~ End If でよいのでしょうか。 環境はVB.NETです。

  • Access2002 チェックボックス選択→適切な言葉の表示

    アクセスで、fraで囲まれたチェックボックス.Valueの値によりtxtに表示される言葉を変更したいのですが、fraCで2,3どちらを選択しても、WXYZと表示されてしまいます。 ABCDEが表示されるにはどのようにすればよいのでしょうか? 教えて下さい。よろしくお願い致します。 'ABCDE If fraA.Value = 3 Or fraB.Value = 3 And fraC.Value = 2 Then txtXXX = "ABCDE" Else txtXXX = "" End If 'WXYZ If fraA.Value = 3 Or fraB.Value = 3 And fraC.Value = 3 Then txtXXX = "WXYZ" Else txtXXX = "" End If

  • VBA 指定文字列が出てきたら、左の文字は削除する

    お世話になっております。 Excel2003を使用しております。 指定文字列が出てきたら、左にある文字は全て削除したいと思っております。 例) 番号:0001  名前: 佐藤 太郎   趣味:散歩 ↓「名前:より左は削除」 名前: 佐藤 太郎   趣味:散歩 また、出来たら指定文字列より右にあるものも削除できたら良いなと思っております。 例) 番号:0001  名前: 佐藤 太郎   趣味:散歩 ↓「趣味:より右は削除」 番号:0001  名前: 佐藤 太郎 色々試してみています。 今後もたくさんのプログラムに使っていくことも考え、配列に入れることも考えています。 LeftDeleteMoji=Array("名前:") RightDeleteMoji=Array("趣味:") やりたいこととしては、                 (例)番号:0001  名前: 佐藤 太郎   趣味:散歩 左から指定文字列手前まで抜き出す とか    (例)「名前:」 名前: 佐藤 太郎   趣味:散歩 右から指定文字列まで抜き出す とか       (例)「趣味:」 番号:0001  名前: 佐藤 太郎 指定文字列と指定文字列の間を抜き出す とか (例)「名前:,趣味:」名前: 佐藤 太郎 があります。 A列を上から順番に行っていき、 必要ない部分はスルーして、必要な部分のみ抜き出し、 別シートに書き込む。 これを行おうと思っています。 If InStr(.Range("A" & i).Value, NeedData(Num)) > 0 And Len(.Range("A" & i).Value) > 0 then で文字列が含まれているか確認していたのですが、 配列の設定方法なのか、色々良く分からなくなってしまいまいました。 -------------------------------現在のプログラム NeedData = Array("", "名前:", "名前:", "趣味:") For i = 1 To MaxRow '重要データ保存 If Num > UBound(NeedData) Then Num = 0 End If If InStr(.Range("A" & i).Value, NeedData(Num)) > 0 And Len(.Range("A" & i).Value) > 0 Then '含む場合の動作 If NeedData(Num) = "" Then If InStr(.Range("A" & i).Value, NeedData(Num + 1)) > 0 Then EndData = InStr(.Range("A" & i).Value, NeedData(Num + 1)) ThisWorkbook.Worksheets("回答連絡メール内容").Range("A" & TESTRow) = Left(.Range("A" & i).Value, EndData - 1) '左から指定文字が出てくるまで! Num = Num + 2 TESTRow = TESTRow + 1 End If Else StartData = InStr(.Range("A" & i).Value, NeedData(Num)) + Len(NeedData(Num)) EndData = InStr(.Range("A" & i).Value, NeedData(Num + 1)) ThisWorkbook.Worksheets("回答連絡メール内容").Range("A" & TESTRow) = Mid(.Range("A" & i).Value, StartData, EndData) '左から指定文字が出てくるまで! Num = Num + 2 TESTRow = TESTRow + 1 End If End If Next ーーーーーーーーーーー------------------- 入力されているデータ(元のデータ)は決まりごとがあり、 必ずその文字データはあります。(順番も合っています) 上記プログラムは、配列が空白だったら、配列の2個目を検索して 右にある必要の無いデータは削除する。 そのような流れにしようと思っていました。 話がそれましたが、もっと良い(分かりやすい)プログラム方法がある気がします。 現状、一応完成?というところまできては居ますが、 もし、失敗した場合、どこが原因がハッキリしない感じになってしまっています。 左から指定文字列手前まで抜き出す    (例)「名前:」 名前: 佐藤 太郎   趣味:散歩 右から指定文字列まで抜き出す       (例)「趣味:」 番号:0001  名前: 佐藤 太郎 指定文字列と指定文字列の間を抜き出す (例)「名前:,趣味:」名前: 佐藤 太郎 良い方法があれば教えて下さい! よろしくお願い致します!

専門家に質問してみよう